game-tictactoe-alu4078 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ pkg/*
4
+ *~
5
+ *.kate-swp
6
+ .directory
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby-18mode # JRuby in 1.8 mode
5
+ - jruby-19mode # JRuby in 1.9 mode
6
+ - rbx-18mode
7
+ - rbx-19mode
8
+ - 1.8.7
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in game-tictactoe-alu4078.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,45 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ game-tictactoe-alu4078 (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ coderay (1.0.8)
10
+ diff-lcs (1.1.3)
11
+ guard (1.5.3)
12
+ listen (>= 0.4.2)
13
+ lumberjack (>= 1.0.2)
14
+ pry (>= 0.9.10)
15
+ thor (>= 0.14.6)
16
+ guard-rspec (2.1.1)
17
+ guard (>= 1.1)
18
+ rspec (~> 2.11)
19
+ listen (0.5.3)
20
+ lumberjack (1.0.2)
21
+ method_source (0.8.1)
22
+ pry (0.9.10)
23
+ coderay (~> 1.0.5)
24
+ method_source (~> 0.8)
25
+ slop (~> 3.3.1)
26
+ rake (0.9.2.2)
27
+ rspec (2.11.0)
28
+ rspec-core (~> 2.11.0)
29
+ rspec-expectations (~> 2.11.0)
30
+ rspec-mocks (~> 2.11.0)
31
+ rspec-core (2.11.1)
32
+ rspec-expectations (2.11.3)
33
+ diff-lcs (~> 1.1.3)
34
+ rspec-mocks (2.11.3)
35
+ slop (3.3.3)
36
+ thor (0.16.0)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ game-tictactoe-alu4078!
43
+ guard-rspec
44
+ rake
45
+ rspec
data/Guardfile ADDED
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
data/README ADDED
@@ -0,0 +1,16 @@
1
+ -------------------------------------------------------------
2
+ Alumno: David Hernández Bethencourt
3
+ Asignatura: Lenguaje y Paradigmas de la programación
4
+ Escuela Técnica de Ingeniería Informática
5
+ Universidad de la Laguna
6
+ -------------------------------------------------------------
7
+
8
+ Práctica de Laboratorio #10: Creación de una Gema - Segunda Parte (Bundler)
9
+
10
+ Considere el desarrollo de una aplicación para jugar al tres en raya de la práctica anterior.
11
+ El objetivo de esta práctica es la construcción y publicación de una Gema en Ruby para la el juego de tres en raya. Para ello se ha de utilizar la herramienta Bundler (http://gembundler.com/)
12
+ 1.- Desarrollar un método para hacer que dos jugadores arbitrarios compitan
13
+ 2.- Desarrollar un jugador minimax
14
+ 3.- Construir la gema gem build
15
+ 4.- Considerar su publicacion gem push
16
+ 5.- Indique la URL del repositorio github o bitbucket que ha desarrollado.
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ $:.unshift File.dirname(__FILE__) + 'lib'
2
+
3
+ require "bundler/gem_tasks"
4
+
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new
7
+ task :default => :spec
8
+
9
+ desc "Run TicTacToe game vs smart player"
10
+ task :smart do
11
+ sh "ruby -Ilib bin/tictactoe_game.rb"
12
+ end
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
+
19
+ desc "Run TicTacToe game vs dumb player"
20
+ task :dumb do
21
+ sh "ruby -Ilib bin/tictactoe_game.rb -d"
22
+ end
23
+
24
+ desc "Run rspec with --format documentation"
25
+ task :doc do
26
+ sh "rspec -Ilib spec/*.rb --format documentation"
27
+ end
28
+
29
+ desc "Run HumanPlayer tests"
30
+ task :hp_test do
31
+ sh "ruby -Ilib test/tc_humanplayer.rb"
32
+ end
33
+
34
+ desc "Run SmartPlayer tests"
35
+ task :sp_test do
36
+ sh "ruby -Ilib test/tc_smartplayer.rb"
37
+ end
38
+
39
+ desc "Run DumbPlayer tests"
40
+ task :dp_test do
41
+ sh "ruby -Ilib test/tc_dumbplayer.rb"
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,14 @@
1
+ # tictactoe_game.rb
2
+
3
+ require "game-tictactoe-alu4078"
4
+
5
+ if __FILE__ == $0
6
+ if ARGV.size > 0 and ARGV[0] == "-d"
7
+ game = TicTacToe::Game.new TicTacToe::HumanPlayer,
8
+ TicTacToe::DumbPlayer
9
+ else
10
+ game = TicTacToe::Game.new TicTacToe::HumanPlayer,
11
+ TicTacToe::SmartPlayer
12
+ end
13
+ game.play
14
+ end
@@ -0,0 +1,27 @@
1
+ require "game-tictactoe-alu4078"
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
+
24
+ else
25
+ puts "Usage: ruby -Ilib bin/tictactoe_game_players.rb player_x player_o"
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "game_tictactoe_alu4078/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "game-tictactoe-alu4078"
7
+ s.version = TicTacToe::VERSION
8
+ s.authors = ["David Hernández Bethencourt"]
9
+ s.email = ["alu0100536881@ull.edu.es"]
10
+ s.homepage = "https://github.com/DavidHerBet/LPPpr10.git"
11
+ s.summary = %q{Gem which implements tictactoe game with different kinds of players}
12
+ s.description = %q{Gem which implements tictactoe game with different kinds of players}
13
+
14
+ s.rubyforge_project = "game-tictactoe-alu4078"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_development_dependency 'rake'
24
+ s.add_development_dependency 'rspec'
25
+ s.add_development_dependency 'guard-rspec'
26
+ # s.add_runtime_dependency "rest-client"
27
+ end
@@ -0,0 +1,11 @@
1
+ require "game_tictactoe_alu4078/version"
2
+ require "game_tictactoe_alu4078/tictactoe"
3
+ require "game_tictactoe_alu4078/humanplayer"
4
+ require "game_tictactoe_alu4078/smartplayer"
5
+ require "game_tictactoe_alu4078/dumbplayer"
6
+ require "game_tictactoe_alu4078/minimaxplayer"
7
+
8
+
9
+ module TicTacToe
10
+ # Your code goes here...
11
+ end
@@ -0,0 +1,12 @@
1
+ # dumbplayer.rb
2
+
3
+ require "game_tictactoe_alu4078/player"
4
+
5
+ module TicTacToe
6
+ class DumbPlayer < Player
7
+ def move( board )
8
+ moves = board.moves
9
+ moves[rand(moves.size)]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ # humanplayer.rb
2
+
3
+ require "game_tictactoe_alu4078/player"
4
+
5
+ module TicTacToe
6
+ class HumanPlayer < Player
7
+ def move( board )
8
+ print board
9
+
10
+ moves = board.moves
11
+ print "Your move? (format: b3) "
12
+ move = $stdin.gets
13
+ until moves.include?(move.chomp.downcase)
14
+ print "Invalid move. Try again. "
15
+ move = $stdin.gets
16
+ end
17
+ move.chomp
18
+ end
19
+
20
+ def finish( final_board )
21
+ print final_board
22
+
23
+ if final_board.won? == @mark
24
+ print "Congratulations, you win.\n\n"
25
+ elsif final_board.won? == " "
26
+ print "Tie game.\n\n"
27
+ else
28
+ print "You lost tic-tac-toe?!\n\n"
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,71 @@
1
+ require "game_tictactoe_alu4078/player"
2
+
3
+ module TicTacToe
4
+ class MinimaxPlayer < Player
5
+ def move( board )
6
+ # Obtains the available movements
7
+ moves = board.moves
8
+
9
+ # For each available movement
10
+ bestValue = -2
11
+ bestMove = ""
12
+ moves.each do |mov|
13
+ newsquares = board.squares.dup
14
+ newboard = Board.new(newsquares)
15
+ newboard[mov] = self.mark
16
+ value = search_best_move(newboard, opponent_mark, 1)
17
+ if (value > bestValue)
18
+ bestValue = value
19
+ bestMove = mov
20
+ end
21
+ end
22
+ bestMove
23
+ end
24
+
25
+ def search_best_move(board, mark, level)
26
+ # Checks if there is a winner
27
+ return 1 if (board.won? == self.mark)
28
+ return 0 if (board.won? == " ")
29
+ return -1 if (board.won? == opponent_mark)
30
+
31
+ # Gets the available movements
32
+ moves = board.moves
33
+
34
+ # Min level
35
+ if ((level % 2 == 1) && (!board.won?))
36
+ bestValue = 2
37
+ moves.each do |mov|
38
+ newsquares = board.squares.dup
39
+ newboard = Board.new(newsquares)
40
+ newboard[mov] = mark
41
+ value = search_best_move(newboard, self.mark, level + 1)
42
+ if (value < bestValue)
43
+ bestValue = value
44
+ end
45
+ end
46
+ # Max level
47
+ elsif ((level % 2 == 0) && (!board.won?))
48
+ bestValue = -2
49
+ moves.each do |mov|
50
+ newsquares = board.squares.dup
51
+ newboard = Board.new(newsquares)
52
+ newboard[mov] = mark
53
+ value = search_best_move(newboard, opponent_mark, level + 1)
54
+ if (value > bestValue)
55
+ bestValue = value
56
+ end
57
+ end
58
+ end
59
+ bestValue
60
+ end
61
+
62
+ def opponent_mark
63
+ if (self.mark == "X")
64
+ return "O"
65
+ else
66
+ return "X"
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,16 @@
1
+ module TicTacToe
2
+ class Player
3
+ def initialize( mark )
4
+ @mark = mark # "X" or "O" or " "
5
+ end
6
+
7
+ attr_reader :mark
8
+
9
+ def move( board )
10
+ raise NotImplementedError, "Player subclasses must define move()."
11
+ end
12
+
13
+ def finish( final_board )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,44 @@
1
+ # smartplayer.rb
2
+
3
+ require "game_tictactoe_alu4078/player"
4
+
5
+ module TicTacToe
6
+ class SmartPlayer < Player
7
+ def move( board )
8
+ moves = board.moves
9
+
10
+ # If I have a win, take it. If he is threatening to win, stop it.
11
+ board.each_row do |row|
12
+ if row.blanks == 1 and (row.xs == 2 or row.os == 2)
13
+ (0..2).each do |e|
14
+ return row.to_board_name(e) if row[e] == " "
15
+ end
16
+ end
17
+ end
18
+
19
+ # Take the center if open.
20
+ return "b2" if moves.include? "b2"
21
+
22
+ # Defend opposite corners.
23
+ if board[0] != @mark and board[0] != " " and board[8] == " "
24
+ return "c3"
25
+ elsif board[8] != @mark and board[8] != " " and board[0] == " "
26
+ return "a1"
27
+ elsif board[2] != @mark and board[2] != " " and board[6] == " "
28
+ return "c1"
29
+ elsif board[6] != @mark and board[6] != " " and board[2] == " "
30
+ return "a3"
31
+ end
32
+
33
+ # Defend against the special case XOX on a diagonal.
34
+ if board.xs == 2 and board.os == 1 and board[4] == "O" and
35
+ (board[0] == "X" and board[8] == "X") or
36
+ (board[2] == "X" and board[6] == "X")
37
+ return %w{a2 b1 b3 c2}[rand(4)]
38
+ end
39
+
40
+ # Or make a random move.
41
+ moves[rand(moves.size)]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,137 @@
1
+ #---
2
+ # Visit http://www.pragmaticprogrammer.com/titles/fr_quiz for more book information.
3
+ #---
4
+
5
+ module TicTacToe
6
+ module SquaresContainer
7
+ def []( index ) @squares[index] end
8
+
9
+ def blanks() @squares.find_all { |s| s == " " }.size end
10
+ def os() @squares.find_all { |s| s == "O" }.size end
11
+ def xs() @squares.find_all { |s| s == "X" }.size end
12
+ end
13
+
14
+ class Board
15
+ class Row
16
+ def initialize( squares, names )
17
+ @squares = squares
18
+ @names = names
19
+ end
20
+
21
+ include SquaresContainer
22
+
23
+ def to_board_name( index )
24
+ Board.index_to_name(@names[index])
25
+ end
26
+ end
27
+
28
+ MOVES = %w{a1 a2 a3 b1 b2 b3 c1 c2 c3}
29
+ # Define constant INDICES
30
+ INDICES = Hash.new { |h, k| h[k] = MOVES.find_index(k) }
31
+
32
+ def self.name_to_index( name )# Receives "b2" and returns 4
33
+ INDICES[name]
34
+ end
35
+
36
+ def self.index_to_name( index ) # Receives the index, like 4 and returns "b2"
37
+ MOVES[index]
38
+ end
39
+
40
+ def initialize( squares )
41
+ @squares = squares # An array of Strings: [ " ", " ", " ", " ", "X", " ", " ", " ", "O"]
42
+ end
43
+
44
+ include SquaresContainer
45
+
46
+ def []( *indices )
47
+ if indices.size == 2 # board[1,2] is @squares[7]
48
+ super indices[0] + indices[1] * 3 # calls SquaresContainer [] method
49
+ elsif indices[0].is_a? Fixnum # board[7]
50
+ super indices[0]
51
+ else # board["b2"]
52
+ super Board.name_to_index(indices[0].to_s)
53
+ end
54
+ end
55
+
56
+ def []=(indice, value) # board["b2"] = "X"
57
+ m = Board.name_to_index(indice)
58
+ @squares[m] = value
59
+ end
60
+
61
+ HORIZONTALS = [ [0, 1, 2], [3, 4, 5], [6, 7, 8] ]
62
+ COLUMNS = [ [0, 3, 6], [1, 4, 7], [2, 5, 8] ]
63
+ DIAGONALS = [ [0, 4, 8], [2, 4, 6] ]
64
+ ROWS = HORIZONTALS + COLUMNS + DIAGONALS
65
+
66
+ def each_row
67
+ ROWS.each do |e|
68
+ yield Row.new(@squares.values_at(*e), e)
69
+ end
70
+ end
71
+
72
+ def moves
73
+ moves = [ ]
74
+ @squares.each_with_index do |s, i|
75
+ moves << Board.index_to_name(i) if s == " "
76
+ end
77
+ moves # returns the set of feasible moves [ "b3", "c2", ... ]
78
+ end
79
+
80
+ def won?
81
+ each_row do |row|
82
+ return "X" if row.xs == 3 # "X" wins
83
+ return "O" if row.os == 3 # "O" wins
84
+ end
85
+ return " " if blanks == 0 # tie
86
+ false
87
+ end
88
+
89
+ BOARD =<<EOS
90
+
91
+ +---+---+---+
92
+ a | 0 | 1 | 2 |
93
+ +---+---+---+
94
+ b | 3 | 4 | 5 |
95
+ +---+---+---+
96
+ c | 6 | 7 | 8 |
97
+ +---+---+---+
98
+ 1 2 3
99
+
100
+ EOS
101
+ def to_s
102
+ BOARD.gsub(/(\d)(?= \|)/) { |i| @squares[i.to_i] }
103
+ end
104
+
105
+ end
106
+ end
107
+
108
+ module TicTacToe
109
+ class Game
110
+ def initialize( player1, player2, random = true )
111
+ if random and rand(2) == 1
112
+ @x_player = player2.new("X")
113
+ @o_player = player1.new("O")
114
+ else
115
+ @x_player = player1.new("X")
116
+ @o_player = player2.new("O")
117
+ end
118
+
119
+ @board = Board.new([" "] * 9)
120
+ end
121
+
122
+ attr_reader :x_player, :o_player
123
+
124
+ def play
125
+ until @board.won?
126
+ @board[@x_player.move(@board)] = @x_player.mark
127
+ break if @board.won?
128
+
129
+ @board[@o_player.move(@board)] = @o_player.mark
130
+ end
131
+
132
+ @o_player.finish @board
133
+ @x_player.finish @board
134
+ end
135
+
136
+ end
137
+ end
@@ -0,0 +1,3 @@
1
+ module TicTacToe
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,13 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "rspec"
3
+
4
+ describe TicTacToe::DumbPlayer do
5
+ before :each do
6
+ @dp = TicTacToe::DumbPlayer.new("X")
7
+ end
8
+
9
+ it "Debe existir un metodo move" do
10
+ @dp.respond_to?("move").should == true
11
+ end
12
+
13
+ end
@@ -0,0 +1,16 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "rspec"
3
+
4
+ describe TicTacToe::HumanPlayer do
5
+ before :each do
6
+ @hp = TicTacToe::HumanPlayer.new("X")
7
+ end
8
+
9
+ it "Debe existir un metodo move" do
10
+ @hp.respond_to?("move").should == true
11
+ end
12
+
13
+ it "Debe existir un metodo finish" do
14
+ @hp.respond_to?("finish").should == true
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "rspec"
3
+
4
+ describe Tictactoe::MinimaxPlayer do
5
+ before :each do
6
+ @mp = Tictactoe::MinimaxPlayer.new("X")
7
+ end
8
+
9
+ it "Debe existir un metodo move" do
10
+ @mp.respond_to?("move").should == true
11
+ end
12
+
13
+ it "El metodo move debe tratar de evitar la derrota" do
14
+ @board = Tictactoe::Board.new(["X", "X", "O", "O", "O", "X", " ", "O", " "])
15
+ @mp.move(@board).should == "c1"
16
+ end
17
+
18
+ it "El metodo move debe tratar de ganar" do
19
+ @board = Tictactoe::Board.new([" ", "O", "X", " ", "X", " ", "O", "O", "X"])
20
+ @mp.move(@board).should == "a1"
21
+ end
@@ -0,0 +1,13 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "rspec"
3
+
4
+ describe TicTacToe::SmartPlayer do
5
+ before :each do
6
+ @sp = TicTacToe::SmartPlayer.new("X")
7
+ end
8
+
9
+ it "Debe existir un metodo move" do
10
+ @sp.respond_to?("move").should == true
11
+ end
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "test/unit"
3
+
4
+ class TestDumbPlayer < Test::Unit::TestCase
5
+ def setup
6
+ @dp = TicTacToe::DumbPlayer.new("X")
7
+ end
8
+
9
+ def test_implements_move
10
+ assert_equal true, @dp.respond_to?("move")
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "test/unit"
3
+
4
+ class TestHumanPlayer < Test::Unit::TestCase
5
+ def setup
6
+ @hp = TicTacToe::HumanPlayer.new("X")
7
+ end
8
+
9
+ def test_implements_move
10
+ assert_equal true, @hp.respond_to?("move")
11
+ end
12
+
13
+ def test_implements_finish
14
+ assert_equal true, @hp.respond_to?("finish")
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "test/unit"
3
+
4
+ class TestMinimaxPlayer < Test::Unit::TestCase
5
+ def setup
6
+ @mp = TicTacToe::MinimaxPlayer.new("X")
7
+ end
8
+
9
+ def test_implements_move
10
+ assert_equal true, @mp.respond_to?("move")
11
+ end
12
+
13
+ def test_avoid_defeat
14
+ @board = Tictactoe::Board.new(["X", "X", "O", "O", "O", "X", " ", "O", " "])
15
+ assert_equal "c1", @mp.move(@board)
16
+ end
17
+
18
+ def test_try_to_defeat
19
+ @board = Tictactoe::Board.new([" ", "O", "X", " ", "X", " ", "O", "O", "X"])
20
+ assert_equal "a1", @mp.move(@board)
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ require "game-tictactoe-alu4078"
2
+ require "test/unit"
3
+
4
+ class TestSmartPlayer < Test::Unit::TestCase
5
+ def setup
6
+ @sp = TicTacToe::SmartPlayer.new("X")
7
+ end
8
+
9
+ def test_implements_move
10
+ assert_equal true, @sp.respond_to?("move")
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: game-tictactoe-alu4078
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - David Hernández Bethencourt
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &83058270 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *83058270
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &83057920 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *83057920
36
+ - !ruby/object:Gem::Dependency
37
+ name: guard-rspec
38
+ requirement: &83057460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *83057460
47
+ description: Gem which implements tictactoe game with different kinds of players
48
+ email:
49
+ - alu0100536881@ull.edu.es
50
+ executables:
51
+ - tictactoe_game.rb
52
+ - tictactoe_game_players.rb
53
+ extensions: []
54
+ extra_rdoc_files: []
55
+ files:
56
+ - .gitignore
57
+ - .travis.yml
58
+ - Gemfile
59
+ - Gemfile.lock
60
+ - Guardfile
61
+ - README
62
+ - Rakefile
63
+ - bin/tictactoe_game.rb
64
+ - bin/tictactoe_game_players.rb
65
+ - game-tictactoe-alu4078.gemspec
66
+ - lib/game-tictactoe-alu4078.rb
67
+ - lib/game_tictactoe_alu4078/dumbplayer.rb
68
+ - lib/game_tictactoe_alu4078/humanplayer.rb
69
+ - lib/game_tictactoe_alu4078/minimaxplayer.rb
70
+ - lib/game_tictactoe_alu4078/player.rb
71
+ - lib/game_tictactoe_alu4078/smartplayer.rb
72
+ - lib/game_tictactoe_alu4078/tictactoe.rb
73
+ - lib/game_tictactoe_alu4078/version.rb
74
+ - spec/dumbplayer_spec.rb
75
+ - spec/humanplayer_spec.rb
76
+ - spec/minimaxplayer_spec.rb
77
+ - spec/smartplayer_spec.rb
78
+ - test/tc_dumbplayer.rb
79
+ - test/tc_humanplayer.rb
80
+ - test/tc_minimaxplayer.rb
81
+ - test/tc_smartplayer.rb
82
+ homepage: https://github.com/DavidHerBet/LPPpr10.git
83
+ licenses: []
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project: game-tictactoe-alu4078
102
+ rubygems_version: 1.8.11
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: Gem which implements tictactoe game with different kinds of players
106
+ test_files: []