tic_tac_toe_nhu 0.0.11 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 47abe0e371c9ceb90b20c8aab57c555578eb85d2
4
- data.tar.gz: 83d834d4f04337e278a19bea6114e582ade53a38
3
+ metadata.gz: 76f4600254a71f4f37fe5efa7f74a8000b5d7b35
4
+ data.tar.gz: 81f2f459fa5e1a867e053d42f5dfdfe2ae4dc27f
5
5
  SHA512:
6
- metadata.gz: 42ec301ab22138675081262882b8f95ba77a77dd4be6a62b0f65475288d63a5f8982993adc0c1f7e914afe114cac08922776e38c8f92e5d455b3f0c116eeb290
7
- data.tar.gz: fa35df90dabda57091a2eae86e637c05334c953af8430cc47bda707e33c2e54297ddf11c2163729eea1ba2ed8af8f90178f94c69ee8c7c74acb82454d86bae99
6
+ metadata.gz: 5eae5eeee50f815eaac5fb338c1aba07e9d54ad669cd179f6a333ef4b693aa333145b12825f61696eab943103b1934f4ca101e10f7bff4c10f9e702bc54a3912
7
+ data.tar.gz: b9e661172ad637011bd6b36e7a0ce4cb5a56bf17f114277b9e1da7ad57bc4d03f29269e6c7328d8fd8d147b44fc39b3b7feae7d9bd8cbe7004ee8f8a4665ca98
data/bin/tic_tac_toe CHANGED
@@ -2,5 +2,5 @@
2
2
  $LOAD_PATH << File.expand_path('../../lib', __FILE__)
3
3
  require 'tic_tac_toe/runner'
4
4
 
5
- runner = TicTacToe::Runner.new
6
- runner.start
5
+ game = TicTacToe::Runner.new
6
+ game.start
@@ -5,56 +5,35 @@
5
5
  1,
6
6
  1,
7
7
  1,
8
- null,
9
- 1,
10
- 1,
11
- 1,
12
- 13,
13
- null,
14
- null,
15
- 1,
16
- 6,
17
- null,
18
- null,
19
- 1,
20
- 6,
21
- null,
22
- 2,
23
- null,
24
- 1,
25
- null,
26
- 1,
27
- null,
28
- 1,
29
- null,
30
8
  1,
31
9
  null,
32
- null,
33
- null,
34
10
  1,
35
11
  1,
36
12
  1,
13
+ 11,
37
14
  null,
38
15
  null,
39
16
  1,
40
- 2,
17
+ 11,
18
+ 11,
41
19
  null,
42
20
  null,
43
21
  1,
44
- 1,
22
+ 5,
45
23
  null,
24
+ 5,
25
+ 4,
26
+ 4,
27
+ 4,
46
28
  null,
47
29
  1,
48
- 1,
49
30
  null,
50
31
  null,
51
- 1,
52
- 5,
53
- null,
54
32
  null,
55
33
  null
56
34
  ],
57
35
  "/Users/nhunguyen/Documents/Ruby/tictactoe/lib/tic_tac_toe/game.rb": [
36
+ 1,
58
37
  1,
59
38
  null,
60
39
  1,
@@ -62,26 +41,25 @@
62
41
  1,
63
42
  null,
64
43
  1,
65
- 19,
66
- 19,
67
- 19,
68
- 19,
44
+ 17,
45
+ 17,
46
+ 17,
69
47
  null,
70
48
  null,
71
49
  1,
72
- 7,
73
- 7,
74
- 5,
75
- 5,
76
- null,
50
+ 2,
77
51
  null,
78
52
  null,
79
53
  1,
80
- 4,
54
+ 3,
81
55
  null,
82
56
  null,
83
57
  1,
84
- 3,
58
+ 11,
59
+ 11,
60
+ 9,
61
+ 9,
62
+ null,
85
63
  null,
86
64
  null,
87
65
  1,
@@ -90,9 +68,11 @@
90
68
  null,
91
69
  null,
92
70
  1,
93
- 3,
94
- 2,
71
+ 8,
72
+ null,
95
73
  null,
74
+ 1,
75
+ 9,
96
76
  null,
97
77
  null,
98
78
  null
@@ -104,52 +84,59 @@
104
84
  null,
105
85
  1,
106
86
  1,
87
+ null,
107
88
  1,
108
- 1,
109
- 12,
110
- 12,
111
- 12,
89
+ 10,
90
+ 10,
112
91
  null,
113
92
  null,
114
93
  1,
115
- 12,
116
- 12,
117
- 12,
118
- 12,
119
- 12,
94
+ 10,
95
+ 10,
96
+ 10,
97
+ 10,
98
+ 10,
120
99
  null,
121
100
  null,
122
101
  1,
123
102
  1,
124
- 13,
125
- 13,
126
- 13,
103
+ null,
127
104
  1,
105
+ 11,
106
+ 11,
107
+ 11,
128
108
  1,
109
+ 1,
110
+ null,
129
111
  null,
130
112
  null,
113
+ 1,
114
+ 3,
115
+ 3,
116
+ 3,
117
+ null,
131
118
  null,
132
119
  1,
133
- 7,
134
- 7,
135
- 7,
136
- 7,
137
- 7,
120
+ 4,
121
+ 4,
138
122
  1,
139
123
  1,
140
124
  null,
141
125
  null,
142
126
  null,
143
127
  1,
144
- 12,
145
- 12,
146
- 11,
147
- null,
128
+ 10,
129
+ 10,
148
130
  1,
149
131
  null,
132
+ 9,
150
133
  null,
151
134
  null,
152
135
  null,
136
+ 1,
137
+ 13,
138
+ null,
139
+ null,
153
140
  null
154
141
  ],
