swttt-gem 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.DS_Store ADDED
Binary file
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "shoulda", ">= 0"
10
+ gem "bundler", "~> 1.0.0"
11
+ gem "jeweler", "~> 1.5.2"
12
+ gem "rcov", ">= 0"
13
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,20 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ git (1.2.5)
5
+ jeweler (1.5.2)
6
+ bundler (~> 1.0.0)
7
+ git (>= 1.2.5)
8
+ rake
9
+ rake (0.8.7)
10
+ rcov (0.9.9)
11
+ shoulda (2.11.3)
12
+
13
+ PLATFORMS
14
+ ruby
15
+
16
+ DEPENDENCIES
17
+ bundler (~> 1.0.0)
18
+ jeweler (~> 1.5.2)
19
+ rcov
20
+ shoulda
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Stephen Walker
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = swttt-gem
2
+
3
+ TTT Gem
4
+
5
+ == Contributing to swttt-gem
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Stephen Walker. See LICENSE.txt for
18
+ further details.
19
+
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "swttt-gem"
16
+ gem.homepage = "http://github.com/swalke8/swttt-gem"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{SWTTT Gem}
19
+ gem.description = %Q{TTT Gem}
20
+ gem.email = "stephenwalker1988@gmail.com"
21
+ gem.authors = ["Stephen Walker"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rake/testtask'
30
+ Rake::TestTask.new(:test) do |test|
31
+ test.libs << 'lib' << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+
36
+ require 'rcov/rcovtask'
37
+ Rcov::RcovTask.new do |test|
38
+ test.libs << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "swttt-gem #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/lib/board.rb ADDED
@@ -0,0 +1,80 @@
1
+ class Board
2
+ attr_reader :game_history, :dimension, :game_board, :player_value, :board,
3
+ :sum_of_row, :sum_of_column, :left_diagonal, :right_diagonal
4
+
5
+ def initialize(dimension = 3)
6
+ @dimension = dimension
7
+ @game_history, @board = [], [[0,0,0],[0,0,0],[0,0,0]]
8
+ @sum_of_row, @sum_of_column = [0,0,0], [0,0,0]
9
+ @left_diagonal, @right_diagonal = 0, 0
10
+ end
11
+
12
+ def move(row, column, value = nil)
13
+ @board[row][column] = value || player_value
14
+ update_sums(row, column, value || player_value)
15
+ @game_history << Move.new(row, column, value || player_value)
16
+ end
17
+
18
+ def undo_move
19
+ move = @game_history.pop
20
+ update_sums(move.row, move.column, -player_value)
21
+ @board[move.row][move.column] = 0
22
+ end
23
+
24
+ def number_of_moves_made
25
+ @game_history.size
26
+ end
27
+
28
+ def is_empty_at?(row, column)
29
+ @board[row][column].zero?
30
+ end
31
+
32
+ def full?
33
+ @game_history.size == @dimension*@dimension
34
+ end
35
+
36
+ def player_value
37
+ value = -(number_of_moves_made % 2)
38
+ value = 1 if value.zero?
39
+ return value
40
+ end
41
+
42
+ def print
43
+ (0...@dimension).each { |row| print_row(row) }
44
+ end
45
+
46
+ private
47
+
48
+ def print_row(row)
49
+ puts ""
50
+ (0...@dimension).each { |column| print_square(row, column) }
51
+ end
52
+
53
+ def print_square(row, column)
54
+ putc "["
55
+ putc "X" if @board[row][column] == 1
56
+ putc"O" if @board[row][column] == -1
57
+ putc " " if @board[row][column].zero?
58
+ putc "]"
59
+ end
60
+
61
+ def update_sums(row, column, update_value)
62
+ @sum_of_row[row] += update_value
63
+ @sum_of_column[column] += update_value
64
+ @left_diagonal += update_value if row == column
65
+ @right_diagonal += update_value if row == @dimension - column - 1
66
+ end
67
+ end
68
+
69
+ class Move
70
+ attr_reader :row, :column, :player_value
71
+ def initialize(row,column, player_value = 1)
72
+ @row, @column, @player_value = row, column, player_value
73
+ end
74
+
75
+ def ==(other)
76
+ return other.is_a?(Move) && self.row == other.row && self.column == other.column
77
+ end
78
+ end
79
+
80
+
@@ -0,0 +1,33 @@
1
+ class GameObserver
2
+
3
+ def initialize(board)
4
+ @game_board = board
5
+ end
6
+
7
+ def game_over?
8
+ @game_board.full? || has_winner?
9
+ end
10
+
11
+ def has_winner?
12
+ horizontal_win? || vertical_win? || diagonal_win?
13
+ end
14
+
15
+ private
16
+
17
+ def loop_array
18
+ (0...@game_board.dimension).each { |index| return true if yield(index) == @game_board.dimension }
19
+ false
20
+ end
21
+
22
+ def horizontal_win?
23
+ loop_array { |row| @game_board.sum_of_row[row].abs }
24
+ end
25
+
26
+ def vertical_win?
27
+ loop_array { |column| @game_board.sum_of_column[column].abs }
28
+ end
29
+
30
+ def diagonal_win?
31
+ @game_board.left_diagonal.abs == @game_board.dimension || @game_board.right_diagonal.abs == @game_board.dimension
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ require 'Board'
2
+
3
+ class HumanPlayer
4
+ def initialize(board)
5
+ @game_board = board
6
+ end
7
+
8
+ def move(row, column)
9
+ if @game_board.is_empty_at?(row, column)
10
+ @game_board.move(row,column)
11
+ return true
12
+ end
13
+ return false
14
+ end
15
+ end
@@ -0,0 +1,88 @@
1
+ class MinimaxComputer
2
+
3
+ def initialize(board, observer)
4
+ @game_board, @observer = board, observer
5
+ @first_move = [Move.new(0,0),
6
+ Move.new(0,@game_board.dimension-1),
7
+ Move.new(@game_board.dimension-1,0),
8
+ Move.new(@game_board.dimension-1, @game_board.dimension-1)]
9
+ @my_player_value = @game_board.player_value
10
+ end
11
+
12
+ def make_move(iteration = 0)
13
+ if first_move?
14
+ move = first_move
15
+ return @game_board.move(move.row, move.column)
16
+ end
17
+ return path_score_result if @observer.game_over?
18
+ mini_max(iteration)
19
+ end
20
+
21
+ private
22
+
23
+ def first_move?
24
+ @game_board.number_of_moves_made < 2
25
+ end
26
+
27
+ def first_move
28
+ if !@first_move.include?(@game_board.game_history.first)
29
+ move = @first_move[rand(@first_move.size)]
30
+ else
31
+ middle = @game_board.dimension/2
32
+ move = Move.new(middle, middle)
33
+ end
34
+ end
35
+
36
+ def path_score_result
37
+ return -@game_board.player_value if @observer.has_winner?
38
+ return 0
39
+ end
40
+
41
+ def mini_max(iteration)
42
+ best_moves = BestMove.new(@game_board, @my_player_value)
43
+ for_each_cell { |row, column| best_moves.add_better_move(best_moves.value, path_score(row, column,iteration),
44
+ Move.new(row, column)) if @game_board.is_empty_at?(row, column) }
45
+ return best_moves.value if !iteration.zero?
46
+ move = best_moves.random
47
+ @game_board.move(move.row, move.column) if !@observer.game_over?
48
+ end
49
+
50
+ def for_each_cell
51
+ (0...@game_board.dimension).each do |row|
52
+ (0...@game_board.dimension).each { |column| yield(row, column) }
53
+ end
54
+ end
55
+
56
+ def path_score(row, column, iteration)
57
+ @game_board.move(row, column)
58
+ score = make_move(iteration + 1)
59
+ @game_board.undo_move
60
+ return score
61
+ end
62
+ end
63
+
64
+ class BestMove
65
+ attr_accessor :moves, :value
66
+ def initialize(game_board, my_player_value)
67
+ @moves = []
68
+ @value = nil
69
+ @game_board, @my_player_value = game_board, my_player_value
70
+ end
71
+
72
+ def random
73
+ @moves[rand(@moves.size)]
74
+ end
75
+
76
+ def add_better_move(best_score, path_score, move)
77
+ if better_or_equal_move?(best_score, path_score)
78
+ @moves.clear and @value = path_score if path_score != @value
79
+ @moves << move
80
+ end
81
+ end
82
+
83
+ def better_or_equal_move?(best_score, path_score)
84
+ (best_score.nil?) or
85
+ (path_score >= best_score && @game_board.player_value == @my_player_value) or
86
+ (path_score <= best_score && @game_board.player_value != @my_player_value)
87
+ end
88
+ end
data/lib/swttt-gem.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'board'
2
+ require 'game_observer'
3
+ require 'minimax_computer'
4
+ require 'human_player'
@@ -0,0 +1,129 @@
1
+ require 'board'
2
+
3
+ describe Board do
4
+
5
+ before(:each) do
6
+ @my_board = Board.new
7
+ end
8
+
9
+ def double_loop
10
+ (0...@my_board.dimension).each do |row|
11
+ (0...@my_board.dimension).each do |column|
12
+ yield(row, column)
13
+ end
14
+ end
15
+ end
16
+
17
+ it "should create a board" do
18
+ @my_board.nil?.should == false
19
+ end
20
+
21
+ it "should check for a full board" do
22
+ double_loop { |row, column| @my_board.move(row, column) }
23
+ @my_board.full?.should == true
24
+ end
25
+
26
+ context "game history" do
27
+ it "is empty" do
28
+ @my_board.game_history == []
29
+ end
30
+
31
+ before do
32
+ @my_board.move(1,1)
33
+ end
34
+
35
+ it "has a move" do
36
+ @my_board.game_history.should == [Move.new(1,1)]
37
+ end
38
+
39
+ it "can recall last move" do
40
+ @my_board.game_history.last.should == Move.new(1,1)
41
+ end
42
+
43
+ it "can undo the last move" do
44
+ @my_board.move(1,2)
45
+ @my_board.game_history.last.should == Move.new(1,2,-1)
46
+ @my_board.undo_move
47
+ @my_board.game_history.should == [Move.new(1,1,1)]
48
+ end
49
+
50
+ it "decrements the number of moves" do
51
+ @my_board.undo_move
52
+ @my_board.number_of_moves_made.should == 0
53
+ end
54
+ end
55
+
56
+ it "has a player value" do
57
+ @my_board.player_value.should == 1
58
+ end
59
+
60
+ it "should update the player value with each move" do
61
+ @my_board.move(1,2)
62
+ @my_board.player_value.should == -1
63
+ end
64
+
65
+ it "should update the player value with each undo" do
66
+ @my_board.move(1,1)
67
+ @my_board.undo_move
68
+ @my_board.move(1,2)
69
+ @my_board.player_value.should == -1
70
+ end
71
+
72
+ it "can override the player_value" do
73
+ @my_board.move(1,2,1)
74
+ @my_board.move(0,0,1)
75
+ @my_board.player_value.should == 1
76
+ end
77
+
78
+ it "has a 3x3 board" do
79
+ @my_board.board.size.should == 3
80
+ @my_board.board[1].size.should == 3
81
+ end
82
+
83
+ it "updates the board when move is called" do
84
+ @my_board.move(0,0)
85
+ @my_board.board[0][0].should == 1
86
+ end
87
+
88
+ it "undos the board" do
89
+ @my_board.move(2,2)
90
+ @my_board.undo_move
91
+ @my_board.board[2][2].should == 0
92
+ end
93
+
94
+ context "sum values" do
95
+
96
+ before do
97
+ @my_board.move(1,1)
98
+ end
99
+
100
+ it "should update sum of row" do
101
+ @my_board.sum_of_row[1].should == 1
102
+ end
103
+
104
+ it "should update sum of column" do
105
+ @my_board.sum_of_column[1].should == 1
106
+ end
107
+
108
+ it "should update the diagonals" do
109
+ @my_board.left_diagonal.should == 1
110
+ @my_board.right_diagonal.should == 1
111
+ end
112
+
113
+ it "should undo sum of row" do
114
+ @my_board.undo_move
115
+ @my_board.sum_of_row[1].should == 0
116
+ end
117
+
118
+ it "should undo sum of column" do
119
+ @my_board.undo_move
120
+ @my_board.sum_of_column[1].should == 0
121
+ end
122
+
123
+ it "should undo diagonals" do
124
+ @my_board.undo_move
125
+ @my_board.left_diagonal.should == 0
126
+ @my_board.right_diagonal.should == 0
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,39 @@
1
+ require 'game_observer'
2
+ require 'board'
3
+
4
+ describe GameObserver do
5
+
6
+ before(:each) do
7
+ @my_board = Board.new
8
+ @observer = GameObserver.new(@my_board)
9
+ end
10
+
11
+ def loop
12
+ (0...@my_board.dimension).each { |position| yield(position) }
13
+ end
14
+
15
+ it "detects a horizontal win" do
16
+ loop { |column| @my_board.move(0,column,1) }
17
+ @observer.has_winner?.should == true
18
+ end
19
+
20
+ it "detects a vertical win" do
21
+ loop { |row| @my_board.move(row,0,1) }
22
+ @observer.has_winner?.should == true
23
+ end
24
+
25
+ it "detects a left diagonal win" do
26
+ loop { |position| @my_board.move(position,position,1) }
27
+ @observer.has_winner?.should == true
28
+ end
29
+
30
+ it "detects a right diagonal win" do
31
+ loop { |position| @my_board.move(@my_board.dimension-position-1,position,1) }
32
+ @observer.has_winner?.should == true
33
+ end
34
+
35
+ it "detects if the game is over" do
36
+ loop { |row| loop { |column| @my_board.move(row, column, 2) } }
37
+ @observer.game_over?.should == true
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ require 'human_player'
2
+ require 'board'
3
+
4
+ describe HumanPlayer do
5
+
6
+ before(:each) do
7
+ @board = Board.new
8
+ @player = HumanPlayer.new(@board)
9
+ end
10
+
11
+ it "should take a move" do
12
+ @player.move(1,2).should be_true
13
+ end
14
+
15
+ it "should make a move" do
16
+ @player.move(1,2)
17
+ @board.is_empty_at?(1,2).should be_false
18
+ end
19
+
20
+ it "cannot move on an occupied space" do
21
+ @player.move(0,0)
22
+ @player.move(0,0).should be_false
23
+ end
24
+
25
+ end
@@ -0,0 +1,27 @@
1
+ require 'minimax_computer'
2
+ require 'board'
3
+ require 'game_observer'
4
+
5
+ describe MinimaxComputer do
6
+
7
+ before(:each) do
8
+ @my_board = Board.new
9
+ @observer = GameObserver.new(@my_board)
10
+ @computer = MinimaxComputer.new(@my_board, @observer)
11
+ end
12
+
13
+
14
+ it "has a minimax player" do
15
+ @computer.nil?.should be_false
16
+ end
17
+
18
+ it "has a move" do
19
+ @computer.make_move.nil?.should be_false
20
+ end
21
+
22
+ it "always end in a cats game" do
23
+ (0...9).each { @computer.make_move }
24
+ @observer.game_over?.should be_true
25
+ @observer.has_winner?.should be_false
26
+ end
27
+ end
data/spec/move_spec.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'board'
2
+
3
+ describe Move do
4
+
5
+ before(:each) do
6
+ @move1 = Move.new(1,1)
7
+ end
8
+
9
+ it "is comparable" do
10
+ move2 = Move.new(1,1)
11
+ @move1.should == move2
12
+ end
13
+
14
+ it "can only compare to a Move" do
15
+ class Other
16
+ attr_reader :row, :column
17
+ def initialize(row, column)
18
+ @row, @column = row, column
19
+ end
20
+ end
21
+ @move1.should_not == Other.new(1,1)
22
+ end
23
+
24
+ it "stores a player value" do
25
+ @move1.player_value.should == 1
26
+ end
27
+ end
@@ -0,0 +1 @@
1
+ $: << File.join(File.dirname(__FILE__), "..", "lib")
data/swttt-gem.gemspec ADDED
@@ -0,0 +1,80 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{swttt-gem}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Stephen Walker"]
12
+ s.date = %q{2011-05-03}
13
+ s.description = %q{TTT Gem}
14
+ s.email = %q{stephenwalker1988@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".DS_Store",
21
+ ".document",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "lib/board.rb",
29
+ "lib/game_observer.rb",
30
+ "lib/human_player.rb",
31
+ "lib/minimax_computer.rb",
32
+ "lib/swttt-gem.rb",
33
+ "spec/board_spec.rb",
34
+ "spec/game_observer_spec.rb",
35
+ "spec/human_player_spec.rb",
36
+ "spec/minimax_computer_spec.rb",
37
+ "spec/move_spec.rb",
38
+ "spec/spec_helper.rb",
39
+ "swttt-gem.gemspec",
40
+ "test/helper.rb",
41
+ "test/test_swttt-gem.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/swalke8/swttt-gem}
44
+ s.licenses = ["MIT"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.6.2}
47
+ s.summary = %q{SWTTT Gem}
48
+ s.test_files = [
49
+ "spec/board_spec.rb",
50
+ "spec/game_observer_spec.rb",
51
+ "spec/human_player_spec.rb",
52
+ "spec/minimax_computer_spec.rb",
53
+ "spec/move_spec.rb",
54
+ "spec/spec_helper.rb",
55
+ "test/helper.rb",
56
+ "test/test_swttt-gem.rb"
57
+ ]
58
+
59
+ if s.respond_to? :specification_version then
60
+ s.specification_version = 3
61
+
62
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
64
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
65
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
66
+ s.add_development_dependency(%q<rcov>, [">= 0"])
67
+ else
68
+ s.add_dependency(%q<shoulda>, [">= 0"])
69
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
71
+ s.add_dependency(%q<rcov>, [">= 0"])
72
+ end
73
+ else
74
+ s.add_dependency(%q<shoulda>, [">= 0"])
75
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
76
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
77
+ s.add_dependency(%q<rcov>, [">= 0"])
78
+ end
79
+ end
80
+
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'swttt-gem'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,4 @@
1
+ require 'helper'
2
+
3
+ class TestSwtttGem < Test::Unit::TestCase
4
+ end
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: swttt-gem
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Stephen Walker
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-03 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ type: :development
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ name: shoulda
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ prerelease: false
37
+ type: :development
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 23
44
+ segments:
45
+ - 1
46
+ - 0
47
+ - 0
48
+ version: 1.0.0
49
+ name: bundler
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ prerelease: false
53
+ type: :development
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 7
60
+ segments:
61
+ - 1
62
+ - 5
63
+ - 2
64
+ version: 1.5.2
65
+ name: jeweler
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ prerelease: false
69
+ type: :development
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ name: rcov
80
+ version_requirements: *id004
81
+ description: TTT Gem
82
+ email: stephenwalker1988@gmail.com
83
+ executables: []
84
+
85
+ extensions: []
86
+
87
+ extra_rdoc_files:
88
+ - LICENSE.txt
89
+ - README.rdoc
90
+ files:
91
+ - .DS_Store
92
+ - .document
93
+ - Gemfile
94
+ - Gemfile.lock
95
+ - LICENSE.txt
96
+ - README.rdoc
97
+ - Rakefile
98
+ - VERSION
99
+ - lib/board.rb
100
+ - lib/game_observer.rb
101
+ - lib/human_player.rb
102
+ - lib/minimax_computer.rb
103
+ - lib/swttt-gem.rb
104
+ - spec/board_spec.rb
105
+ - spec/game_observer_spec.rb
106
+ - spec/human_player_spec.rb
107
+ - spec/minimax_computer_spec.rb
108
+ - spec/move_spec.rb
109
+ - spec/spec_helper.rb
110
+ - swttt-gem.gemspec
111
+ - test/helper.rb
112
+ - test/test_swttt-gem.rb
113
+ has_rdoc: true
114
+ homepage: http://github.com/swalke8/swttt-gem
115
+ licenses:
116
+ - MIT
117
+ post_install_message:
118
+ rdoc_options: []
119
+
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ requirements: []
141
+
142
+ rubyforge_project:
143
+ rubygems_version: 1.6.2
144
+ signing_key:
145
+ specification_version: 3
146
+ summary: SWTTT Gem
147
+ test_files:
148
+ - spec/board_spec.rb
149
+ - spec/game_observer_spec.rb
150
+ - spec/human_player_spec.rb
151
+ - spec/minimax_computer_spec.rb
152
+ - spec/move_spec.rb
153
+ - spec/spec_helper.rb
154
+ - test/helper.rb
155
+ - test/test_swttt-gem.rb