jdl_tictactoe 0.0.5 → 0.0.6

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.
@@ -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: