tictactoe 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/tictactoe.rb +162 -160
  2. metadata +2 -2
data/lib/tictactoe.rb CHANGED
@@ -24,201 +24,203 @@ class Tictactoe
24
24
  end
25
25
  end
26
26
 
27
- def play_tictactoe
28
- display_board
29
- @start_game = interactive
30
- while @continue
31
- print "\e[2J\e[f" # clear screen
32
- case @start_game
33
- when 'y'
34
- display_board
35
- competitor_plays
36
- break if !@continue
37
- computer_plays
38
- break if !@continue
39
- when 'q'
40
- break
41
- when 'n'
42
- computer_plays
43
- display_board
44
- break if !@continue
45
- competitor_plays
46
- break if !@continue
47
- else
48
- display_board
49
- puts 'Please enter appropriate options'.red
50
- interactive
27
+ private
28
+
29
+ def play_tictactoe
30
+ display_board
31
+ @start_game = interactive
32
+ while @continue
33
+ print "\e[2J\e[f" # clear screen
34
+ case @start_game
35
+ when 'y'
36
+ display_board
37
+ competitor_plays
38
+ break if !@continue
39
+ computer_plays
40
+ break if !@continue
41
+ when 'q'
42
+ break
43
+ when 'n'
44
+ computer_plays
45
+ display_board
46
+ break if !@continue
47
+ competitor_plays
48
+ break if !@continue
49
+ else
50
+ display_board
51
+ puts 'Please enter appropriate options'.red
52
+ interactive
53
+ end
51
54
  end
52
55
  end
53
- end
54
56
 
55
- def interactive
56
- puts 'Do you want to play first? enter y/n and q to quit'.purple
57
- @start_game = gets.chomp
58
- end
59
-
60
- def computer_plays
61
- if @playing
62
- computer_moves
63
- @continue = continue_playing
57
+ def interactive
58
+ puts 'Do you want to play first? enter y/n and q to quit'.purple
59
+ @start_game = gets.chomp
64
60
  end
65
- end
66
61
 
67
- def competitor_plays
68
- if @continue
69
- puts @message
70
- move = gets.chomp
71
- play(move)
72
- @continue = continue_playing
62
+ def computer_plays
63
+ if @playing
64
+ computer_moves
65
+ @continue = continue_playing
66
+ end
73
67
  end
74
- end
75
68
 
76
- def continue_playing
77
- if (play_until_win || play_until_draw)
78
- false
79
- else
80
- true
69
+ def competitor_plays
70
+ if @continue
71
+ puts @message
72
+ move = gets.chomp
73
+ play(move)
74
+ @continue = continue_playing
75
+ end
81
76
  end
82
- end
83
77
 
84
- def play(move)
85
- if move.size > 1
86
- @playing = false
87
- @message = "Please enter appropriate move".red
88
- puts @message
89
- elsif @moves.values_at(move.to_i).first == "X" || @moves.values_at(move.to_i).first == "O"
90
- @playing = false
91
- @message = "Please choose another move, it's already taken".red
92
- puts @message
93
- elsif !is_numeric(move)
94
- @playing = false
95
- @message = "Please enter correct move".red
96
- puts @message
97
- else
98
- position = @moves.index(move.to_i)
99
- @playing = true
100
- @message = "Please enter your move".blue
101
- @moves[position] = "O"
78
+ def continue_playing
79
+ if (play_until_win || play_until_draw)
80
+ false
81
+ else
82
+ true
83
+ end
102
84
  end
103
- end
104
85
 
105
- def computer_moves
106
- temp_moves = @moves.clone
107
- temp_moves.delete("O")
108
- temp_moves.delete("X")
109
- if temp_moves.size == @moves.size
110
- @moves[4] = "X"
111
- elsif computer_best_move
112
- @computer_move = computer_best_move
113
- @moves[computer_best_move] = "X"
114
- elsif competitor_best_move
115
- @computer_move = competitor_best_move
116
- @moves[competitor_best_move] = "X"
117
- else
118
- indexes = temp_moves.inject([]) do |result, element|
119
- result << @moves.index(element)
120
- result
86
+ def play(move)
87
+ if move.size > 1
88
+ @playing = false
89
+ @message = "Please enter appropriate move".red
90
+ puts @message
91
+ elsif @moves.values_at(move.to_i).first == "X" || @moves.values_at(move.to_i).first == "O"
92
+ @playing = false
93
+ @message = "Please choose another move, it's already taken".red
94
+ puts @message
95
+ elsif !is_numeric(move)
96
+ @playing = false
97
+ @message = "Please enter correct move".red
98
+ puts @message
99
+ else
100
+ position = @moves.index(move.to_i)
101
+ @playing = true
102
+ @message = "Please enter your move".blue
103
+ @moves[position] = "O"
121
104
  end
122
- position_index = rand(0...indexes.size)
123
- values_position = indexes.values_at(position_index).first
124
- @computer_move = values_position
125
- @moves[values_position] = "X"
126
105
  end
127
- end
128
106
 
129
- def display_board
130
- board = ""
131
- @moves.each_with_index do |move, index|
132
- case move
133
- when 'X'
134
- color_moves = "#{move}".purple
135
- when 'O'
136
- color_moves = "#{move}".yellow
107
+ def computer_moves
108
+ temp_moves = @moves.clone
109
+ temp_moves.delete("O")
110
+ temp_moves.delete("X")
111
+ if temp_moves.size == @moves.size
112
+ @moves[4] = "X"
113
+ elsif computer_best_move
114
+ @computer_move = computer_best_move
115
+ @moves[computer_best_move] = "X"
116
+ elsif competitor_best_move
117
+ @computer_move = competitor_best_move
118
+ @moves[competitor_best_move] = "X"
137
119
  else