155
142
  "/Users/nhunguyen/Documents/Ruby/tictactoe/lib/tic_tac_toe/ui/console.rb": [
@@ -228,6 +215,6 @@
228
215
  null
229
216
  ]
230
217
  },
231
- "timestamp": 1375736808
218
+ "timestamp": 1376342502
232
219
  }
233
220
  }
@@ -47,7 +47,7 @@ module TicTacToe
47
47
  result = []
48
48
  (0...size).each do |col|
49
49
  result << squares.values_at(* squares.each_index.select do |i|
50
- (col - i) % size == 0
50
+ (col - i) % 3 == 0
51
51
  end)
52
52
  end
53
53
  result
@@ -1,41 +1,43 @@
1
+ require 'tic_tac_toe/board'
1
2
  require 'tic_tac_toe/rules'
2
3
 
3
4
  module TicTacToe
4
5
  class Game
5
- attr_reader :current_player, :board
6
+ attr_reader :board, :current_player
6
7
 
7
- def initialize(board, player1, player2)
8
+ def initialize(players, board = TicTacToe::Board.new)
8
9
  @board = board
9
- @current_player = @player1 = player1
10
- @player2 = player2
11
- @rules = TicTacToe::Rules.new(@board)
10
+ @players = players
11
+ @current_player = players[0]
12
12
  end
13
13
 
14
- def make_move(*move) #rename to make player move
15
- player_move = move[0] || @current_player.move
14
+ def game_over?
15
+ rules.game_over?
16
+ end
17
+
18
+ def winner
19
+ player(rules.winner)
20
+ end
21
+
22
+ def make_player_move(*move)
23
+ player_move = move[0] || @current_player.move(board)
16
24
  if player_move
17
25
  @board.mark(player_move, @current_player.value)
18
26
  change_player
19
27
  end
20
28
  end
21
29
 
22
- def over?
23
- @rules.game_over?
30
+ private
31
+ def rules
32
+ @rules ||= TicTacToe::Rules.new(board)
24
33
  end
25
34
 
26
- def winner
27
- player(@rules.winner)
35
+ def player(value)
36
+ @players.detect {|p| p.value == value}
28
37
  end
29
38
 
30
- private
31
39
  def change_player
32
- @current_player = (@current_player == @player1) ? @player2 : @player1
40
+ @current_player = (@players[0] == @current_player)? @players[1] : @players[0]
33
41
  end
34
-
35
- def player(mark)
36
- return @player1 if mark == @player1.value
37
- return @player2 if mark == @player2.value
38
- end
39
-
40
42
  end
41
43
  end
@@ -1,6 +1,7 @@
1
1
  require 'tic_tac_toe/game'
2
2
  require 'tic_tac_toe/board'
3
3
  require 'tic_tac_toe/player_factory'
4
+ require 'tic_tac_toe/values'
4
5
 
5
6
  module TicTacToe
6
7
  class GameFactory
@@ -9,43 +10,20 @@ module TicTacToe
9
10
  end
10
11
 
11
12
  def types
12
- [[:human, :computer], [:computer, :human], [:human, :human], [:computer, :computer]]
13
+ player_types = @player_factory.types
14
+ player_types.product player_types
13
15
  end
14
16
 
15
- def create(type_index, board)
16
- case type_index
17
- when 1
18
- human_computer_game(board)
19
- when 2
20
- computer_human_game(board)
21
- when 3
22
- human_human_game(board)
23
- when 4
24
- computer_computer_game(board)
17
+ def create(game_type)
18
+ player_types = types[game_type-1]
19
+
20
+ if player_types
21
+ player1 = @player_factory.create(player_types[0], TicTacToe::VALUES[0])
22
+ player2 = @player_factory.create(player_types[1], TicTacToe::VALUES[1])
23
+ TicTacToe::Game.new([player1, player2])
25
24
  else
26
- raise ArgumentError, "Type does not exist. Please select a number corresponding to the game type."
25
+ raise ArgumentError, "Type #{game_type} does not exist. Please select a number corresponding to the game type."
27
26
  end
28
27
  end
