chess_validator 0.2.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1af34872a259842b2169becd1ee7570ceac96f7fc626e4c4306e7544fca7e25a
4
- data.tar.gz: 821da801fa31123bd8ec1a6d151bb14364da5ad60d833b11b129ef205ec51411
3
+ metadata.gz: 02b8644ab9c87a26ef76b6779c8020ba4efc1a9d26a3be24bae05a1d80317563
4
+ data.tar.gz: ad114955aa50aacc935d43679c79b1d4396f8d4fcb882be752f093264351b7d7
5
5
  SHA512:
6
- metadata.gz: dae4d729c77310493648f7c3ec78ee954b3f04055b94a9a7410a74a3028d1b86918a6161e148bdaa27eaf75249a3a80e9ee9e2c54ed69cfcae8250740a62ba54
7
- data.tar.gz: d0dcfb4661d6c5f8b231207ad0cd96c7634ed84898c3d76331c10f64aad54f345d4ef10538e3f27fb428eadf686958f7ccd69ea48fbb18bd1ceb0d40a4bf2b05
6
+ metadata.gz: 6057987c04b5ed6bf8c3ba9ab09174930e8581fc41f4eee2da7d3c1913e072bc442aa8f5ff5594ce5787a4e7bb5787c5b5095a82ea3162c6d4322e657d001fa9
7
+ data.tar.gz: d3d9a0155b1615ca6f1bbb48a1746f07ad14c47f340a59ffac742c48e99d1c46b74029caa201668a5aace4a327d0653727c487e4c2400bc6bf75cb425ea06835
@@ -1,2 +1 @@
1
- require 'move_logic'
2
- require 'game_logic'
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 = []
@@ -29,7 +19,20 @@ module ChessValidator
29
19
 
30
20
  def load_valid_moves(board, piece, fen)
31
21
  moves_for_piece(piece).each do |move|
32
- piece.valid_moves << move if valid_move?(piece, board, move, fen)
22
+ if valid_move?(piece, board, move, fen)
23
+ piece.valid_moves << move
24
+ target = find_target(board, piece, move)
25
+ piece.targets << target if target
26
+ end
27
+ end
28
+ end
29
+
30
+ def find_target(board, piece, move)
31
+ if board[INDEX_KEY[move]]
32
+ board[INDEX_KEY[move]]
33
+ elsif piece.piece_type.downcase == 'p' && piece.position[0] != move[0]
34
+ en_passant_position = piece.color == 'w' ? move[0] + '5' : move[0] + '4'
35
+ board[INDEX_KEY[en_passant_position]]
33
36
  end
34
37
  end
35
38
 
@@ -51,7 +54,8 @@ module ChessValidator
51
54
  def with_next_move(piece, board, move)
52
55
  index = INDEX_KEY[move]
53
56
  new_board = board.clone
54
- new_piece = Piece.new(piece.piece_type, index)
57
+ piece_type = resolve_piece_type(piece.piece_type, move)
58
+ new_piece = Piece.new(piece_type, index)
55
59
  new_board.delete(piece.square_index)
56
60
  new_board[index] = new_piece
57
61
  new_board = handle_castle(new_board, move) if castled?(piece, move)
@@ -59,6 +63,14 @@ module ChessValidator
59
63
  new_board
60
64
  end
61
65
 
66
+ def resolve_piece_type(piece_type, move)
67
+ if piece_type.downcase == 'p' && ['1', '8'].include?(move[1])
68
+ move[1] == '8' ? 'Q' : 'q'
69
+ else
70
+ piece_type
71
+ end
72
+ end
73
+
62
74
  def handle_en_passant(board, pawn_color, move)
63
75
  if pawn_color == 'w'
64
76
  index = INDEX_KEY[move[0] + '5']
@@ -1,16 +1,16 @@
1
- require_relative './constants/square_key'
1
+ require_relative './constants/move_key'
2
2
 
3
3
  module ChessValidator
4
4
  class Piece
5
- attr_accessor :position, :piece_type, :color, :square_index, :valid_moves
5
+ attr_accessor :position, :piece_type, :color, :square_index, :valid_moves, :targets
6
6
 
7
7
  def initialize(char, square_index)
8
8
  @piece_type = char
9
9
  @square_index = square_index
10
10
  @color = get_color(char)
11
11
  @position = get_position(square_index)
12
- @enemy_targets = []
13
12
  @valid_moves = []
13
+ @targets = []
14
14
  end
15
15
 
16
16
  def get_position(square_index)
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.2.1
4
+ version: 0.2.6
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