chess_validator 0.1.9 → 0.2.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 012e2a3f6be44c4d117d14d0403be0a039d3f003716e899885470ef1fc4459fa
4
- data.tar.gz: c11fd3a325de4e9d743fe26a15ec5cf0f91a09bf280e99027966d9ba09fc3d09
3
+ metadata.gz: '09f1b10fc24cf38a921d5d5166d3bfc5e11d0d91829afae5724911036bf83e26'
4
+ data.tar.gz: '083459406961668dedccfb076481f69cd8c249203f29c24b372056b06ce9342c'
5
5
  SHA512:
6
- metadata.gz: 570cedffbcfe74a5427954fa454b889feaf4a962147e99125cbc3d6f4904415f0077180c05af56035e4f67cab0191d3ce69b8263de15e034938cee7de0f9da7a
7
- data.tar.gz: d45df24d49ff075283b84565cecd31eab976e792fea274718498f3db1b5e62257d08f336d217ee179740a85fb2c8d0d8802d10b34d8cb89b46ee686a811d81c1
6
+ metadata.gz: c1a87737a4e96aee2450fc1caf5ce317424c83c07a006ae11e74494c5084919fad6ef259c061d5767d53c56759e6385a47b9037c9ec8ab346a1278746c813fc5
7
+ data.tar.gz: e4fd8f352273dd65b2378ceb004368fbe1f7dd84e3c75176ba6c090be5deea023d94217010d5d18b7e06f22e36e4f8abc745db4ec3dafc90a6be2a189d9d5332
@@ -1,3 +1 @@
1
- require 'move_logic'
2
- require 'game_logic'
3
- require 'pry'
1
+ require 'engine'
@@ -0,0 +1,37 @@
1
+ require 'move_logic'
2
+ require 'game_logic'
3
+
4
+ module ChessValidator
5
+ class Engine
6
+ class << self
7
+ def find_next_moves(fen_notation)
8
+ fen = PGN::FEN.new(fen_notation)
9
+ MoveLogic.next_moves(fen)
10
+ end
11
+
12
+ def find_next_moves_from_moves(moves)
13
+ fen = PGN::Game.new(moves).positions.last.to_fen
14
+ MoveLogic.next_moves(fen)
15
+ end
16
+
17
+ def make_random_move(fen_notation, pieces_with_moves)
18
+ piece_to_move = pieces_with_moves.sample
19
+ move = piece_to_move.valid_moves.sample
20
+ MoveLogic.make_move(piece_to_move, move, fen_notation)
21
+ end
22
+
23
+ def move(piece, move, fen_notation)
24
+ MoveLogic.make_move(piece, move, fen_notation)
25
+ end
26
+
27
+ def pieces(fen_notation)
28
+ fen = PGN::FEN.new(fen_notation)
29
+ BoardLogic.build_board(fen).values
30
+ end
31
+
32
+ def result(fen_notation)
33
+ GameLogic.find_game_result(fen_notation)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -4,16 +4,6 @@ require 'pgn'
4
4
  module ChessValidator
5
5
  class MoveLogic
6
6
  class << self
7
- def find_next_moves(fen_notation)
8
- fen = PGN::FEN.new(fen_notation)
9
- next_moves(fen)
10
- end
11
-
12
- def find_next_moves_from_moves(moves)
13
- fen = PGN::Game.new(moves).positions.last.to_fen
14
- next_moves(fen)
15
- end
16
-
17
7
  def next_moves(fen)
18
8
  board = BoardLogic.build_board(fen)
19
9
  pieces = []
@@ -51,7 +41,8 @@ module ChessValidator
51
41
  def with_next_move(piece, board, move)
52
42
  index = INDEX_KEY[move]
53
43
  new_board = board.clone
54
- new_piece = Piece.new(piece.piece_type, index)
44
+ piece_type = resolve_piece_type(piece.piece_type, move)
45
+ new_piece = Piece.new(piece_type, index)
55
46
  new_board.delete(piece.square_index)
56
47
  new_board[index] = new_piece
57
48
  new_board = handle_castle(new_board, move) if castled?(piece, move)
@@ -59,6 +50,14 @@ module ChessValidator
59
50
  new_board
60
51
  end
61
52
 
53
+ def resolve_piece_type(piece_type, move)
54
+ if piece_type.downcase == 'p' && ['1', '8'].include?(move[1])
55
+ move[1] == '8' ? 'Q' : 'q'
56
+ else
57
+ piece_type
58
+ end
59
+ end
60
+
62
61
  def handle_en_passant(board, pawn_color, move)
63
62
  if pawn_color == 'w'
64
63
  index = INDEX_KEY[move[0] + '5']
@@ -114,8 +113,6 @@ module ChessValidator
114
113
  def king_will_be_safe?(piece, board, move)
115
114
  new_board = with_next_move(piece, board, move)
116
115
  king, occupied_spaces = find_king_and_spaces(new_board, piece.color)
117
-
118
- return false if king.nil?
119
116
  king_is_safe?(king.color, new_board, king.position, occupied_spaces)
120
117
  end
121
118
 
@@ -154,9 +151,13 @@ module ChessValidator
154
151
  def king_is_safe?(king_color, board, king_position, occupied_spaces)
155
152
  board.values.none? do |piece|
156
153
  piece.color != king_color &&
157
- moves_for_piece(piece).select do |move|
158
- king_position == move && valid_move_path?(piece, king_position, occupied_spaces)
159
- end.size > 0
154
+ moves_for_piece(piece).any? do |move|
155
+ if piece.piece_type.downcase == 'p'
156
+ king_position == move && piece.position[0] != king_position[0]
157
+ else
158
+ king_position == move && valid_move_path?(piece, king_position, occupied_spaces)
159
+ end
160
+ end
160
161
  end
161
162
  end
162
163
 
@@ -164,11 +165,12 @@ module ChessValidator
164
165
  position = piece.position
165
166
 
166
167
  if position[0] == move[0]
167
- advance_pawn?(piece, board, move)
168
+ valid = advance_pawn?(piece, board, move)
168
169
  else
169
170
  target_piece = find_piece(board, move)
170
- (target_piece && target_piece.color != piece.color) || move == fen.en_passant
171
+ valid = (target_piece && target_piece.color != piece.color) || move == fen.en_passant
171
172
  end
173
+ valid && king_will_be_safe?(piece, board, move)
172
174
  end
173
175
 
174
176
  def advance_pawn?(pawn, board, move)
@@ -1,4 +1,4 @@
1
- require_relative './constants/square_key'
1
+ require_relative './constants/move_key'
2
2
 
3
3
  module ChessValidator
4
4
  class Piece
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chess_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Ellison
@@ -18,7 +18,8 @@ extra_rdoc_files: []
18
18
  files:
19
19
  - lib/board_logic.rb
20
20
  - lib/chess_validator.rb
21
- - lib/constants/square_key.rb
21
+ - lib/constants/move_key.rb
22
+ - lib/engine.rb
22
23
  - lib/game_logic.rb
23
24
  - lib/move_logic.rb
24
25
  - lib/piece.rb