tic_tac_toes 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5b7b828672ca3ca2908fc62b6f7cf25622a16322
4
- data.tar.gz: 704c24b5374e84549277e659401621ee7044ee75
3
+ metadata.gz: 1e7b4f6653858ee05ee85a0ad10f519879bed750
4
+ data.tar.gz: e5aaea09afc5342b96fb823881ba26ef691f00af
5
5
  SHA512:
6
- metadata.gz: a9a5b96876e221e2b43c7e5996be97ea4e14af904017d6f7e5f64e3ae978ab08b71ef3f194ad25ffe690a785ca8a8168943c290b396c6c414a957dd042be566d
7
- data.tar.gz: 14ff8a5d98dd83cadd2821a3321a758a716eb81783d617539777093c4eae479a5b7057fb5bb364a169169d089b58bd902a03352feb6f96c8bd5ef62e7133009f
6
+ metadata.gz: 49287beb325485b2b1affb085f082f03804f8c0a9a21bd761ca8bddca64e681fb98be844dac1c6ec0d1f3df58ee96e7e23518b18351c06b021838c5cbf05cb19
7
+ data.tar.gz: 0874989c2aaf4f7dd1712266303fbad25c4f911507c158b65d0e1ae72b94605e842366b708485f21f51420cb99823e7bd403f8ada58b58cb947783e377cc310b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tic_tac_toes (0.1.0)
4
+ tic_tac_toes (0.1.1)
5
5
  pg
6
6
 
7
7
  GEM
@@ -1,5 +1,6 @@
1
1
  require 'tic_tac_toes/core/board'
2
2
  require 'tic_tac_toes/core/rules'
3
+ require 'tic_tac_toes/core/player_factory'
3
4
 
4
5
  module TicTacToes
5
6
  module CommandLine
@@ -20,8 +21,8 @@ module TicTacToes
20
21
  computer_token = get_token(:computer, taken_tokens)
21
22
  difficulty = get_difficulty
22
23
 
23
- human_player = @player_factory.generate_human_player(human_token)
24
- computer_player = @player_factory.generate_computer_player(computer_token, difficulty)
24
+ human_player = @player_factory.generate_player(human_token, Core::PlayerFactory::HUMAN)
25
+ computer_player = @player_factory.generate_player(computer_token, difficulty)
25
26
  [human_player, computer_player]
26
27
  end
27
28
 
@@ -7,23 +7,29 @@ require 'tic_tac_toes/core/player'
7
7
  module TicTacToes
8
8
  module Core
9
9
  class PlayerFactory
10
- def initialize(io)
11
- @io = io
12
- end
10
+
11
+ HUMAN = :human
12
+ EASY_AI = :easy
13
+ MEDIUM_AI = :medium
14
+ HARD_AI = :hard
13
15
 
14
16
  AIS = {
15
- easy: ::TicTacToes::Core::MoveStrategies::EasyAI,
16
- medium: ::TicTacToes::Core::MoveStrategies::MediumAI,
17
- hard: ::TicTacToes::Core::MoveStrategies::HardAI }
17
+ EASY_AI => MoveStrategies::EasyAI,
18
+ MEDIUM_AI => MoveStrategies::MediumAI,
19
+ HARD_AI => MoveStrategies::HardAI
20
+ }
18
21
 
19
- def generate_human_player(token)
20
- needs_to_think = false
21
- Player.new(TicTacToes::Core::MoveStrategies::Human.new(@io), token, needs_to_think, @io)
22
+ def initialize(io)
23
+ @io = io
22
24
  end
23
25
 
24
- def generate_computer_player(token, difficulty)
25
- needs_to_think = true
26
- Player.new(AIS[difficulty], token, needs_to_think, @io)
26
+ def generate_player(token, type)
27
+ case type
28
+ when HUMAN
29
+ Player.new(MoveStrategies::Human.new(@io), token, false, @io)
30
+ else
31
+ Player.new(AIS.fetch(type), token, true, @io)
32
+ end
27
33
  end
