tictactoe 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/Rakefile +8 -0
  2. data/bin/play_tictactoe +4 -0
  3. data/lib/tictactoe.rb +222 -0
  4. metadata +64 -0
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'tictactoe'
4
+ Tictactoe.new.play_game
data/lib/tictactoe.rb ADDED
@@ -0,0 +1,222 @@
1
+ require "color_text"
2
+
3
+ class Tictactoe
4
+
5
+ @@moves = (0..8).to_a
6
+ @@computer_move = 4
7
+ @@playing = true
8
+ @@message = "Please enter your move".blue
9
+ @@continue = true
10
+
11
+ def play_game
12
+ play_tictactoe
13
+ if play_until_win
14
+ who_won = winner.first == 'X' ? 'Computer' : 'You'
15
+ puts '********************'
16
+ display_board
17
+ puts "#{who_won} Won".neon
18
+ elsif play_until_draw
19
+ puts '********************'
20
+ display_board
21
+ puts "It's a draw".neon
22
+ end
23
+ end
24
+
25
+ def play_tictactoe
26
+ display_board
27
+ @start_game = interactive
28
+ while @@continue
29
+ print "\e[2J\e[f" # clear screen
30
+ case @start_game
31
+ when 'y'
32
+ display_board
33
+ competitor_plays
34
+ break if !@@continue
35
+ computer_plays
36
+ break if !@@continue
37
+ when 'q'
38
+ break
39
+ when 'n'
40
+ computer_plays
41
+ display_board
42
+ break if !@@continue
43
+ competitor_plays
44
+ break if !@@continue
45
+ else
46
+ display_board
47
+ puts 'Please enter appropriate options'.red
48
+ interactive
49
+ end
50
+ end
51
+ end
52
+
53
+ def interactive
54
+ puts 'Do you want to play first? enter y/n and q to quit'.purple
55
+ @start_game = gets.chomp
56
+ end
57
+
58
+ def computer_plays
59
+ if @@playing
60
+ computer_moves
61
+ @@continue = continue_playing
62
+ end
63
+ end
64
+
65
+ def competitor_plays
66
+ if @@continue
67
+ puts @@message
68
+ move = gets.chomp
69
+ play(move)
70
+ @@continue = continue_playing
71
+ end
72
+ end
73
+
74
+ def continue_playing
75
+ if (play_until_win || play_until_draw)
76
+ false
77
+ else
78
+ true
79
+ end
80
+ end
81
+
82
+ def play(move)
83
+ if move.size > 1
84
+ @@playing = false
85
+ @@message = "Please enter appropriate move".red
86
+ puts @@message
87
+ elsif @@moves.values_at(move.to_i).first == "X" || @@moves.values_at(move.to_i).first == "O"
88
+ @@playing = false
89
+ @@message = "Please choose another move, it's already taken".red
90
+ puts @@message
91
+ elsif !is_numeric(move)
92
+ @@playing = false
93
+ @@message = "Please enter correct move".red
94
+ puts @@message
95
+ else
96
+ position = @@moves.index(move.to_i)
97
+ @@playing = true
98
+ @@message = "Please enter your move".blue
99
+ @@moves[position] = "O"
100
+ end
101
+ end
102
+
103
+ def computer_moves
104
+ temp_moves = @@moves.clone
105
+ temp_moves.delete("O")
106
+ temp_moves.delete("X")
107
+ if temp_moves.size == @@moves.size
108
+ @@moves[4] = "X"
109
+ elsif computer_best_move
110
+ @@computer_move = computer_best_move
111
+ @@moves[computer_best_move] = "X"
112
+ elsif competitor_best_move
113
+ @@computer_move = competitor_best_move
114
+ @@moves[competitor_best_move] = "X"
115
+ else
116
+ indexes = temp_moves.inject([]) do |result, element|
117
+ result << @@moves.index(element)
118
+ result
119
+ end
120
+ position_index = rand(0...indexes.size)
121
+ values_position = indexes.values_at(position_index).first
122
+ @@computer_move = values_position
123
+ @@moves[values_position] = "X"
124
+ end
125
+ end
126
+
127
+ def display_board
128
+ board = ""
129
+ @@moves.each_with_index do |move, index|
130
+ case move
131
+ when 'X'
132
+ color_moves = "#{move}".purple
133
+ when 'O'
134
+ color_moves = "#{move}".yellow
135
+ else
136
+ color_moves = "#{move}"
137
+ end
138
+ new_line = (index == 3 || index == 6) ? "\n" : ""
139
+ board += new_line + color_moves
140
+ board += "|"
141
+ end
142
+ puts "#{board}"
143
+ end
144
+
145
+ def winner
146
+ get_values.detect do |value|
147
+ value.one?
148
+ end
149
+ end
150
+
151
+ def play_until_win
152
+ if winner
153
+ true
154
+ else
155
+ false
156
+ end
157
+ end
158
+
159
+ def play_until_draw
160
+ unmoved = @@moves.select do |move|
161
+ (0..10).include?(move)
162
+ end
163
+ !(unmoved.any?)
164
+ end
165
+
166
+ def get_values
167
+ score_values.inject([]) do |result, v|
168
+ result << @@moves.values_at(v[0], v[1], v[2]).uniq
169
+ result
170
+ end
171
+ end
172
+
173
+ def best_move(check_moves_of, replace_with)
174
+ score_values.each do |v|
175
+ result = @@moves.values_at(v[0], v[1], v[2])
176
+ if result.include?("#{check_moves_of}") && result.count("#{check_moves_of}") == 2
177
+ result.delete("#{check_moves_of}")
178
+ if result.first == "#{replace_with}"
179
+ @move = nil
180
+ else
181
+ @move = result.first
182
+ end
183
+ end
184
+ end
185
+ @move
186
+ end
187
+
188
+ def computer_best_move
189
+ best_move('X', 'O')
190
+ end
191
+
192
+ def competitor_best_move
193
+ best_move('O', 'X')
194
+ end
195
+
196
+ def score_values
197
+ rows = board
198
+ columns = rows.transpose
199
+ columns.each do |column|
200
+ rows.push(column)
201
+ end
202
+ rows.push(generate_diagonal(board))
203
+ rows.push(generate_diagonal(board.reverse))
204
+ rows
205
+ end
206
+
207
+ def generate_diagonal(board)
208
+ diagonals = []
209
+ board.each_with_index do |element, index|
210
+ diagonals << element[index]
211
+ end
212
+ diagonals
213
+ end
214
+
215
+ def board
216
+ (0..8).each_slice(3).to_a
217
+ end
218
+
219
+ def is_numeric(move)
220
+ move.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
221
+ end
222
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tictactoe
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Swathi Kantharaja
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: color_text
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.3
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.3
30
+ description: A simple tictactoe game gem to play in your terminal
31
+ email:
32
+ executables:
33
+ - play_tictactoe
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - Rakefile
38
+ - lib/tictactoe.rb
39
+ - bin/play_tictactoe
40
+ homepage: http://rubygems.org/gems/tictactoe
41
+ licenses: []
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 1.8.24
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Enter play_tictactoe command in your terminal to play
64
+ test_files: []