tic_tac_doh 0.1.1 → 0.2.0
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.
- checksums.yaml +4 -4
- data/lib/tic_tac_doh.rb +64 -87
- data/lib/tic_tac_doh/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b924772e319fc4d5374b71f0e6fe6914787bcf57
|
|
4
|
+
data.tar.gz: 83f9604b459ffd185bb9fbc74b9dfc3d053b7cc5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 96686ecba3a7f20821f0b0775ad44f69b03773d60ac5ed7c7fda4fbf31d3a31478b884b2bc92a740fb3b3014283a753283cabfc8a0bd31cc3968cc419277c8a9
|
|
7
|
+
data.tar.gz: 71f905f7011e7b38a098ab0d1291d33ac92c3e7d7b75a02fd14de7e77659918cb7edfb8baf6466c46be6445604056983c3442e076a2ba63aada62825d663fbdd
|
data/lib/tic_tac_doh.rb
CHANGED
|
@@ -2,60 +2,84 @@ require 'tic_tac_doh/version'
|
|
|
2
2
|
|
|
3
3
|
module TicTacDoh
|
|
4
4
|
class Game
|
|
5
|
-
# X starts
|
|
6
|
-
# Previous winner starts new game
|
|
7
|
-
# or which turn would have followed if draw
|
|
8
5
|
|
|
9
|
-
attr_reader :players, :grid
|
|
10
|
-
attr_accessor :players
|
|
6
|
+
attr_reader :players, :grid
|
|
11
7
|
|
|
12
8
|
def initialize(args={})
|
|
13
9
|
@players = []
|
|
14
|
-
@turn =
|
|
15
|
-
# @players << args[:player1] << args[:player2]
|
|
10
|
+
@turn = 0
|
|
16
11
|
args.fetch(:board_size, 3).times do
|
|
17
12
|
@grid = Array.new(3) {}
|
|
18
13
|
end
|
|
19
14
|
end
|
|
20
15
|
|
|
16
|
+
def reset
|
|
17
|
+
prepare_grid
|
|
18
|
+
@turn = rand(0..players.count)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def next_turn(cell_position)
|
|
22
|
+
insert_player_move_in_grid(calculate_cell(cell_position))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def who_is_next
|
|
26
|
+
{ nickname: players[player_turn].nickname, mark: players[player_turn].mark }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def player_turn
|
|
30
|
+
@turn % players.count
|
|
31
|
+
end
|
|
32
|
+
|
|
21
33
|
def set_board_size(size)
|
|
22
34
|
prepare_grid(size)
|
|
23
35
|
end
|
|
24
36
|
|
|
25
|
-
def
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
player_turn ||= 0
|
|
30
|
-
until game_over
|
|
31
|
-
clear_screen
|
|
32
|
-
print_grid
|
|
33
|
-
# puts "turn: #{@turn}"
|
|
34
|
-
turn(players[player_turn])
|
|
35
|
-
player_turn = player_turn == (players.count - 1) ? 0 : player_turn + 1
|
|
36
|
-
@turn = @turn + 1 unless game_over
|
|
37
|
+
def scoreboard
|
|
38
|
+
scoreboard = []
|
|
39
|
+
players.each do |player|
|
|
40
|
+
scoreboard << { nickname: player.nickname, score: player.score }
|
|
37
41
|
end
|
|
38
|
-
|
|
39
|
-
print_grid
|
|
40
|
-
puts "Game Over"
|
|
41
|
-
# puts @turn
|
|
42
|
+
scoreboard
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
def add_player(
|
|
45
|
-
if
|
|
46
|
-
players << Player.new(
|
|
45
|
+
def add_player(args)
|
|
46
|
+
if valid_mark(args[:mark])
|
|
47
|
+
players << Player.new(args)
|
|
47
48
|
true
|
|
48
49
|
else
|
|
49
50
|
false
|
|
50
51
|
end
|
|
51
52
|
end
|
|
52
53
|
|
|
54
|
+
def game_over?
|
|
55
|
+
# Winner
|
|
56
|
+
if symbol_winner?
|
|
57
|
+
return true
|
|
58
|
+
end
|
|
59
|
+
return false unless free_cells?
|
|
60
|
+
true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def free_cells?
|
|
64
|
+
@grid.each do |row|
|
|
65
|
+
row.each do |cell|
|
|
66
|
+
return false if cell.is_a? Numeric
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def winner
|
|
73
|
+
return find_player_by(mark: symbol_winner?) if symbol_winner?
|
|
74
|
+
false
|
|
75
|
+
end
|
|
76
|
+
|
|
53
77
|
private
|
|
54
78
|
|
|
55
79
|
def valid_mark(mark)
|
|
56
|
-
players.each |player|
|
|
80
|
+
players.each do |player|
|
|
57
81
|
if player.mark == mark[0]
|
|
58
|
-
false
|
|
82
|
+
return false
|
|
59
83
|
end
|
|
60
84
|
end
|
|
61
85
|
true
|
|
@@ -73,22 +97,6 @@ module TicTacDoh
|
|
|
73
97
|
end
|
|
74
98
|
end
|
|
75
99
|
|
|
76
|
-
def game_over
|
|
77
|
-
# Winner
|
|
78
|
-
if symbol_winner?
|
|
79
|
-
return true
|
|
80
|
-
end
|
|
81
|
-
# No more free cells
|
|
82
|
-
@grid.each do |row|
|
|
83
|
-
row.each do |cell|
|
|
84
|
-
return false if cell.is_a? Numeric
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
clear_screen
|
|
88
|
-
print_grid
|
|
89
|
-
true
|
|
90
|
-
end
|
|
91
|
-
|
|
92
100
|
def symbol_winner?
|
|
93
101
|
winner_mark = nil
|
|
94
102
|
grid.length.times do |n|
|
|
@@ -102,8 +110,13 @@ module TicTacDoh
|
|
|
102
110
|
return winner_mark
|
|
103
111
|
end
|
|
104
112
|
|
|
113
|
+
def find_player_by(args={})
|
|
114
|
+
players.each { |player| return { nickname: player.nickname, mark: player.mark } if player.mark == args[:mark] }
|
|
115
|
+
false
|
|
116
|
+
end
|
|
117
|
+
|
|
105
118
|
def secuential_mark(mark, row, col, row_step, col_step, counter=1)
|
|
106
|
-
return nil unless
|
|
119
|
+
return nil unless within_grid_range?(row, col)
|
|
107
120
|
if grid[row][col] == mark
|
|
108
121
|
return grid[row][col] if counter == 3
|
|
109
122
|
return secuential_mark(mark, row + row_step, col + col_step, row_step, col_step, counter+1)
|
|
@@ -112,7 +125,7 @@ module TicTacDoh
|
|
|
112
125
|
end
|
|
113
126
|
end
|
|
114
127
|
|
|
115
|
-
def
|
|
128
|
+
def within_grid_range? (arg, col)
|
|
116
129
|
if arg.is_a? Hash
|
|
117
130
|
return true if arg[:row] < grid.length && arg[:col] < grid.length if arg[:row] >= 0 && arg[:col] >= 0
|
|
118
131
|
else
|
|
@@ -121,28 +134,6 @@ module TicTacDoh
|
|
|
121
134
|
false
|
|
122
135
|
end
|
|
123
136
|
|
|
124
|
-
def print_grid
|
|
125
|
-
grid.each do |row|
|
|
126
|
-
puts row.join('|')
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def turn(player)
|
|
131
|
-
player_action player
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def player_action (player)
|
|
135
|
-
valid_move = false
|
|
136
|
-
until valid_move == true do
|
|
137
|
-
position = calculate_cell(player_move player)
|
|
138
|
-
valid_move = insert_player_move_in_grid(position, player_mark(player))
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def clear_screen
|
|
143
|
-
# system 'clear' or system 'cls'
|
|
144
|
-
end
|
|
145
|
-
|
|
146
137
|
def calculate_cell(cell_number)
|
|
147
138
|
row = 0
|
|
148
139
|
for n in 0..cell_number
|
|
@@ -152,26 +143,18 @@ module TicTacDoh
|
|
|
152
143
|
{row: row, column: column}
|
|
153
144
|
end
|
|
154
145
|
|
|
155
|
-
def insert_player_move_in_grid(position
|
|
146
|
+
def insert_player_move_in_grid(position)
|
|
156
147
|
return false unless valid_move? position
|
|
157
|
-
@grid[position[:row]][position[:column]] = mark
|
|
148
|
+
@grid[position[:row]][position[:column]] = who_is_next[:mark]
|
|
149
|
+
@turn += 1
|
|
158
150
|
true
|
|
159
151
|
end
|
|
160
152
|
|
|
161
153
|
def valid_move?(position)
|
|
162
|
-
return false if position[:row] < 0 || position[:row] > (@grid.length) -1
|
|
163
|
-
return false if position[:column] < 0 || position[:column] > (@grid.length) -1
|
|
154
|
+
return false if position[:row] < 0 || position[:row] > (@grid.length) - 1
|
|
155
|
+
return false if position[:column] < 0 || position[:column] > (@grid.length) - 1
|
|
164
156
|
return false unless @grid[position[:row]][position[:column]].is_a? Numeric
|
|
165
157
|
true
|
|
166
|
-
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def player_move(player)
|
|
170
|
-
player.move()
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def player_mark(player)
|
|
174
|
-
player.mark
|
|
175
158
|
end
|
|
176
159
|
end
|
|
177
160
|
|
|
@@ -184,12 +167,6 @@ module TicTacDoh
|
|
|
184
167
|
@mark = args[:mark]
|
|
185
168
|
end
|
|
186
169
|
|
|
187
|
-
def move()
|
|
188
|
-
puts "#{self.mark} turn "
|
|
189
|
-
puts "Pick a position"
|
|
190
|
-
gets.chomp.to_i
|
|
191
|
-
end
|
|
192
|
-
|
|
193
170
|
def add_to_score(score)
|
|
194
171
|
@score += score
|
|
195
172
|
end
|
data/lib/tic_tac_doh/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tic_tac_doh
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- David Cuadra Quevedo
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-04-
|
|
11
|
+
date: 2015-04-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|