just_checkers 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +0 -2
- data/lib/just_checkers/direction.rb +16 -4
- data/lib/just_checkers/game_state.rb +40 -12
- data/lib/just_checkers/piece.rb +24 -4
- data/lib/just_checkers/point.rb +22 -5
- data/lib/just_checkers/square.rb +50 -11
- data/lib/just_checkers/square_set.rb +66 -5
- data/lib/just_checkers/vector.rb +25 -8
- data/lib/just_checkers/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e631bf4123ccf99a1c93a0e06eb3b8a46c79682
|
4
|
+
data.tar.gz: 6c872f95204b1afa6912fac02c34141466efedc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e7c12394334a4765f76de167165038745e22f6ed64c82c78818ac1a6abadc583613572ed427906e36076c5dbb21a560229952cecf15bab6442b3e6faf8e0bbb
|
7
|
+
data.tar.gz: 8e723f660f4a4c72b922262265de30a470012a0f8ce81b8458c9b6f995e1d78c5b9252a923b6c5ebedc569d8c3b84178944b2c21f94cb31fba83764fb9960471
|
data/README.md
CHANGED
@@ -51,8 +51,6 @@ Also, the game can be serialized into a hash.
|
|
51
51
|
|
52
52
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
53
53
|
|
54
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
55
|
-
|
56
54
|
## Contributing
|
57
55
|
|
58
56
|
Bug reports and pull requests are welcome on GitHub at https://github.com/mrlhumphreys/just_checkers. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
@@ -7,8 +7,11 @@ module JustCheckers
|
|
7
7
|
|
8
8
|
# New objects can be instantiated with
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
10
|
+
# @param [Fixnum] x
|
11
|
+
# the x magnitude.
|
12
|
+
#
|
13
|
+
# @param [Fixnum] y
|
14
|
+
# the y magnitude.
|
12
15
|
#
|
13
16
|
# ==== Example:
|
14
17
|
# # Instantiates a new Direction
|
@@ -20,9 +23,18 @@ module JustCheckers
|
|
20
23
|
@x, @y = x, y
|
21
24
|
end
|
22
25
|
|
23
|
-
|
26
|
+
# @return [Fixnum] the x magnitude.
|
27
|
+
attr_reader :x
|
28
|
+
|
29
|
+
# @return [Fixnum] the y magnitude.
|
30
|
+
attr_reader :y
|
24
31
|
|
25
|
-
#
|
32
|
+
# Check if directions are equal by seeing if their magnitudes are equal.
|
33
|
+
#
|
34
|
+
# @param [Direction] other
|
35
|
+
# the other direction to compare to.
|
36
|
+
#
|
37
|
+
# @return [Boolean]
|
26
38
|
def ==(other)
|
27
39
|
self.x == other.x && self.y == other.y
|
28
40
|
end
|
@@ -7,10 +7,16 @@ module JustCheckers
|
|
7
7
|
# Represents a game of Checkers in progress.
|
8
8
|
class GameState
|
9
9
|
|
10
|
-
# New objects can be instantiated
|
10
|
+
# New objects can be instantiated.
|
11
11
|
#
|
12
|
-
#
|
13
|
-
#
|
12
|
+
# @param [Hash] args
|
13
|
+
# The data needed for a game
|
14
|
+
#
|
15
|
+
# @option args [Fixnum] :current_player_number
|
16
|
+
# Who's turn it is, 1 or 2
|
17
|
+
#
|
18
|
+
# @option args [Array<Square>] :squares
|
19
|
+
# An array of squares, each with x and y co-ordinates and a piece.
|
14
20
|
#
|
15
21
|
# ==== Example:
|
16
22
|
# # Instantiates a new Game of Checkers
|
@@ -22,11 +28,22 @@ module JustCheckers
|
|
22
28
|
# })
|
23
29
|
def initialize(args = {})
|
24
30
|
@current_player_number = args[:current_player_number]
|
25
|
-
@squares = SquareSet.new(squares: args[:squares])
|
31
|
+
@squares = SquareSet.new(squares: args[:squares] || [])
|
26
32
|
@messages = []
|
27
33
|
end
|
34
|
+
|
35
|
+
# @return [Fixnum] who's turn it is.
|
36
|
+
attr_reader :current_player_number
|
37
|
+
|
38
|
+
# @return [Array<Square>] the board state.
|
39
|
+
attr_reader :squares
|
40
|
+
|
41
|
+
# @return [Array<String>] useful messages if any.
|
42
|
+
attr_reader :messages
|
28
43
|
|
29
44
|
# Instantiates a new GameState object in the starting position
|
45
|
+
#
|
46
|
+
# @return [GameState]
|
30
47
|
def self.default
|
31
48
|
new({
|
32
49
|
current_player_number: 1,
|
@@ -74,19 +91,23 @@ module JustCheckers
|
|
74
91
|
})
|
75
92
|
end
|
76
93
|
|
77
|
-
|
78
|
-
|
79
|
-
#
|
94
|
+
# A hashed serialized representation of the game state
|
95
|
+
#
|
96
|
+
# @return [Hash]
|
80
97
|
def as_json
|
81
98
|
{ current_player_number: current_player_number, squares: squares.as_json, winner: winner }
|
82
99
|
end
|
83
100
|
|
84
101
|
# Returns the json serialized representation of the game state.
|
102
|
+
#
|
103
|
+
# @return String
|
85
104
|
def to_json
|
86
105
|
as_json.to_json
|
87
106
|
end
|
88
107
|
|
89
|
-
#
|
108
|
+
# The player number of the winner. It returns nil if there is no winner.
|
109
|
+
#
|
110
|
+
# @return [Fixnum,NilClass]
|
90
111
|
def winner
|
91
112
|
if squares.occupied_by(1).none? { |s| s.possible_jumps(s.piece, squares).any? || s.possible_moves(s.piece, squares).any? }
|
92
113
|
2
|
@@ -99,16 +120,23 @@ module JustCheckers
|
|
99
120
|
|
100
121
|
# Moves a piece owned by the player, from one square, to another
|
101
122
|
#
|
102
|
-
# * +player_number+ - the player number, 1 or 2
|
103
|
-
# * +from+ - A hash containing x and y co-ordinates.
|
104
|
-
# * +to+ - An array of hashes containing x and y co-ordinates.
|
105
|
-
#
|
106
123
|
# It moves the piece and returns true if the move is valid and it's the player's turn.
|
107
124
|
# It returns false otherwise.
|
108
125
|
#
|
109
126
|
# ==== Example:
|
110
127
|
# # Moves a piece from a square to perform a double jump
|
111
128
|
# game_state.move!(1, {x: 0, y: 1}, [{x: 1, y: 2}, {x: 3, y: 4}])
|
129
|
+
#
|
130
|
+
# @param [Fixnum] player_number
|
131
|
+
# the player number, 1 or 2.
|
132
|
+
#
|
133
|
+
# @param [Hash] from
|
134
|
+
# where the moving piece currently is.
|
135
|
+
#
|
136
|
+
# @param [Array<Hash>] to
|
137
|
+
# each place the piece is going to move to.
|
138
|
+
#
|
139
|
+
# @return [Boolean]
|
112
140
|
def move!(player_number, from, to)
|
113
141
|
@messages = []
|
114
142
|
from_square = squares.find_by_x_and_y(from[:x].to_i, from[:y].to_i)
|
data/lib/just_checkers/piece.rb
CHANGED
@@ -6,9 +6,17 @@ module JustCheckers
|
|
6
6
|
|
7
7
|
# New objects can be instantiated by passing in a hash with
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# @param [Hash] args
|
10
|
+
# The data needed for a piece
|
11
|
+
#
|
12
|
+
# @option args [Fixnum] player_number
|
13
|
+
# the owner of the piece.
|
14
|
+
#
|
15
|
+
# @option args [Fixnum] direction
|
16
|
+
# the direction forward on the board, 1 for moving down, -1 for moving up.
|
17
|
+
#
|
18
|
+
# @option args [Boolean] king
|
19
|
+
# set to true if the piece has been crowned.
|
12
20
|
#
|
13
21
|
# ==== Example:
|
14
22
|
# # Instantiates a new Piece
|
@@ -23,15 +31,27 @@ module JustCheckers
|
|
23
31
|
@king = args[:king]
|
24
32
|
end
|
25
33
|
|
26
|
-
|
34
|
+
# @return [Fixnum] the owner of the piece.
|
35
|
+
attr_reader :player_number
|
36
|
+
|
37
|
+
# @return [Fixnum] the direction forward on the board, 1 for moving down, -1 for moving up.
|
38
|
+
attr_reader :direction
|
39
|
+
|
40
|
+
# @return [Boolean] set to true if the piece has been crowned.
|
41
|
+
attr_reader :king
|
42
|
+
|
27
43
|
alias_method :king?, :king
|
28
44
|
|
29
45
|
# promotes the piece by setting the +king+ attribute to true.
|
46
|
+
#
|
47
|
+
# @return [TrueClass]
|
30
48
|
def promote!
|
31
49
|
@king = true
|
32
50
|
end
|
33
51
|
|
34
52
|
# returns a serialized piece as a hash
|
53
|
+
#
|
54
|
+
# @return [Hash]
|
35
55
|
def as_json
|
36
56
|
{ player_number: player_number, direction: direction, king: king }
|
37
57
|
end
|
data/lib/just_checkers/point.rb
CHANGED
@@ -7,8 +7,11 @@ module JustCheckers
|
|
7
7
|
|
8
8
|
# New objects can be instantiated with
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
10
|
+
# @param [Fixnum] x
|
11
|
+
# the x co-ordinate.
|
12
|
+
#
|
13
|
+
# @param [Fixnum] y
|
14
|
+
# the y co-ordinate.
|
12
15
|
#
|
13
16
|
# ==== Example:
|
14
17
|
# # Instantiates a new Point
|
@@ -20,14 +23,28 @@ module JustCheckers
|
|
20
23
|
@x, @y = x, y
|
21
24
|
end
|
22
25
|
|
23
|
-
|
26
|
+
# @return [Fixnum] the x co-ordinate.
|
27
|
+
attr_reader :x
|
28
|
+
|
29
|
+
# @return [Fixnum] the y co-ordinate.
|
30
|
+
attr_reader :y
|
24
31
|
|
25
|
-
#
|
32
|
+
# Add a point to another point by adding their co-ordinates and returning a new point.
|
33
|
+
#
|
34
|
+
# @param [Point] other
|
35
|
+
# the other point to add.
|
36
|
+
#
|
37
|
+
# @return [Point]
|
26
38
|
def +(other)
|
27
39
|
self.class.new(self.x + other.x, self.y + other.y)
|
28
40
|
end
|
29
41
|
|
30
|
-
#
|
42
|
+
# Check if popints are equal by seeing if their co-ordinates are equal.
|
43
|
+
#
|
44
|
+
# @param [Point] other
|
45
|
+
# the other point to compare to.
|
46
|
+
#
|
47
|
+
# @return [TrueClass, FalseClass]
|
31
48
|
def ==(other)
|
32
49
|
self.x == other.x && self.y == other.y
|
33
50
|
end
|
data/lib/just_checkers/square.rb
CHANGED
@@ -10,9 +10,17 @@ module JustCheckers
|
|
10
10
|
|
11
11
|
# New objects can be instantiated by passing in a hash with
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
13
|
+
# @param [Hash] args
|
14
|
+
# The data needed for a square
|
15
|
+
#
|
16
|
+
# @option args [Fixnum] x
|
17
|
+
# the x co-ordinate of the square.
|
18
|
+
#
|
19
|
+
# @option args [Fixnum] y
|
20
|
+
# the y co-ordinate of the square.
|
21
|
+
#
|
22
|
+
# @option args [Piece,Hash,NilClass] piece
|
23
|
+
# The piece on the square, can be a piece object or hash or nil.
|
16
24
|
#
|
17
25
|
# ==== Example:
|
18
26
|
# # Instantiates a new Square
|
@@ -31,13 +39,22 @@ module JustCheckers
|
|
31
39
|
end
|
32
40
|
end
|
33
41
|
|
34
|
-
|
42
|
+
# @return [Fixnum] the x co-ordinate of the square.
|
43
|
+
attr_reader :x
|
44
|
+
|
45
|
+
# @return [Fixnum] the y co-ordinate of the square.
|
46
|
+
attr_reader :y
|
47
|
+
|
48
|
+
# @return [Piece,NilClass] The piece on the square if any.
|
35
49
|
attr_accessor :piece
|
36
50
|
|
37
51
|
# checks if the square matches the attributes passed.
|
38
52
|
#
|
39
|
-
#
|
40
|
-
#
|
53
|
+
# @param [Symbol] attribute
|
54
|
+
# the square's attribute.
|
55
|
+
#
|
56
|
+
# @param [Object,Hash] value
|
57
|
+
# a value to match on. Can be a hash of attribute/value pairs for deep matching
|
41
58
|
#
|
42
59
|
# ==== Example:
|
43
60
|
# # Check if square has a piece owned by player 1
|
@@ -55,29 +72,51 @@ module JustCheckers
|
|
55
72
|
hash_obj_matcher.call(self, attribute, value)
|
56
73
|
end
|
57
74
|
|
58
|
-
#
|
75
|
+
# Is the square unoccupied by a piece?
|
76
|
+
#
|
77
|
+
# @return [Boolean]
|
59
78
|
def unoccupied?
|
60
79
|
piece.nil?
|
61
80
|
end
|
62
81
|
|
63
|
-
#
|
82
|
+
# A point object with the square's co-ordinates.
|
83
|
+
#
|
84
|
+
# @return [Point]
|
64
85
|
def point
|
65
86
|
Point.new(x, y)
|
66
87
|
end
|
67
88
|
|
68
|
-
#
|
89
|
+
# All squares that a piece on this square could jump to, given the board.
|
90
|
+
#
|
91
|
+
# @param [Piece] piece
|
92
|
+
# the piece on this square
|
93
|
+
#
|
94
|
+
# @param [SquareSet] squares
|
95
|
+
# the board
|
96
|
+
#
|
97
|
+
# @return [SquareSet]
|
69
98
|
def possible_jumps(piece, squares)
|
70
99
|
squares.two_squares_away_from(self).in_direction_of(piece, self).unoccupied.select do |s|
|
71
100
|
squares.between(self, s).occupied_by_opponent_of(piece.player_number).any?
|
72
101
|
end
|
73
102
|
end
|
74
103
|
|
75
|
-
#
|
104
|
+
# All squares that a piece on this square could move to, given the board.
|
105
|
+
#
|
106
|
+
# @param [Piece] piece
|
107
|
+
# the piece on this square
|
108
|
+
#
|
109
|
+
# @param [SquareSet] squares
|
110
|
+
# the board
|
111
|
+
#
|
112
|
+
# @return [SquareSet]
|
76
113
|
def possible_moves(piece, squares)
|
77
114
|
squares.one_square_away_from(self).in_direction_of(piece, self).unoccupied
|
78
115
|
end
|
79
116
|
|
80
|
-
#
|
117
|
+
# A serialized version of the square as a hash
|
118
|
+
#
|
119
|
+
# @return [Hash]
|
81
120
|
def as_json
|
82
121
|
{ x: x, y: y, piece: piece && piece.as_json }
|
83
122
|
end
|
@@ -13,7 +13,11 @@ module JustCheckers
|
|
13
13
|
# New objects can be instantiated by passing in a hash with squares.
|
14
14
|
# They can be square objects or hashes.
|
15
15
|
#
|
16
|
-
#
|
16
|
+
# @param [Hash] args
|
17
|
+
# The data needed for the squares
|
18
|
+
#
|
19
|
+
# @option args [Array<Square,Hash>] squares
|
20
|
+
# An array of squares, each with x and y co-ordinates and a piece.
|
17
21
|
#
|
18
22
|
# ==== Example:
|
19
23
|
# # Instantiates a new Square Set
|
@@ -30,6 +34,7 @@ module JustCheckers
|
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
37
|
+
# @return [Array<Square>] The squares in the set.
|
33
38
|
attr_reader :squares
|
34
39
|
|
35
40
|
def_delegator :squares, :first
|
@@ -40,18 +45,27 @@ module JustCheckers
|
|
40
45
|
def_delegator :squares, :empty?
|
41
46
|
|
42
47
|
# Iterate over the squares with a block and behaves like Enumerable#each.
|
48
|
+
#
|
49
|
+
# @return [Enumerable]
|
43
50
|
def each(&block)
|
44
51
|
squares.each(&block)
|
45
52
|
end
|
46
53
|
|
47
54
|
# Filter the squares with a block and behaves like Enumerable#select.
|
48
55
|
# It returns a SquareSet with the filtered squares.
|
56
|
+
#
|
57
|
+
# @return [SquareSet]
|
49
58
|
def select(&block)
|
50
59
|
self.class.new(squares: squares.select(&block))
|
51
60
|
end
|
52
61
|
|
53
62
|
# Filter the squares with a hash of attribute and matching values.
|
54
63
|
#
|
64
|
+
# @param [Hash] hash
|
65
|
+
# attributes to query for.
|
66
|
+
#
|
67
|
+
# @return [SquareSet]
|
68
|
+
#
|
55
69
|
# ==== Example:
|
56
70
|
# # Find all squares where piece is nil
|
57
71
|
# square_set.where(piece: nil)
|
@@ -64,6 +78,13 @@ module JustCheckers
|
|
64
78
|
|
65
79
|
# Find the square with the matching x and y co-ordinates
|
66
80
|
#
|
81
|
+
# @param [Fixnum] x
|
82
|
+
# the x co-ordinate.
|
83
|
+
#
|
84
|
+
# @param [Fixnum] y
|
85
|
+
# the y co-ordinate.
|
86
|
+
#
|
87
|
+
# @return [Square]
|
67
88
|
# ==== Example:
|
68
89
|
# # Find the square at 4,2
|
69
90
|
# square_set.find_by_x_and_y(4, 2)
|
@@ -72,19 +93,37 @@ module JustCheckers
|
|
72
93
|
end
|
73
94
|
|
74
95
|
# Return all squares that are one square away from the passed square.
|
96
|
+
#
|
97
|
+
# @param [Square] square
|
98
|
+
# the square in question.
|
99
|
+
#
|
100
|
+
# @return [SquareSet]
|
75
101
|
def one_square_away_from(square)
|
76
102
|
select { |s| Vector.new(square, s).magnitude == 1 }
|
77
103
|
end
|
78
104
|
|
79
105
|
# Return all squares that are two squares away from the passed square.
|
106
|
+
#
|
107
|
+
# @param [Square] square
|
108
|
+
# the square in question.
|
109
|
+
#
|
110
|
+
# @return [SquareSet]
|
80
111
|
def two_squares_away_from(square)
|
81
112
|
select { |s| Vector.new(square, s).magnitude == 2 }
|
82
113
|
end
|
83
114
|
|
84
|
-
#
|
115
|
+
# Find squares in the direction of the piece from the square
|
85
116
|
# If the piece is normal, it returns squares in front of it.
|
86
117
|
# If the piece is king, it returns all squares.
|
87
118
|
#
|
119
|
+
# @param [Piece] piece
|
120
|
+
# the piece in question.
|
121
|
+
#
|
122
|
+
# @param [Square] square
|
123
|
+
# the square the piece is on.
|
124
|
+
#
|
125
|
+
# @return [SquareSet]
|
126
|
+
#
|
88
127
|
# ==== Example:
|
89
128
|
# # Get all squares in the direction of the piece.
|
90
129
|
# square_set.in_direction_of(piece, square)
|
@@ -94,7 +133,9 @@ module JustCheckers
|
|
94
133
|
end
|
95
134
|
end
|
96
135
|
|
97
|
-
#
|
136
|
+
# Find all squares without pieces on them.
|
137
|
+
#
|
138
|
+
# @return [SquareSet]
|
98
139
|
def unoccupied
|
99
140
|
select { |s| s.piece.nil? }
|
100
141
|
end
|
@@ -102,6 +143,14 @@ module JustCheckers
|
|
102
143
|
# Returns squares between a and b.
|
103
144
|
# Only squares that are in the same diagonal will return squares.
|
104
145
|
#
|
146
|
+
# @param [Square] a
|
147
|
+
# a square.
|
148
|
+
#
|
149
|
+
# @param [Square] b
|
150
|
+
# another square.
|
151
|
+
#
|
152
|
+
# @return [SquareSet]
|
153
|
+
#
|
105
154
|
# ==== Example:
|
106
155
|
# # Get all squares between square_a and square_b
|
107
156
|
# square_set.between(square_a, square_b)
|
@@ -125,12 +174,22 @@ module JustCheckers
|
|
125
174
|
self.class.new(squares: squares)
|
126
175
|
end
|
127
176
|
|
128
|
-
#
|
177
|
+
# Takes a player number and returns all squares occupied by the opponent of the player
|
178
|
+
#
|
179
|
+
# @param [Fixnum] player_number
|
180
|
+
# the player's number.
|
181
|
+
#
|
182
|
+
# @return [SquareSet]
|
129
183
|
def occupied_by_opponent_of(player_number)
|
130
184
|
select { |s| s.piece && s.piece.player_number != player_number }
|
131
185
|
end
|
132
186
|
|
133
|
-
#
|
187
|
+
# Takes a player number and returns all squares occupied by the player
|
188
|
+
#
|
189
|
+
# @param [Fixnum] player_number
|
190
|
+
# the player's number.
|
191
|
+
#
|
192
|
+
# @return [SquareSet]
|
134
193
|
def occupied_by(player_number)
|
135
194
|
select { |s| s.piece && s.piece.player_number == player_number }
|
136
195
|
end
|
@@ -138,6 +197,8 @@ module JustCheckers
|
|
138
197
|
attr_reader :squares
|
139
198
|
|
140
199
|
# serializes the squares as a hash
|
200
|
+
#
|
201
|
+
# @return [Hash]
|
141
202
|
def as_json
|
142
203
|
squares.map(&:as_json)
|
143
204
|
end
|
data/lib/just_checkers/vector.rb
CHANGED
@@ -9,8 +9,11 @@ module JustCheckers
|
|
9
9
|
|
10
10
|
# New objects can be instantiated by passing in a two points with x and y co-ordinates
|
11
11
|
#
|
12
|
-
#
|
13
|
-
#
|
12
|
+
# @param [Point] a
|
13
|
+
# the start point.
|
14
|
+
#
|
15
|
+
# @param [Point] b
|
16
|
+
# the end point.
|
14
17
|
#
|
15
18
|
# ==== Example:
|
16
19
|
# # Instantiates a new Vector
|
@@ -22,9 +25,15 @@ module JustCheckers
|
|
22
25
|
@a, @b = a, b
|
23
26
|
end
|
24
27
|
|
25
|
-
|
28
|
+
# @return [Point] the start point.
|
29
|
+
attr_reader :a
|
30
|
+
|
31
|
+
# @return [Point] the end point.
|
32
|
+
attr_reader :b
|
26
33
|
|
27
|
-
#
|
34
|
+
# How big the vector is if it's diagonal, otherwise, nil.
|
35
|
+
#
|
36
|
+
# @return [Fixnum,NilClass]
|
28
37
|
def magnitude
|
29
38
|
if diagonal
|
30
39
|
dx.abs
|
@@ -33,12 +42,16 @@ module JustCheckers
|
|
33
42
|
end
|
34
43
|
end
|
35
44
|
|
36
|
-
#
|
45
|
+
# The direction of the vector as a object
|
46
|
+
#
|
47
|
+
# @return [Direction]
|
37
48
|
def direction
|
38
49
|
Direction.new(direction_x, direction_y)
|
39
50
|
end
|
40
51
|
|
41
|
-
#
|
52
|
+
# The x component of the direction, 1 if moving down, -1 if moving up, 0 otherwise
|
53
|
+
#
|
54
|
+
# @return [Fixnum]
|
42
55
|
def direction_x
|
43
56
|
if dx > 0
|
44
57
|
1
|
@@ -49,7 +62,9 @@ module JustCheckers
|
|
49
62
|
end
|
50
63
|
end
|
51
64
|
|
52
|
-
#
|
65
|
+
# The y component of the direction, 1 if moving right, -1 if moving left, 0 otherwise
|
66
|
+
#
|
67
|
+
# @return [Fixnum]
|
53
68
|
def direction_y
|
54
69
|
if dy > 0
|
55
70
|
1
|
@@ -60,7 +75,9 @@ module JustCheckers
|
|
60
75
|
end
|
61
76
|
end
|
62
77
|
|
63
|
-
#
|
78
|
+
# Is the vector diagonal?
|
79
|
+
#
|
80
|
+
# @return [Boolean]
|
64
81
|
def diagonal
|
65
82
|
dx.abs == dy.abs
|
66
83
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: just_checkers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Humphreys
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -103,3 +103,4 @@ signing_key:
|
|
103
103
|
specification_version: 4
|
104
104
|
summary: A checkers engine written in ruby
|
105
105
|
test_files: []
|
106
|
+
has_rdoc:
|