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
         
     |