ari_chess 1.1.0 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e585e588e19ed3831464788d43fa361379491a05
4
- data.tar.gz: d338793003e5d77b78c10334ac8cda065f2dd50c
3
+ metadata.gz: 0e68a6f8b5a6e22e6c5db0dbf2078bea34e702fa
4
+ data.tar.gz: a316bdf89347ba6ee4403660c46a260ca68ca0d2
5
5
  SHA512:
6
- metadata.gz: 2d98651dd5cfa93d7fafa750e6bc6a52ceb8287c2ac522afc12c0d9e605017b74c4757e12845e5b0d20cfe8548f599522a8f40ecf717effbc2cfb005346c3c0f
7
- data.tar.gz: fe9fb67bffaaafe01f7b2d069c39aeec1a14646017a6dcfa5d5fb5e2a1dd2ebe1c90f87be2244dbfdb1482215a507f18cfb559ac42e6f6f08a6c10a5d770f7c3
6
+ metadata.gz: ecf272f68effb6ad157d595d99a420e62b593cb9ef3e0e1cd456a0e4f9cd21281280adef0519c8bd3467dc883f0d3bf039432663663a686be17cbaaf18ddd949
7
+ data.tar.gz: b7e2358fa830ed775d6f373b8f010c6849cfe51bb5e88564427b3c0584560cf0e98ab22f1a183c7abb1fea1b8566b982db4295543aec32b0e36b40b2f652859c
@@ -1,7 +1,5 @@
1
1
  class InvalidMoveError < StandardError
2
- attr_reader :message
3
-
4
- def initialize(message = nil)
5
- @message ||= "Invalid move!"
2
+ def initialize(message = "Invalid move!")
3
+ super(message)
6
4
  end
7
5
  end
@@ -32,8 +32,9 @@ class Game
32
32
  def play_turn
33
33
  board.move(*get_move)
34
34
  rescue InvalidMoveError => e
35
- puts e.message
36
- retry
35
+ print "\n"
36
+ puts e.message
37
+ retry
37
38
  end
38
39
 
39
40
  def get_move
@@ -41,7 +42,6 @@ class Game
41
42
  parse_positions(input)
42
43
  end
43
44
 
44
-
45
45
  def parse_positions(input)
46
46
  matched_input = /\s*(\w\d),*\s*(\w\d)\s*/.match(input)
47
47
  raise InvalidMoveError if matched_input.nil?
@@ -62,7 +62,7 @@ class Game
62
62
  error_message = "Invalid move! Chosen piece is not yours."
63
63
  end
64
64
 
65
- raise InvalidMoveError.new(error_message) unless error_message.nil?
65
+ raise InvalidMoveError.new, error_message unless error_message.nil?
66
66
 
67
67
  nil
68
68
  end
@@ -76,10 +76,11 @@ class Game
76
76
 
77
77
  def parse(move)
78
78
  raise InvalidMoveError if move.length != 2
79
+
79
80
  col, row = move.split("")
80
81
  row = to_i(row)
81
82
  unless move_in_range?(row, col)
82
- raise InvalidMoveError
83
+ raise InvalidMoveError.new, "Invalid move! Not a valid board position."
83
84
  end
84
85
 
85
86
  [(-1 * row) + 8, col.ord - 97]