29
-
30
- private
31
- def computer_human_game(board)
32
- create_game(board, @player_factory.computer(board), @player_factory.human)
33
- end
34
-
35
- def human_computer_game(board)
36
- create_game(board, @player_factory.human, @player_factory.computer(board))
37
- end
38
-
39
- def human_human_game(board)
40
- create_game(board, @player_factory.human, @player_factory.human("Friend", "O"))
41
- end
42
-
43
- def computer_computer_game(board)
44
- create_game(board, @player_factory.computer(board, "X", "O"), @player_factory.computer(board, "O", "X"))
45
- end
46
-
47
- def create_game(board, player1, player2)
48
- TicTacToe::Game.new(board, player1, player2)
49
- end
50
28
  end
51
29
  end
@@ -8,8 +8,8 @@ module TicTacToe
8
8
  @strategy = strategy
9
9
  end
10
10
 
11
- def move
12
- @strategy.move
11
+ def move(board)
12
+ strategy.move(board)
13
13
  end
14
14
  end
15
15
  end
@@ -1,16 +1,31 @@
1
1
  require 'tic_tac_toe/strategy/minimax'
2
2
  require 'tic_tac_toe/strategy/console_user'
3
3
  require 'tic_tac_toe/player'
4
+ require 'tic_tac_toe/values'
4
5
 
5
6
  module TicTacToe
6
7
  class PlayerFactory
7
8
 
8
- def human(name = "User", value = "X")
9
- TicTacToe::Player.new(name, value, TicTacToe::Strategy::ConsoleUser.new)
9
+ def types
10
+ [:human, :computer]
10
11
  end
11
12
 
12
- def computer(board, value = "O", opponent_value = "X")
13
- ai = TicTacToe::Strategy::Minimax.new(board, value, opponent_value)
13
+ def create(player_type, value)
14
+ case player_type
15
+ when :human
16
+ human(value)
17
+ when :computer
18
+ computer(value)
19
+ end
20
+ end
21
+
22
+ private
23
+ def human(value)
24
+ TicTacToe::Player.new("User", value, TicTacToe::Strategy::ConsoleUser.new)
25
+ end
26
+
27
+ def computer(value)
28
+ ai = TicTacToe::Strategy::Minimax.new(value)
14
29
  TicTacToe::Player.new("Computer", value, ai)
15
30
  end
16
31
  end
@@ -29,4 +29,4 @@ module TicTacToe
29
29
  @board.rows + @board.columns + @board.diagonals
30
30
  end
31
31
  end
32
- end
32
+ end
@@ -4,50 +4,57 @@ require 'tic_tac_toe/board'
4
4
 
5
5
  module TicTacToe
6
6
  class Runner
7
- attr_reader :board
8
- def initialize(ui = TicTacToe::Console.new, game_factory = TicTacToe::GameFactory.new)
7
+
8
+ def initialize(ui = TicTacToe::Console.new, game_state_factory = TicTacToe::GameFactory.new)
9
9
  @ui = ui
10
- @board = TicTacToe::Board.new
11
- @game_factory = game_factory
10
+ @game_state_factory = game_state_factory
12
11
  end
13
12
 
14
13
  def start
15
- @ui.display_welcome_message
16
- @game = create_game
17
- play until @game.over?
18
- @ui.display_board(@board)
14
+ ui.display_welcome_message
15
+ @game_state = create_game_state
16
+ play until game_state.game_over?
17
+ ui.display_board(board)
19
18
  display_result
20
19
  end
21
20
 
22
21
  private
23
- def create_game
24
- game_type = @ui.game_type
22
+ attr_reader :ui, :game_state, :game_state_factory
23
+
24
+ def create_game_state
25
+ game_type = ui.game_type
25
26
  begin
26
- @game_factory.create(game_type, @board)
27
+ game_state_factory.create(game_type)
27
28
  rescue ArgumentError
28
- create_game
29
+ create_game_state
29
30
  end
30
31
  end
31
32
 
32
33
  def play
33
- @ui.display_board(@board)
34
- player = @game.current_player
35
- @ui.display_player_turn(player)
34
+ ui.display_board(board)
35
+ ui.display_player_turn(game_state.current_player)
36
+ make_player_move
37
+ end
38
+
39
+ def make_player_move
36
40
  begin
37
- @game.make_move
41
+ game_state.make_player_move
38
42
  rescue MoveNotAvailableError
39
- @ui.display_square_not_available
43
+ make_player_move
40
44
  end
41
45
  end
42
46
 
43
47
  def display_result
44
- winner = @game.winner
48
+ winner = game_state.winner
45
49
  if winner
46
- @ui.display_winner(winner)
50
+ ui.display_winner(winner)
47
51
  else
48
- @ui.display_tied_game
52
+ ui.display_tied_game
49
53
  end
50
54
  end
51
55
 
56
+ def board
57
+ game_state.board
58
+ end
52
59
  end
53
60
  end