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.
- data/Rakefile +8 -0
- data/bin/play_tictactoe +4 -0
- data/lib/tictactoe.rb +222 -0
- metadata +64 -0
data/Rakefile
ADDED
data/bin/play_tictactoe
ADDED
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: []
|