@@ -1,164 +1,6 @@
1
- require_relative 'piece'
2
-
3
- class Pawn < Piece
4
- CAPTURE_DELTAS = [
5
- [1, -1], #capture
6
- [1, 1], #capture
7
- ]
8
-
9
- STEP_DELTA = [
10
- [1, 0] #anytime
11
- ]
12
-
13
- DOUBLE_STEP_DELTA = [
14
- [2, 0], #first move
15
- ]
16
-
17
- attr_accessor :first_move
18
-
19
- def initialize(pos, board, color)
20
- super
21
- @first_move = true
22
- end
23
-
24
- def first_move?
25
- @first_move
26
- end
27
-
28
- def dup(new_board)
29
- copy = super
30
- copy.first_move = first_move
31
-
32
- copy
33
- end
34
-
35
- def moves
36
- possible_moves = []
37
-
38
- possible_moves.concat(capturable_positions)
39
-
40
- step_pos = new_pos(deltas(STEP_DELTA).first)
41
-
42
- if board[step_pos].nil?
43
- possible_moves << step_pos
44
- else
45
- return possible_moves
46
- end
47
-
48
- if first_move?
49
- possible_moves << double_step_pos unless double_step_pos.empty?
50
- end
51
-
52
- possible_moves
53
- end
54
-
55
- def double_step_pos
56
- position = new_pos(deltas(DOUBLE_STEP_DELTA).first)
57
- return position if board[position].nil?
58
-
59
- []
60
- end
61
-
62
- def capturable_positions
63
- deltas(CAPTURE_DELTAS).map { |delta| new_pos(delta) }.select do |position|
64
- !board[position].nil? && board[position].color != color
65
- end
66
- end
67
-
68
- def new_pos(delta)
69
- x, y = pos
70
- dx, dy = delta
71
-
72
- [x + dx, y + dy]
73
- end
74
-
75
- def deltas(specific_deltas)
76
- color == :B ? specific_deltas : specific_deltas.map { |dx, dy| [dx * -1, dy] }
77
- end
78
-
79
- def update_piece(pos)
80
- super
81
- self.first_move = false
82
- end
83
-
84
- def to_s
85
- color == :W ? "\u2659" : "\u265F"
86
- end
87
- end
88
-
89
- class Knight < SteppingPiece
90
- DELTAS = [
91
- [-2, -1],
92
- [-2, 1],
93
- [-1, -2],
94
- [-1, 2],
95
- [ 1, -2],
96
- [ 1, 2],
97
- [ 2, -1],
98
- [ 2, 1]
99
- ]
100
-
101
- def to_s
102
- color == :W ? "\u2658" : "\u265E"
103
- end
104
- end
105
-
106
- class King < SteppingPiece
107
- DELTAS = [
108
- [ 1, 1],
109
- [ 1, 0],
110
- [ 1, -1],
111
- [ 0, -1],
112
- [-1, -1],
113
- [-1, 0],
114
- [-1, 1],
115
- [ 0, 1],
116
- ]
117
-
118
- def to_s
119
- color == :W ? "\u2654" : "\u265A"
120
- end
121
- end
122
-
123
- class Bishop < SlidingPiece
124
- DELTAS = [
125
- [ 1, 1],
126
- [ 1, -1],
127
- [-1, -1],
128
- [-1, 1],
129
- ]
130
-
131
- def to_s
132
- color == :W ? "\u2657" : "\u265D"
133
- end
134
- end
135
-
136
- class Rook < SlidingPiece
137
- DELTAS = [
138
- [ 1, 0],
139
- [ 0, -1],
140
- [-1, 0],
141
- [ 0, 1],
142
- ]
143
-
144
- def to_s
145
- color == :W ? "\u2656" : "\u265C"
146
- end
147
- end
148
-
149
- class Queen < SlidingPiece
150
- DELTAS = [
151
- [ 1, 1],
152
- [ 1, 0],
153
- [ 1, -1],
154
- [ 0, -1],
155
- [-1, -1],
156
- [-1, 0],
157
- [-1, 1],
158
- [ 0, 1],
159
- ]
160
-
161
- def to_s
162
- color == :W ? "\u2655" : "\u265B"
163
- end
164
- end
1
+ require_relative 'pieces/pawn'
2
+ require_relative 'pieces/bishop'
3
+ require_relative 'pieces/king'
4
+ require_relative 'pieces/knight'
5
+ require_relative 'pieces/queen'
6
+ require_relative 'pieces/rook'
@@ -0,0 +1,15 @@
1
+ require_relative 'super/piece'
2
+ require_relative 'super/sliding_piece'
3
+
4
+ class Bishop < SlidingPiece
5
+ DELTAS = [
6
+ [ 1, 1],
7
+ [ 1, -1],
8
+ [-1, -1],
9
+ [-1, 1],
10
+ ]
11
+
12
+ def to_s
13
+ color == :W ? "\u2657" : "\u265D"
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'super/piece'
2
+ require_relative 'super/stepping_piece'
3
+
4
+ class King < SteppingPiece
5
+ DELTAS = [
6
+ [ 1, 1],
7
+ [ 1, 0],
8
+ [ 1, -1],
9
+ [ 0, -1],
10
+ [-1, -1],
11
+ [-1, 0],
12
+ [-1, 1],
13
+ [ 0, 1],
14
+ ]
15
+
16
+ def to_s
17
+ color == :W ? "\u2654" : "\u265A"
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'super/piece'
2
+ require_relative 'super/stepping_piece'
3
+
4
+ class Knight < SteppingPiece
5
+ DELTAS = [
6
+ [-2, -1],
7
+ [-2, 1],
8
+ [-1, -2],
9
+ [-1, 2],
10
+ [ 1, -2],
11
+ [ 1, 2],
12
+ [ 2, -1],
13
+ [ 2, 1]
14
+ ]
15
+
16
+ def to_s
17
+ color == :W ? "\u2658" : "\u265E"
18
+ end
19
+ end
@@ -0,0 +1,87 @@
1
+ require_relative 'super/piece'
2
+
3
+ class Pawn < Piece
4
+ CAPTURE_DELTAS = [
5
+ [1, -1], #capture
6
+ [1, 1], #capture
7
+ ]
8
+
9
+ STEP_DELTA = [
10
+ [1, 0] #anytime
11
+ ]
12
+
13
+ DOUBLE_STEP_DELTA = [
14
+ [2, 0], #first move
15
+ ]
16
+
17
+ attr_accessor :first_move
18
+
19
+ def initialize(pos, board, color)
20
+ super
21
+ @first_move = true
22
+ end
23
+
24
+ def first_move?
25
+ @first_move
26
+ end
27
+
28
+ def dup(new_board)
29
+ copy = super
30
+ copy.first_move = first_move
31
+
32
+ copy
33
+ end
34
+
35
+ def moves
36
+ possible_moves = []
37
+
38
+ possible_moves.concat(capturable_positions)
39
+
40
+ step_pos = new_pos(deltas(STEP_DELTA).first)
41
+
42
+ if board[step_pos].nil?
43
+ possible_moves << step_pos
44
+ else
45
+ return possible_moves
46
+ end
47
+
48
+ if first_move?
49
+ possible_moves << double_step_pos unless double_step_pos.empty?
50
+ end
51
+
52
+ possible_moves
53
+ end
54
+
55
+ def double_step_pos
56
+ position = new_pos(deltas(DOUBLE_STEP_DELTA).first)
57
+ return position if board[position].nil?
58
+
59
+ []
60
+ end
61
+
62
+ def capturable_positions
63
+ deltas(CAPTURE_DELTAS).map { |delta| new_pos(delta) }.select do |position|
64
+ !board[position].nil? && board[position].color != color
65
+ end
66
+ end
67
+
68
+ def new_pos(delta)
69
+ x, y = pos
70
+ dx, dy = delta
71
+
72
+ [x + dx, y + dy]
73
+ end
74
+
75
+ def deltas(specific_deltas)
76
+ color == :B ? specific_deltas : specific_deltas.map { |dx, dy| [dx * -1, dy] }
77
+ end
78
+
79
+ def update_piece(pos)
80
+ super
81
+ self.first_move = false
82
+ end
83
+
84
+ def to_s
85
+ color == :W ? "\u2659" : "\u265F"
86
+ end
87
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'super/piece'
2
+ require_relative 'super/sliding_piece'
3
+
4
+ class Queen < SlidingPiece
5
+ DELTAS = [
6
+ [ 1, 1],
7
+ [ 1, 0],
8
+ [ 1, -1],
9
+ [ 0, -1],
10
+ [-1, -1],
11
+ [-1, 0],
12
+ [-1, 1],
13
+ [ 0, 1],
14
+ ]
15
+
16
+ def to_s
17
+ color == :W ? "\u2655" : "\u265B"
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'super/piece'
2
+ require_relative 'super/sliding_piece'
3
+
4
+ class Rook < SlidingPiece
5
+ DELTAS = [
6
+ [ 1, 0],
7
+ [ 0, -1],
8
+ [-1, 0],
9
+ [ 0, 1],
10
+ ]
11
+
12
+ def to_s
13
+ color == :W ? "\u2656" : "\u265C"
14
+ end
15
+ end
@@ -51,28 +51,3 @@ class Piece
51
51
  self.class.new(pos, new_board, color)