138
- color_moves = "#{move}"
120
+ indexes = temp_moves.inject([]) do |result, element|
121
+ result << @moves.index(element)
122
+ result
123
+ end
124
+ position_index = rand(0...indexes.size)
125
+ values_position = indexes.values_at(position_index).first
126
+ @computer_move = values_position
127
+ @moves[values_position] = "X"
139
128
  end
140
- new_line = (index == 3 || index == 6) ? "\n" : ""
141
- board += new_line + color_moves
142
- board += "|"
143
129
  end
144
- puts "#{board}"
145
- end
146
130
 
147
- def winner
148
- get_values.detect do |value|
149
- value.one?
131
+ def display_board
132
+ board = ""
133
+ @moves.each_with_index do |move, index|
134
+ case move
135
+ when 'X'
136
+ color_moves = "#{move}".purple
137
+ when 'O'
138
+ color_moves = "#{move}".yellow
139
+ else
140
+ color_moves = "#{move}"
141
+ end
142
+ new_line = (index == 3 || index == 6) ? "\n" : ""
143
+ board += new_line + color_moves
144
+ board += "|"
145
+ end
146
+ puts "#{board}"
150
147
  end
151
- end
152
148
 
153
- def play_until_win
154
- if winner
155
- true
156
- else
157
- false
149
+ def winner
150
+ get_values.detect do |value|
151
+ value.one?
152
+ end
158
153
  end
159
- end
160
154
 
161
- def play_until_draw
162
- unmoved = @moves.select do |move|
163
- (0..10).include?(move)
155
+ def play_until_win
156
+ if winner
157
+ true
158
+ else
159
+ false
160
+ end
164
161
  end
165
- !(unmoved.any?)
166
- end
167
162
 
168
- def get_values
169
- score_values.inject([]) do |result, v|
170
- result << @moves.values_at(v[0], v[1], v[2]).uniq
171
- result
163
+ def play_until_draw
164
+ unmoved = @moves.select do |move|
165
+ (0..10).include?(move)
166
+ end
167
+ !(unmoved.any?)
172
168
  end
173
- end
174
169
 
175
- def best_move(check_moves_of, replace_with)
176
- score_values.each do |v|
177
- result = @moves.values_at(v[0], v[1], v[2])
178
- if result.include?("#{check_moves_of}") && result.count("#{check_moves_of}") == 2
179
- result.delete("#{check_moves_of}")
180
- if result.first == "#{replace_with}"
181
- @move = nil
182
- else
183
- @move = result.first
170
+ def get_values
171
+ score_values.inject([]) do |result, v|
172
+ result << @moves.values_at(v[0], v[1], v[2]).uniq
173
+ result
174
+ end
175
+ end
176
+
177
+ def best_move(check_moves_of, replace_with)
178
+ score_values.each do |v|
179
+ result = @moves.values_at(v[0], v[1], v[2])
180
+ if result.include?("#{check_moves_of}") && result.count("#{check_moves_of}") == 2
181
+ result.delete("#{check_moves_of}")
182
+ if result.first == "#{replace_with}"
183
+ @move = nil
184
+ else
185
+ @move = result.first
186
+ end
184
187
  end
185
188
  end
189
+ @move
186
190
  end
187
- @move
188
- end
189
191
 
190
- def computer_best_move
191
- best_move('X', 'O')
192
- end
192
+ def computer_best_move
193
+ best_move('X', 'O')
194
+ end
193
195
 
194
- def competitor_best_move
195
- best_move('O', 'X')
196
- end
196
+ def competitor_best_move
197
+ best_move('O', 'X')
198
+ end
197
199
 
198
- def score_values
199
- rows = board
200
- columns = rows.transpose
201
- columns.each do |column|
202
- rows.push(column)
200
+ def score_values
201
+ rows = board
202
+ columns = rows.transpose
203
+ columns.each do |column|
204
+ rows.push(column)
205
+ end
206
+ rows.push(generate_diagonal(board))
207
+ rows.push(generate_diagonal(board.reverse))
208
+ rows
203
209
  end
204
- rows.push(generate_diagonal(board))
205
- rows.push(generate_diagonal(board.reverse))
206
- rows
207
- end
208
210
 
209
- def generate_diagonal(board)
210
- diagonals = []
211
- board.each_with_index do |element, index|
212
- diagonals << element[index]
211
+ def generate_diagonal(board)
212
+ diagonals = []
213
+ board.each_with_index do |element, index|
214
+ diagonals << element[index]
215
+ end
216
+ diagonals
213
217
  end
214
- diagonals
215
- end
216
218
 
217
- def board
218
- (0..8).each_slice(3).to_a
219
- end
219
+ def board
220
+ (0..8).each_slice(3).to_a
221
+ end
220
222
 
221
- def is_numeric(move)
222
- move.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
223
- end
223
+ def is_numeric(move)
224
+ move.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
225
+ end
224
226
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tictactoe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -37,7 +37,7 @@ files:
37
37
  - Rakefile
38
38
  - lib/tictactoe.rb
39
39
  - bin/play_tictactoe
40
- homepage: http://rubygems.org/gems/tictactoe
40
+ homepage: http://www.swathik.com/2012/10/command-line-tictactoe-game-using-ruby.html
41
41
  licenses: []
42
42
  post_install_message:
43
43
  rdoc_options: []