jdl_tictactoe 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,95 +1,97 @@
1
- class JdlTictactoe::Game::Board
2
-
3
- attr_reader :size, :squares
4
-
5
- def initialize(size=3)
6
- @size = size
7
- @squares = initialize_squares(size)
8
- end
9
-
10
- def mark_square(square_index, marker)
11
- row, column = translate_index(square_index)
12
- squares[row][column] = marker
13
- end
14
-
15
- def undo_move(square_index)
16
- row, column = translate_index(square_index)
17
- squares[row][column] = nil
18
- end
19
-
20
- def value_at(square_index)
21
- row, column = translate_index(square_index)
22
- squares[row][column]
23
- end
24
-
25
- def winner?(mark)
26
- horizontal_winner?(mark) || vertical_winner?(mark) || first_diagonal_winner?(mark) || second_diagonal_winner?(mark)
27
- end
28
-
29
- def draw?(player)
30
- return true if empty_squares.length == 0 && ( !winner?(player.mark) || !winner?(player.opponent.mark) )
31
- end
32
-
33
- def empty_squares
34
- @squares.flatten.each_with_index.collect { |sq, i| i+1 if sq == nil}.compact
35
- end
36
-
37
- def score(player)
38
- return 1 if winner?(player.mark)
39
- return -1 if winner?(player.opponent.mark)
40
- return 0 if draw?(player)
41
- end
42
-
43
- private
44
-
45
- def first_diagonal_winner?(mark)
46
- diagonal = []
47
- size.times do |row|
48
- diagonal << squares[row][row]
49
- end
50
- winner_in_collection?(diagonal, mark)
51
- end
52
-
53
- def second_diagonal_winner?(mark)
54
- diagonal = []
55
- size.times do |row|
56
- diagonal << squares[row][size - row - 1]
57
- end
58
- winner_in_collection?(diagonal, mark)
59
- end
60
-
61
- def vertical_winner?(mark)
62
- size.times do |index|
63
- column = []
64
- size.times do |row|
65
- column << squares[row][index]
66
- end
67
- return true if winner_in_collection?(column, mark)
68
- end
69
- false
70
- end
71
-
72
- def horizontal_winner?(mark)
73
- squares.reduce(false) do |winner, row|
74
- winner || winner_in_collection?(row, mark)
75
- end
76
- end
77
-
78
- def winner_in_collection?(collection, mark)
79
- !collection.include?(nil) && collection.uniq.size == 1 && collection.include?(mark)
80
- end
81
-
82
- def initialize_squares(size)
83
- squares = []
84
- size.times { squares << ([nil]*size) }
85
- return squares
86
- end
87
-
88
- def translate_index(square_index)
89
- square_index -= 1
90
- row = square_index / size
91
- column = square_index % size
92
- return row, column
93
- end
94
-
1
+ module JdlTicTacToe
2
+ class Board
3
+
4
+ attr_reader :size, :squares
5
+
6
+ def initialize(size=3)
7
+ @size = size
8
+ @squares = initialize_squares(size)
9
+ end
10
+
11
+ def mark_square(square_index, marker)
12
+ row, column = translate_index(square_index)
13
+ squares[row][column] = marker
14
+ end
15
+
16
+ def undo_move(square_index)
17
+ row, column = translate_index(square_index)
18
+ squares[row][column] = nil
19
+ end
20
+
21
+ def value_at(square_index)
22
+ row, column = translate_index(square_index)
23
+ squares[row][column]
24
+ end
25
+
26
+ def winner?(mark)
27
+ horizontal_winner?(mark) || vertical_winner?(mark) || first_diagonal_winner?(mark) || second_diagonal_winner?(mark)
28
+ end
29
+
30
+ def draw?(player)
31
+ return true if empty_squares.length == 0 && ( !winner?(player.mark) || !winner?(player.opponent.mark) )
32
+ end
33
+
34
+ def empty_squares
35
+ @squares.flatten.each_with_index.collect { |sq, i| i+1 if sq == nil}.compact
36
+ end
37
+
38
+ def score(player)
39
+ return 1 if winner?(player.mark)
40
+ return -1 if winner?(player.opponent.mark)
41
+ return 0 if draw?(player)
42
+ end
43
+
44
+ private
45
+
46
+ def first_diagonal_winner?(mark)
47
+ diagonal = []
48
+ size.times do |row|
49
+ diagonal << squares[row][row]
50
+ end
51
+ winner_in_collection?(diagonal, mark)
52
+ end
53
+
54
+ def second_diagonal_winner?(mark)
55
+ diagonal = []
56
+ size.times do |row|
57
+ diagonal << squares[row][size - row - 1]
58
+ end
59
+ winner_in_collection?(diagonal, mark)
60
+ end
61
+
62
+ def vertical_winner?(mark)
63
+ size.times do |index|
64
+ column = []
65
+ size.times do |row|
66
+ column << squares[row][index]
67
+ end
68
+ return true if winner_in_collection?(column, mark)
69
+ end
70
+ false
71
+ end
72
+
73
+ def horizontal_winner?(mark)
74
+ squares.reduce(false) do |winner, row|
75
+ winner || winner_in_collection?(row, mark)
76
+ end
77
+ end
78
+
79
+ def winner_in_collection?(collection, mark)
80
+ !collection.include?(nil) && collection.uniq.size == 1 && collection.include?(mark)
81
+ end
82
+
83
+ def initialize_squares(size)
84
+ squares = []
85
+ size.times { squares << ([nil]*size) }
86
+ return squares
87
+ end
88
+
89
+ def translate_index(square_index)
90
+ square_index -= 1
91
+ row = square_index / size
92
+ column = square_index % size
93
+ return row, column
94
+ end
95
+
96
+ end
95
97
  end