52
52
  end
53
53
  end
54
-
55
- class SlidingPiece < Piece
56
- def potential_moves(delta)
57
- moves = []
58
- captured_piece = false
59
- current_pos = pos
60
-
61
- until captured_piece || !valid_pos?(move = next_pos(current_pos, delta))
62
- moves << move
63
- captured_piece = true if !board[move].nil? && board[move].color != color
64
- current_pos = move
65
- end
66
-
67
- moves
68
- end
69
- end
70
-
71
- class SteppingPiece < Piece
72
- def potential_moves(delta)
73
- move = next_pos(pos, delta)
74
- return [move] if valid_pos?(move)
75
-
76
- []
77
- end
78
- end
@@ -0,0 +1,15 @@
1
+ class SlidingPiece < Piece
2
+ def potential_moves(delta)
3
+ moves = []
4
+ captured_piece = false
5
+ current_pos = pos
6
+
7
+ until captured_piece || !valid_pos?(move = next_pos(current_pos, delta))
8
+ moves << move
9
+ captured_piece = true if !board[move].nil? && board[move].color != color
10
+ current_pos = move
11
+ end
12
+
13
+ moves
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ class SteppingPiece < Piece
2
+ def potential_moves(delta)
3
+ move = next_pos(pos, delta)
4
+ return [move] if valid_pos?(move)
5
+
6
+ []
7
+ end
8
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ari_chess
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Borensztein
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-01 00:00:00.000000000 Z
11
+ date: 2015-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -35,7 +35,15 @@ files:
35
35
  - lib/ari_chess/error.rb
36
36
  - lib/ari_chess/game.rb
37
37
  - lib/ari_chess/named_pieces.rb
38
- - lib/ari_chess/piece.rb
38
+ - lib/ari_chess/pieces/bishop.rb
39
+ - lib/ari_chess/pieces/king.rb
40
+ - lib/ari_chess/pieces/knight.rb
41
+ - lib/ari_chess/pieces/pawn.rb
42
+ - lib/ari_chess/pieces/queen.rb
43
+ - lib/ari_chess/pieces/rook.rb
44
+ - lib/ari_chess/pieces/super/piece.rb
45
+ - lib/ari_chess/pieces/super/sliding_piece.rb
46
+ - lib/ari_chess/pieces/super/stepping_piece.rb
39
47
  homepage: http://rubygems.org/gems/ari_chess
40
48
  licenses:
41
49
  - MIT