swttt-gem 1.0.0 → 1.1.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.
- data/VERSION +1 -1
- data/lib/board.rb +17 -12
- data/lib/minimax_computer.rb +3 -3
- data/spec/board_spec.rb +10 -10
- data/spec/game_observer_spec.rb +4 -4
- data/swttt-gem.gemspec +1 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/lib/board.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class Board
|
2
|
-
attr_reader :game_history, :player_value, :row_scores, :dimension,
|
2
|
+
attr_reader :game_history, :player_value, :row_scores, :dimension, :player_one, :player_two,
|
3
3
|
:column_scores, :left_diagonal_score, :right_diagonal_score
|
4
4
|
|
5
5
|
def initialize(dimension = 3)
|
@@ -7,18 +7,19 @@ class Board
|
|
7
7
|
@game_history, @board = [], Array.new(@dimension) {Array.new(@dimension) {0}}
|
8
8
|
@row_scores, @column_scores = Array.new(@dimension) {0}, Array.new(@dimension) {0}
|
9
9
|
@left_diagonal_score, @right_diagonal_score = 0, 0
|
10
|
+
@player_one, @player_two = 1, -1
|
10
11
|
end
|
11
12
|
|
12
13
|
def move(row, column, value = nil)
|
13
|
-
@board[row][column] = value || player_value
|
14
|
-
update_sums(row, column, value || player_value)
|
14
|
+
@board[row-1][column-1] = value || player_value
|
15
|
+
update_sums(row-1, column-1, value || player_value)
|
15
16
|
@game_history << Move.new(row, column, value || player_value)
|
16
17
|
end
|
17
18
|
|
18
19
|
def undo_move
|
19
20
|
move = @game_history.pop
|
20
|
-
update_sums(move.row, move.column, -player_value)
|
21
|
-
@board[move.row][move.column] = 0
|
21
|
+
update_sums(move.row-1, move.column-1, -player_value)
|
22
|
+
@board[move.row-1][move.column-1] = 0
|
22
23
|
end
|
23
24
|
|
24
25
|
def number_of_moves_made
|
@@ -26,11 +27,11 @@ class Board
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def value_at(row, column)
|
29
|
-
@board[row][column]
|
30
|
+
@board[row-1][column-1]
|
30
31
|
end
|
31
32
|
|
32
33
|
def is_empty_at?(row, column)
|
33
|
-
@board[row][column].zero?
|
34
|
+
@board[row-1][column-1].zero?
|
34
35
|
end
|
35
36
|
|
36
37
|
def full?
|
@@ -47,6 +48,10 @@ class Board
|
|
47
48
|
return value
|
48
49
|
end
|
49
50
|
|
51
|
+
def winner
|
52
|
+
-player_value
|
53
|
+
end
|
54
|
+
|
50
55
|
def corner_occupied?
|
51
56
|
corner_cells.each { |corner| return true if @game_history.include?(corner) }
|
52
57
|
return false
|
@@ -59,17 +64,17 @@ class Board
|
|
59
64
|
private
|
60
65
|
|
61
66
|
def corner_cells
|
62
|
-
[Move.new(
|
63
|
-
Move.new(
|
64
|
-
Move.new(@dimension
|
65
|
-
Move.new(@dimension
|
67
|
+
[Move.new(1,1),
|
68
|
+
Move.new(1,@dimension),
|
69
|
+
Move.new(@dimension,1),
|
70
|
+
Move.new(@dimension, @dimension)]
|
66
71
|
end
|
67
72
|
|
68
73
|
def update_sums(row, column, update_value)
|
69
74
|
@row_scores[row] += update_value
|
70
75
|
@column_scores[column] += update_value
|
71
76
|
@left_diagonal_score += update_value if row == column
|
72
|
-
@right_diagonal_score += update_value if row == dimension - column - 1
|
77
|
+
@right_diagonal_score += update_value if row == @dimension - column - 1
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
data/lib/minimax_computer.rb
CHANGED
@@ -40,13 +40,13 @@ private
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def middle_move
|
43
|
-
middle = @game_board.dimension/2
|
43
|
+
middle = @game_board.dimension/2 + 1
|
44
44
|
return move = Move.new(middle, middle)
|
45
45
|
end
|
46
46
|
|
47
47
|
def for_each_cell
|
48
|
-
(
|
49
|
-
(
|
48
|
+
(1..@game_board.dimension).each do |row|
|
49
|
+
(1..@game_board.dimension).each { |column| yield(row, column) }
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
data/spec/board_spec.rb
CHANGED
@@ -7,8 +7,8 @@ describe Board do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def iterate_board
|
10
|
-
(
|
11
|
-
(
|
10
|
+
(1..@my_board.dimension).each do |row|
|
11
|
+
(1..@my_board.dimension).each do |column|
|
12
12
|
yield(row, column)
|
13
13
|
end
|
14
14
|
end
|
@@ -71,13 +71,13 @@ describe Board do
|
|
71
71
|
|
72
72
|
it "can override the player_value" do
|
73
73
|
@my_board.move(1,2,1)
|
74
|
-
@my_board.move(
|
74
|
+
@my_board.move(2,2,1)
|
75
75
|
@my_board.player_value.should == 1
|
76
76
|
end
|
77
77
|
|
78
78
|
it "updates the board when move is called" do
|
79
|
-
@my_board.move(
|
80
|
-
@my_board.value_at(
|
79
|
+
@my_board.move(2,2)
|
80
|
+
@my_board.value_at(2,2).should == 1
|
81
81
|
end
|
82
82
|
|
83
83
|
it "undos the board" do
|
@@ -89,7 +89,7 @@ describe Board do
|
|
89
89
|
context "sum values" do
|
90
90
|
|
91
91
|
before do
|
92
|
-
@my_board.move(
|
92
|
+
@my_board.move(2,2)
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should update row scores" do
|
@@ -128,16 +128,16 @@ describe Board do
|
|
128
128
|
|
129
129
|
it "detects if a corner cell is occupied" do
|
130
130
|
@my_board.corner_occupied?.should be_false
|
131
|
-
@my_board.move(
|
131
|
+
@my_board.move(1,1)
|
132
132
|
@my_board.corner_occupied?.should be_true
|
133
133
|
@my_board.undo_move
|
134
|
-
@my_board.move(
|
134
|
+
@my_board.move(1,3)
|
135
135
|
@my_board.corner_occupied?.should be_true
|
136
136
|
@my_board.undo_move
|
137
|
-
@my_board.move(
|
137
|
+
@my_board.move(3,1)
|
138
138
|
@my_board.corner_occupied?.should be_true
|
139
139
|
@my_board.undo_move
|
140
|
-
@my_board.move(
|
140
|
+
@my_board.move(3,3)
|
141
141
|
@my_board.corner_occupied?.should be_true
|
142
142
|
end
|
143
143
|
|
data/spec/game_observer_spec.rb
CHANGED
@@ -9,16 +9,16 @@ describe GameObserver do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def iterate_row_or_column
|
12
|
-
(
|
12
|
+
(1..@my_board.dimension).each { |position| yield(position) }
|
13
13
|
end
|
14
14
|
|
15
15
|
it "detects a horizontal win" do
|
16
|
-
iterate_row_or_column { |column| @my_board.move(
|
16
|
+
iterate_row_or_column { |column| @my_board.move(1,column,1) }
|
17
17
|
@observer.has_winner?.should == true
|
18
18
|
end
|
19
19
|
|
20
20
|
it "detects a vertical win" do
|
21
|
-
iterate_row_or_column { |row| @my_board.move(row,
|
21
|
+
iterate_row_or_column { |row| @my_board.move(row,1,1) }
|
22
22
|
@observer.has_winner?.should == true
|
23
23
|
end
|
24
24
|
|
@@ -28,7 +28,7 @@ describe GameObserver do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it "detects a right diagonal win" do
|
31
|
-
iterate_row_or_column { |position| @my_board.move(@my_board.dimension-position
|
31
|
+
iterate_row_or_column { |position| @my_board.move(@my_board.dimension-position+1,position,1) }
|
32
32
|
@observer.has_winner?.should == true
|
33
33
|
end
|
34
34
|
|
data/swttt-gem.gemspec
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swttt-gem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Stephen Walker
|