tictactoe 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []