chess_validator 0.2.20 → 0.2.21

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
  SHA256:
3
- metadata.gz: 3de54f3263072bf9eedb64289175b426d0f58913e2fedfbd4e1d733f85799c7d
4
- data.tar.gz: d50b2bb51511e6e56c2e202c439a1f4dced1663b3296d12091345491b247b376
3
+ metadata.gz: 94df1700b50a798d45895b3d8b235fc6cd8abbe15736f36bbc97e1fe31da88e1
4
+ data.tar.gz: 6e0eab463eee127e30e55effeef21466cf71e9ac08be5c8f2f6b258112e723cb
5
5
  SHA512:
6
- metadata.gz: c3bc01a8d88e626995ad7af4b5bd2bb6b35b2a66554b03c5772c217448042e240cd3ae4240632ea0cb43f469d395dfd4196666587c8a835a568f3995ab5bb89c
7
- data.tar.gz: e602c545ef411549769616a7d0a602b86b2a5a03202f8a368ac6f6ba8a2c86b06501dd6381096fae20060652be9a8b360c27203fb411392b72e1ba11f0abc6c9
6
+ metadata.gz: '098971e3e410d7f62ec4bf11fb62ae9a3397322add2a7a40a508c24149e19680460d7e5a659add721e17acb84473308c79fc55d5be3d7fba4b3f9c8bf159ce13'
7
+ data.tar.gz: 7e0b9b6b18cbddbbc7fc25d2860a2830ea21c52d06254a2b3be28513ab391c8e7f10b0591b1a3c3471763d2c95e6d53940049e74e34d44a9c6870d445cb20ef1
data/lib/board_logic.rb CHANGED
@@ -3,9 +3,13 @@ require 'piece'
3
3
  module ChessValidator
4
4
  class BoardLogic
5
5
  def self.build_board(fen)
6
+ build_board_from_string(fen.board_string)
7
+ end
8
+
9
+ def self.build_board_from_string(board_string)
6
10
  board = {}
7
11
  square_index = 1
8
- fen.board_string.chars.each do |char|
12
+ board_string.chars.each do |char|
9
13
  if empty_square?(char)
10
14
  square_index += char.to_i
11
15
  elsif char != '/'
data/lib/engine.rb CHANGED
@@ -32,6 +32,10 @@ module ChessValidator
32
32
  def result(fen_notation)
33
33
  GameLogic.find_game_result(fen_notation)
34
34
  end
35
+
36
+ def defended_pieces(fen_notatioin)
37
+ MoveLogic.defended_pieces_by_square(fen_notation)
38
+ end
35
39
  end
36
40
  end
37
41
  end
data/lib/move_logic.rb CHANGED
@@ -5,18 +5,56 @@ module ChessValidator
5
5
  class MoveLogic
6
6
  class << self
7
7
  def next_moves(fen)
8
- board = BoardLogic.build_board(fen)
8
+ fen_notation = fen.to_s
9
+ return next_moves_for[fen_notation] if next_moves_for[fen_notation]
10
+
11
+
12
+ board = get_board(fen.to_s)
9
13
  pieces = []
14
+
10
15
  board.values.each do |piece|
11
16
  if piece.color == fen.active
12
17
  load_move_data(board, piece, fen)
13
18
  pieces << piece if piece.valid_moves.size > 0
14
19
  end
15
20
  end
21
+ next_moves_for[fen_notation] = pieces
16
22
 
17
23
  pieces
18
24
  end
19
25
 
26
+ def boards
27
+ @boards ||= {}
28
+ end
29
+
30
+ def get_board(fen_string)
31
+ return boards[fen_string] if boards[fen_string]
32
+
33
+ board = BoardLogic.build_board_from_string(fen_string.split.first)
34
+ boards[fen_string] = board
35
+ board
36
+ end
37
+
38
+ def next_moves_for
39
+ @next_moves_for ||= {}
40
+ end
41
+
42
+ def occupied_square_sets
43
+ @occupied_square_sets ||= {}
44
+ end
45
+
46
+ def get_occupied_spaces(fen_string)
47
+ return occupied_square_sets[fen_string] if occupied_square_sets[fen_string]
48
+ board = get_board(fen_string)
49
+
50
+ occupied_spaces = []
51
+ board.values.each { |p| occupied_spaces << p.position }
52
+
53
+ occupied_square_sets[fen_string] = occupied_spaces
54
+ occupied_spaces
55
+ end
56
+
57
+
20
58
  def load_move_data(board, piece, fen)
21
59
  moves_for_piece(piece).each do |move|
22
60
  if valid_move?(piece, board, move, fen)
@@ -41,14 +79,13 @@ module ChessValidator
41
79
  end
42
80
 
43
81
  def valid_move?(piece, board, move, fen)
44
- occupied_spaces = []
45
- board.values.each { |p| occupied_spaces << p.position }
46
82
  case piece.piece_type.downcase
47
83
  when 'k'
48
- handle_king(piece, board, move, fen, occupied_spaces)
84
+ handle_king(piece, board, move, fen) && valid_destination?(piece, board, move)
49
85
  when 'p'
50
86
  handle_pawn(piece, board, move, fen)
51
87
  else
88
+ occupied_spaces = get_occupied_spaces(fen.to_s)
52
89
  valid_move_path?(piece, move, occupied_spaces) &&
53
90
  valid_destination?(piece, board, move) &&
54
91
  king_will_be_safe?(piece, board, move)
@@ -112,10 +149,9 @@ module ChessValidator
112
149
  end
113
150
 
114
151
  def make_move(piece, move, fen_notation)
115
- fen = PGN::FEN.new(fen_notation)
116
- board = BoardLogic.build_board(fen)
152
+ board = get_board(fen_notation)
117
153
  new_board = with_next_move(piece, board, move)
118
-
154
+ fen = PGN::FEN.new(fen_notation)
119
155
  BoardLogic.to_fen_notation(new_board, fen, piece, move, board[INDEX_KEY[move]])
120
156
  end
121
157
 
@@ -135,16 +171,16 @@ module ChessValidator
135
171
  end
136
172
 
137
173
  def find_king_and_spaces(board, color)
138
- occupied_spaces = []
139
174
  king = nil
140
- board.values.each do |p|
175
+ occupied_spaces = board.values.map do |p|
141
176
  king = p if p.piece_type.downcase == 'k' && p.color == color
142
- occupied_spaces << p.position
177
+ p.position
143
178
  end
179
+
144
180
  [king, occupied_spaces]
145
181
  end
146
182
 
147
- def handle_king(king, board, move, fen, occupied_spaces)
183
+ def handle_king(king, board, move, fen)
148
184
  if (king.position[0].ord - move[0].ord).abs == 2
149
185
  empty_b_square = true
150
186
  if move[0] == 'c'
@@ -155,6 +191,8 @@ module ChessValidator
155
191
  castle_code = 'k'
156
192
  between = 'f' + move[1]
157
193
  end
194
+ occupied_spaces = get_occupied_spaces(fen.to_s)
195
+
158
196
  (fen.castling.include?(castle_code) && king.color == 'b' || fen.castling.include?(castle_code.upcase) && king.color == 'w') &&
159
197
  king_is_safe?(king.color, board, king.position, occupied_spaces) &&
160
198
  king_is_safe?(king.color, board, between, occupied_spaces) &&
@@ -162,7 +200,7 @@ module ChessValidator
162
200
  board.values.none? { |piece| [between, move].include?(piece.position) } &&
163
201
  empty_b_square
164
202
  else
165
- valid_destination?(king, board, move) && king_will_be_safe?(king, board, move)
203
+ king_will_be_safe?(king, board, move)
166
204
  end
167
205
  end
168
206
 
@@ -271,6 +309,47 @@ module ChessValidator
271
309
  !(move_path & occupied_spaces).empty?
272
310
  end
273
311
 
312
+ def can_defend?(piece, board, position, fen)
313
+ case piece.piece_type.downcase
314
+ when 'k'
315
+ handle_king(piece, board, position, fen)
316
+ when 'p'
317
+ if piece.position[0] != position[0]
318
+ target_piece = find_piece(board, position)
319
+ valid = (target_piece && target_piece.color != piece.color) || position == fen.en_passant
320
+ valid && king_will_be_safe?(piece, board, position)
321
+ end
322
+ else
323
+ occupied_spaces = get_occupied_spaces(fen.to_s)
324
+ valid_move_path?(piece, position, occupied_spaces) && king_will_be_safe?(piece, board, position)
325
+ end
326
+ end
327
+
328
+ def defended_pieces_by_square(fen_notation)
329
+ board = get_board(fen_notation)
330
+
331
+ fen = PGN::FEN.new(fen_notation)
332
+ space_index = {}
333
+
334
+ pieces = board.values.map do |piece|
335
+ space_index[piece.position] = piece.piece_type + piece.color
336
+ piece
337
+ end
338
+
339
+ defended = Hash.new([])
340
+
341
+ pieces.each do |piece|
342
+ moves_for_piece(piece).each do |move|
343
+ if space_index[move] && space_index[move][-1] == piece.color && can_defend?(piece, board, move, fen)
344
+ defended[move] += [piece]
345
+ puts 'hi'
346
+ end
347
+ end
348
+ end
349
+
350
+ defended
351
+ end
352
+
274
353
  def moves_for_piece(piece)
275
354
  case piece.piece_type.downcase
276
355
  when 'r'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chess_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.20
4
+ version: 0.2.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Ellison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-17 00:00:00.000000000 Z
11
+ date: 2020-01-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'Documentation: https://github.com/chadellison/chess_validator'
14
14
  email: chad.ellison0123@gmail.com