28
34
  end
29
35
  end
@@ -1,6 +1,15 @@
1
1
  module TicTacToes
2
2
  module UI
3
3
  module Adapter
4
+ def self.start_game(order, game_state, listener)
5
+ case order
6
+ when 'first'
7
+ listener.moves_were_made(game_state)
8
+ when 'second'
9
+ make_move(game_state, nil, listener)
10
+ end
11
+ end
12
+
4
13
  def self.make_move(game_state, move, listener)
5
14
  unless move.nil?
6
15
  move = move.to_i
@@ -13,10 +13,10 @@ module TicTacToes
13
13
  board.spaces
14
14
  end
15
15
 
16
- def self.game_state_from_board_structure(board_structure)
16
+ def self.game_state_from_board_structure(board_structure, computer_type)
17
17
  player_factory = Core::PlayerFactory.new('unused_io')
18
- human_player = player_factory.generate_human_player(X)
19
- computer_player = player_factory.generate_computer_player(O, :hard)
18
+ human_player = player_factory.generate_player(X, Core::PlayerFactory::HUMAN)
19
+ computer_player = player_factory.generate_player(O, Core::PlayerFactory.const_get(computer_type))
20
20
  players = [human_player, computer_player]
21
21
 
22
22
  board_structure_with_players = replace_tokens_with_players(board_structure, human_player, computer_player)
@@ -25,12 +25,28 @@ module TicTacToes
25
25
  Core::GameState.new(board, players, NullHistory.new)
26
26
  end
27
27
 
28
- def self.game_state_to_board_structure(game_state)
28
+ def self.board_structure_from_game_state(game_state)
29
29
  structure_with_players = game_state.board.spaces
30
30
 
31
31
  replace_players_with_tokens(structure_with_players)
32
32
  end
33
33
 
34
+ def self.computer_type_from_game_state(game_state)
35
+ type = nil
36
+
37
+ game_state.players.each do |player|
38
+ if player.move_strategy == Core::PlayerFactory::AIS.fetch(Core::PlayerFactory::EASY_AI)
39
+ type = 'EASY_AI'
40
+ elsif player.move_strategy == Core::PlayerFactory::AIS.fetch(Core::PlayerFactory::MEDIUM_AI)
41
+ type = 'MEDIUM_AI'
42
+ elsif player.move_strategy == Core::PlayerFactory::AIS.fetch(Core::PlayerFactory::HARD_AI)
43
+ type = 'HARD_AI'
44
+ end
45
+ end
46
+
47
+ type
48
+ end
49
+
34
50
  private
35
51
 
36
52
  def self.replace_tokens_with_players(board_structure, human_player, computer_player)
@@ -1,3 +1,3 @@
1
1
  module TicTacToes
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -7,8 +7,8 @@ describe TicTacToes::Core::MoveStrategies::EasyAI do
7
7
  describe '#move' do
8
8
  it "returns a randomly-selected valid move" do
9
9
  player_factory = TicTacToes::Core::PlayerFactory.new('unused_io')
10
- x = player_factory.generate_human_player('x')
11
- o = player_factory.generate_computer_player('o', :hard)
10
+ x = player_factory.generate_player('x', TicTacToes::Core::PlayerFactory::HUMAN)
11
+ o = player_factory.generate_player('o', TicTacToes::Core::PlayerFactory::EASY_AI)
12
12
  players = [x, o]
13
13
 
14
14
  board = TicTacToes::TestBoardGenerator.generate([ o, nil, nil,
@@ -7,8 +7,8 @@ describe TicTacToes::Core::MoveStrategies::MediumAI do
7
7
  describe '#move' do
8
8
  it "returns a valid move (based on either EasyAI or HardAI)" do
9
9
  player_factory = TicTacToes::Core::PlayerFactory.new('unused_io')
10
- x = player_factory.generate_human_player('x')
11
- o = player_factory.generate_computer_player('o', :hard)
10
+ x = player_factory.generate_player('x', TicTacToes::Core::PlayerFactory::HUMAN)
11
+ o = player_factory.generate_player('o', TicTacToes::Core::PlayerFactory::MEDIUM_AI)
12
12
  players = [x, o]
13
13
 
14
14
  board = TicTacToes::TestBoardGenerator.generate([ o, o, x,
@@ -3,29 +3,25 @@ require 'tic_tac_toes/core/move_strategies/medium_ai'
3
3
  require 'tic_tac_toes/core/player_factory'
4
4
 
5
5
  describe TicTacToes::Core::PlayerFactory do
6
- let(:player_factory) { TicTacToes::Core::PlayerFactory.new("io") }
6
+ describe '#generate_player' do
7
+ before { @player_factory = TicTacToes::Core::PlayerFactory.new('io') }
7
8
 
8
- describe '#generate_human_player' do
9
- it "returns a player with the correct token and move strategy" do
10
- strategy = TicTacToes::Core::MoveStrategies::Human
11
- token = 'X'
9
+ context 'when passed HUMAN' do
10
+ it "returns a player with the correct token and a Human move strategy" do
11
+ human_player = @player_factory.generate_player('X', TicTacToes::Core::PlayerFactory::HUMAN)
12
12
 
13
- human_player = player_factory.generate_human_player(token)
14
- expect(human_player.move_strategy).to be_a strategy
15
- expect(human_player.token).to eq(token)
13
+ expect(human_player.token).to eq('X')
14
+ expect(human_player.move_strategy).to be_a TicTacToes::Core::MoveStrategies::Human
15
+ end
16
16
  end
17
- end
18
17
 
19
- describe '#generate_computer_player' do
20
- it 'returns a player with the correct token and move strategy' do
21
- token = 'O'
22
- difficulty = :medium
23
- strategy = TicTacToes::Core::MoveStrategies::MediumAI
18
+ context 'when passed EASY_AI, MEDIUM_AI, or HARD_AI' do
19
+ it 'returns a player with the correct token and correct AI move strategy' do
20
+ computer_player = @player_factory.generate_player('O', TicTacToes::Core::PlayerFactory::MEDIUM_AI)
24
21
 
25
- computer_player = player_factory.generate_computer_player(token,
26
- difficulty)
27
- expect(computer_player.move_strategy).to eq(strategy)
28
- expect(computer_player.token).to eq(token)
22
+ expect(computer_player.move_strategy).to eq(TicTacToes::Core::MoveStrategies::MediumAI)
23
+ expect(computer_player.token).to eq('O')
24
+ end
29
25
  end
30
26
  end
31
27
  end
@@ -4,12 +4,37 @@ require 'tic_tac_toes/test_board_generator'
4
4
  require 'tic_tac_toes/ui/adapter'
5
5
 
6
6
  describe TicTacToes::UI::Adapter do
7
+ describe '#start_game' do
8
+ context 'when passed an order of “first”' do
9
+ it 'sends its listener #moves_were_made with the game state' do
10
+ order = 'first'
11
+ game_state = double
12
+ listener = double
13
+
14
+ expect(listener).to receive(:moves_were_made).with(game_state)
15
+ TicTacToes::UI::Adapter.start_game(order, game_state, listener)
16
+ end
17
+ end
18
+
19
+ context 'when passed an order of “second”' do
20
+ it 'sends its listener #moves_were_made with the game state' do
21
+ order = 'second'
22
+ computer_player = double(place_and_return_move: 0)
23
+ game_state = double(game_over?: false, turn_over: true, current_player: computer_player)
24
+ listener = double
25
+
26
+ expect(listener).to receive(:moves_were_made).with(game_state)
27
+ TicTacToes::UI::Adapter.start_game(order, game_state, listener)
28
+ end
29
+ end
30
+ end
31
+
7
32
  describe '#make_move' do
8
33
  let(:history) { TicTacToes::UI::NullHistory.new }
9
34
 
10
35
  player_factory = TicTacToes::Core::PlayerFactory.new('unused_io')
11
- let(:x) { player_factory.generate_human_player('x') }
12
- let(:o) { player_factory.generate_computer_player('o', :hard) }
36
+ let(:x) { player_factory.generate_player('x', TicTacToes::Core::PlayerFactory::HUMAN) }
37
+ let(:o) { player_factory.generate_player('o', TicTacToes::Core::PlayerFactory::HARD_AI) }
13
38
  let(:players) { [x, o] }
14
39
 
15
40
  context 'when the game is still in progress' do
@@ -12,10 +12,12 @@ describe TicTacToes::UI::Serializer do
12
12
  end
13
13
 
14
14
  describe '#game_state_from_board_structure' do
15
- it 'returns a game state object based on a board structure' do
15
+ it 'returns a game state object based on a board structure and computer type' do
16
16
  board_structure = [nil, nil, nil, nil, 'X', nil, nil, nil, nil]
17
+ computer_type = 'EASY_AI'
18
+ ai = TicTacToes::Core::PlayerFactory::AIS.fetch(TicTacToes::Core::PlayerFactory::EASY_AI)
17
19
 
18
- game_state = TicTacToes::UI::Serializer.game_state_from_board_structure(board_structure)
20
+ game_state = TicTacToes::UI::Serializer.game_state_from_board_structure(board_structure, computer_type)
19
21
  middle_space = game_state.board.space(4)
20
22
  first_player = game_state.players.first
21
23
  second_player = game_state.players.last
@@ -23,21 +25,32 @@ describe TicTacToes::UI::Serializer do
23
25
  expect(middle_space.token).to eq(TicTacToes::UI::Serializer::X)
24
26
  expect(first_player.token).to eq(TicTacToes::UI::Serializer::X)
25
27
  expect(second_player.token).to eq(TicTacToes::UI::Serializer::O)
28
+ expect(second_player.move_strategy).to eq(ai)
26
29
  end
27
30
  end
28
31
 
29
- describe '#game_state_to_board_structure' do
32
+ describe '#board_structure_from_game_state' do
30
33
  it 'returns a board structure based on a game state object' do
31
34
  player_factory = TicTacToes::Core::PlayerFactory.new('unused_io')
32
- first_player = player_factory.generate_human_player(TicTacToes::UI::Serializer::X)
33
- second_player = player_factory.generate_computer_player(TicTacToes::UI::Serializer::O, :hard)
35
+ first_player = player_factory.generate_player(TicTacToes::UI::Serializer::X, TicTacToes::Core::PlayerFactory::HUMAN)
36
+ second_player = player_factory.generate_player(TicTacToes::UI::Serializer::O, TicTacToes::Core::PlayerFactory::HARD_AI)
34
37
  players = [first_player, second_player]
35
38
  board = TicTacToes::Core::Board.new
36
39
  board.place(first_player, 4)
37
40
 
38
41
  game_state = TicTacToes::Core::GameState.new(board, players, TicTacToes::UI::NullHistory.new)
39
42
  board_structure = [nil, nil, nil, nil, 'X', nil, nil, nil, nil]
40
- expect(TicTacToes::UI::Serializer.game_state_to_board_structure(game_state)).to eq(board_structure)
43
+ expect(TicTacToes::UI::Serializer.board_structure_from_game_state(game_state)).to eq(board_structure)
44
+ end
45
+ end
46
+
47
+ describe '#computer_type_from_game_state' do
48
+ it 'returns the type of a game state’s computer player' do
49
+ move_strategy = TicTacToes::Core::PlayerFactory::AIS.fetch(TicTacToes::Core::PlayerFactory::EASY_AI)
50
+ computer_player = double(move_strategy: move_strategy)
51
+ players = [computer_player]
52
+ game_state = double(players: players)
53
+ expect(TicTacToes::UI::Serializer.computer_type_from_game_state(game_state)).to eq('EASY_AI')
41
54
  end
42
55
  end
43
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tic_tac_toes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Spatafora
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-30 00:00:00.000000000 Z
11
+ date: 2014-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler