game-tictactoe-esegredo 0.0.1 → 0.0.2

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/Rakefile CHANGED
@@ -11,6 +11,11 @@ task :smart do
11
11
  sh "ruby -Ilib bin/tictactoe_game.rb"
12
12
  end
13
13
 
14
+ desc "Run TicTacToe game vs minimax player"
15
+ task :minimax do
16
+ sh "ruby -Ilib bin/tictactoe_game.rb -m"
17
+ end
18
+
14
19
  desc "Run TicTacToe game vs dumb player"
15
20
  task :dumb do
16
21
  sh "ruby -Ilib bin/tictactoe_game.rb -d"
@@ -35,3 +40,10 @@ desc "Run DumbPlayer tests"
35
40
  task :dp_test do
36
41
  sh "ruby -Ilib test/tc_dumbplayer.rb"
37
42
  end
43
+
44
+ desc "Run TicTacToe by specifying two different players"
45
+ task :player, :x_player, :o_player do |player, args|
46
+ x_player = args[:x_player] || 'human'
47
+ o_player = args[:o_player] || 'minimax'
48
+ sh "ruby -Ilib bin/tictactoe_game_players.rb #{x_player} #{o_player}"
49
+ end
@@ -0,0 +1,26 @@
1
+ require "game-tictactoe-esegredo"
2
+
3
+ if __FILE__ == $0
4
+ if (ARGV.size == 2)
5
+ player1 = case ARGV[0].downcase
6
+ when "smart" then Tictactoe::SmartPlayer
7
+ when "minimax" then Tictactoe::MinimaxPlayer
8
+ when "dumb" then Tictactoe::DumbPlayer
9
+ when "human" then Tictactoe::HumanPlayer
10
+ else Tictactoe::HumanPlayer
11
+ end
12
+
13
+ player2 = case ARGV[1].downcase
14
+ when "smart" then Tictactoe::SmartPlayer
15
+ when "minimax" then Tictactoe::MinimaxPlayer
16
+ when "dumb" then Tictactoe::DumbPlayer
17
+ when "human" then Tictactoe::HumanPlayer
18
+ else Tictactoe::HumanPlayer
19
+ end
20
+
21
+ game = Tictactoe::Game.new(player1, player2, false)
22
+ game.play
23
+ else
24
+ puts "Usage: ruby -Ilib bin/tictactoe_game_players.rb player_x player_o"
25
+ end
26
+ end
@@ -27,10 +27,18 @@ module Tictactoe
27
27
  break if @board.won?
28
28
 
29
29
  @board[@o_player.move(@board)] = @o_player.mark
30
- end
31
-
32
- @o_player.finish @board
33
- @x_player.finish @board
30
+ end
31
+
32
+ puts @board
33
+
34
+ if @board.won? == @x_player.mark
35
+ print "Player (#{@x_player.mark}) has won!\n\n"
36
+ elsif @board.won? == " "
37
+ print "Tie game.\n\n"
38
+ else
39
+ print "Player (#{@o_player.mark}) has won!\n\n"
40
+ end
34
41
  end
42
+
35
43
  end
36
44
  end
@@ -14,17 +14,5 @@ module Tictactoe
14
14
  end
15
15
  move.chomp
16
16
  end
17
-
18
- def finish( final_board )
19
- print final_board
20
-
21
- if final_board.won? == @mark
22
- print "Congratulations, you win.\n\n"
23
- elsif final_board.won? == " "
24
- print "Tie game.\n\n"
25
- else
26
- print "You lost tic-tac-toe?!\n\n"
27
- end
28
- end
29
17
  end
30
18
  end
@@ -9,47 +9,49 @@ module Tictactoe
9
9
  # For each available movement
10
10
  bestValue = -2
11
11
  bestMove = ""
12
- moves.each do |move|
12
+ moves.each do |mov|
13
13
  newsquares = board.squares.dup
14
14
  newboard = Board.new(newsquares)
15
- value = search_best_move(newboard, move, self.mark, 1)
16
- if (value >= bestValue)
15
+ newboard[mov] = self.mark
16
+ value = search_best_move(newboard, opponent_mark, 1)
17
+ if (value > bestValue)
17
18
  bestValue = value
18
- bestMove = move
19
+ bestMove = mov
19
20
  end
20
21
  end
21
22
  bestMove
22
23
  end
23
24
 
24
- def search_best_move(board, move, mark, level)
25
- # Puts the movement on the board
26
- board[move] = mark
27
- moves = board.moves
28
-
29
- # Checks whether there is a winner or not
25
+ def search_best_move(board, mark, level)
26
+ # Checks if there is a winner
30
27
  return 1 if (board.won? == self.mark)
31
28
  return 0 if (board.won? == " ")
32
29
  return -1 if (board.won? == opponent_mark)
30
+
31
+ # Gets the available movements
32
+ moves = board.moves
33
33
 
34
- # Max level
34
+ # Min level
35
35
  if ((level % 2 == 1) && (!board.won?))
36
- bestValue = -2;
36
+ bestValue = 2
37
37
  moves.each do |mov|
38
38
  newsquares = board.squares.dup
39
39
  newboard = Board.new(newsquares)
40
- value = search_best_move(newboard, mov, opponent_mark, level + 1)
41
- if (value >= bestValue)
40
+ newboard[mov] = mark
41
+ value = search_best_move(newboard, self.mark, level + 1)
42
+ if (value < bestValue)
42
43
  bestValue = value
43
44
  end
44
45
  end
45
- # Min level
46
+ # Max level
46
47
  elsif ((level % 2 == 0) && (!board.won?))
47
- bestValue = 2;
48
+ bestValue = -2
48
49
  moves.each do |mov|
49
50
  newsquares = board.squares.dup
50
51
  newboard = Board.new(newsquares)
51
- value = search_best_move(newboard, mov, self.mark, level + 1)
52
- if (value <= bestValue)
52
+ newboard[mov] = mark
53
+ value = search_best_move(newboard, opponent_mark, level + 1)
54
+ if (value > bestValue)
53
55
  bestValue = value
54
56
  end
55
57
  end
@@ -9,8 +9,6 @@ module Tictactoe
9
9
  def move( board )
10
10
  raise NotImplementedError, "Player subclasses must define move()."
11
11
  end
12
-
13
- def finish( final_board )
14
- end
12
+
15
13
  end
16
14
  end
@@ -1,3 +1,3 @@
1
1
  module Tictactoe
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -9,8 +9,4 @@ describe Tictactoe::DumbPlayer do
9
9
  @dp.respond_to?("move").should == true
10
10
  end
11
11
 
12
- it "Debe existir un metodo finish" do
13
- @dp.respond_to?("finish").should == true
14
- end
15
-
16
12
  end
@@ -9,7 +9,4 @@ describe Tictactoe::HumanPlayer do
9
9
  @hp.respond_to?("move").should == true
10
10
  end
11
11
 
12
- it "Debe existir un metodo finish" do
13
- @hp.respond_to?("finish").should == true
14
- end
15
12
  end
@@ -0,0 +1,21 @@
1
+ require "game-tictactoe-esegredo"
2
+
3
+ describe Tictactoe::MinimaxPlayer do
4
+ before :each do
5
+ @mp = Tictactoe::MinimaxPlayer.new("X")
6
+ end
7
+
8
+ it "Debe existir un metodo move" do
9
+ @mp.respond_to?("move").should == true
10
+ end
11
+
12
+ it "El metodo move debe tratar de evitar la derrota" do
13
+ @board = Tictactoe::Board.new(["X", "X", "O", "O", "O", "X", " ", "O", " "])
14
+ @mp.move(@board).should == "c1"
15
+ end
16
+
17
+ it "El metodo move debe tratar de ganar" do
18
+ @board = Tictactoe::Board.new([" ", "O", "X", " ", "X", " ", "O", "O", "X"])
19
+ @mp.move(@board).should == "a1"
20
+ end
21
+ end
@@ -9,8 +9,4 @@ describe Tictactoe::SmartPlayer do
9
9
  @sp.respond_to?("move").should == true
10
10
  end
11
11
 
12
- it "Debe existir un metodo finish" do
13
- @sp.respond_to?("finish").should == true
14
- end
15
-
16
12
  end
@@ -9,8 +9,4 @@ class TestDumbPlayer < Test::Unit::TestCase
9
9
  def test_implements_move
10
10
  assert_equal true, @dp.respond_to?("move")
11
11
  end
12
-
13
- def test_implements_finish
14
- assert_equal true, @dp.respond_to?("finish")
15
- end
16
12
  end
@@ -9,8 +9,4 @@ class TestHumanPlayer < Test::Unit::TestCase
9
9
  def test_implements_move
10
10
  assert_equal true, @hp.respond_to?("move")
11
11
  end
12
-
13
- def test_implements_finish
14
- assert_equal true, @hp.respond_to?("finish")
15
- end
16
12
  end
@@ -9,8 +9,4 @@ class TestSmartPlayer < Test::Unit::TestCase
9
9
  def test_implements_move
10
10
  assert_equal true, @sp.respond_to?("move")
11
11
  end
12
-
13
- def test_implements_finish
14
- assert_equal true, @sp.respond_to?("finish")
15
- end
16
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: game-tictactoe-esegredo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-21 00:00:00.000000000 Z
12
+ date: 2012-11-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &21944360 !ruby/object:Gem::Requirement
16
+ requirement: &15662220 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *21944360
24
+ version_requirements: *15662220
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &21943600 !ruby/object:Gem::Requirement
27
+ requirement: &15661560 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *21943600
35
+ version_requirements: *15661560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guard-rspec
38
- requirement: &21942600 !ruby/object:Gem::Requirement
38
+ requirement: &15660620 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,12 +43,13 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *21942600
46
+ version_requirements: *15660620
47
47
  description: Gem which implements the Tic-Tac-Toe game with different kind of players
48
48
  email:
49
49
  - edusegre@gmail.com
50
50
  executables:
51
51
  - tictactoe_game.rb
52
+ - tictactoe_game_players.rb
52
53
  extensions: []
53
54
  extra_rdoc_files: []
54
55
  files:
@@ -59,6 +60,7 @@ files:
59
60
  - README.md
60
61
  - Rakefile
61
62
  - bin/tictactoe_game.rb
63
+ - bin/tictactoe_game_players.rb
62
64
  - game-tictactoe-esegredo.gemspec
63
65
  - lib/game-tictactoe-esegredo.rb
64
66
  - lib/tictactoe/board.rb
@@ -70,6 +72,7 @@ files:
70
72
  - lib/tictactoe/version.rb
71
73
  - spec/dumbplayer_spec.rb
72
74
  - spec/humanplayer_spec.rb
75
+ - spec/minimaxplayer_spec.rb
73
76
  - spec/smartplayer_spec.rb
74
77
  - test/tc_dumbplayer.rb
75
78
  - test/tc_humanplayer.rb
@@ -101,6 +104,7 @@ summary: Gem which implements the Tic-Tac-Toe game with different kind of player
101
104
  test_files:
102
105
  - spec/dumbplayer_spec.rb
103
106
  - spec/humanplayer_spec.rb
107
+ - spec/minimaxplayer_spec.rb
104
108
  - spec/smartplayer_spec.rb
105
109
  - test/tc_dumbplayer.rb
106
110
  - test/tc_humanplayer.rb