@@ -1,39 +1,41 @@
1
- class JdlTictactoe::Game
1
+ module JdlTicTacToe
2
+ class Game
2
3
 
3
- attr_accessor :player1, :player2, :turn, :board
4
+ attr_accessor :player1, :player2, :turn, :board
4
5
 
5
- def initialize(player1, player2, size=3)
6
- @player1 = player1
7
- @player2 = player2
8
- @turn = :player1
9
- @board = Board.new(size)
10
- set_opponents(@player1, @player2)
11
- end
6
+ def initialize(player1, player2, size=3)
7
+ @player1 = player1
8
+ @player2 = player2
9
+ @turn = :player1
10
+ @board = Board.new(size)
11
+ set_opponents(@player1, @player2)
12
+ end
12
13
 
13
- def switch_turn(turn)
14
- @turn = :player2 if turn == :player1
15
- @turn = :player1 if turn == :player2
16
- return @turn
17
- end
14
+ def switch_turn(turn)
15
+ @turn = :player2 if turn == :player1
16
+ @turn = :player1 if turn == :player2
17
+ return @turn
18
+ end
18
19
 
19
- def over?
20
- return true if winner?(@player1.mark) || winner?(@player2.mark) || empty_squares.count == 0
21
- end
20
+ def over?
21
+ return true if winner?(@player1.mark) || winner?(@player2.mark) || empty_squares.count == 0
22
+ end
22
23
 
23
- private
24
+ private
24
25
 
25
- def set_opponents(player1, player2)
26
- player1.opponent = player2
27
- player2.opponent = player1
28
- end
26
+ def set_opponents(player1, player2)
27
+ player1.opponent = player2
28
+ player2.opponent = player1
29
+ end
29
30
 
30
- def method_missing(method_name, *args)
31
- delegated_methods = [:empty_squares, :winner?, :mark_square, :undo_move]
32
- if delegated_methods.include?(method_name)
33
- self.board.send(method_name, *args)
34
- else
35
- raise NoMethodError.new("Undefined method #{method_name} called on Game")
31
+ def method_missing(method_name, *args)
32
+ delegated_methods = [:empty_squares, :winner?, :mark_square, :undo_move]
33
+ if delegated_methods.include?(method_name)
34
+ self.board.send(method_name, *args)
35
+ else
36
+ raise NoMethodError.new("Undefined method #{method_name} called on Game")
37
+ end
36
38
  end
37
- end
38
39
 
40
+ end
39
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jdl_tictactoe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: