bchess 0.1.1 → 0.1.2
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 +4 -4
- data/Gemfile +2 -2
- data/Gemfile.lock +1 -1
- data/Rakefile +3 -3
- data/bchess.gemspec +16 -17
- data/bin/console +3 -3
- data/lib/bchess.rb +26 -26
- data/lib/bchess/board.rb +16 -14
- data/lib/bchess/game.rb +1 -1
- data/lib/bchess/helpers/board_helpers.rb +7 -7
- data/lib/bchess/helpers/en_passant_helpers.rb +3 -3
- data/lib/bchess/helpers/fen_helpers.rb +24 -24
- data/lib/bchess/helpers/field_between_helpers.rb +9 -8
- data/lib/bchess/king.rb +1 -2
- data/lib/bchess/knight.rb +1 -2
- data/lib/bchess/pawn.rb +3 -4
- data/lib/bchess/queen.rb +2 -2
- data/lib/bchess/version.rb +1 -1
- data/lib/pgn/game_header.rb +10 -10
- data/lib/pgn/move_info_parser.rb +18 -18
- data/lib/pgn/parser.rb +6 -6
- data/lib/pgn/pgn_file.rb +1 -1
- data/lib/pgn/pgn_nodes.rb +3 -3
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 370d493302b50f3cd02153f733ab46e43fd27727
|
4
|
+
data.tar.gz: 0436a659709ec9710be92eaa3f54747f6359eda6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d824f7dd402d8c83a327f31ab0d63acd88fd0063277897395a402720fd0f23e2def762d0a182747fae6b36a6818fc67806ed8e63738ac55b1967dd106c4c801f
|
7
|
+
data.tar.gz: c3758e3249590c239c537fc36f1a3b526e7089067685cc136bdbb3fa5f612a099299151584fe03f3fe33f910b74c72925e0a8a5df123aeadcff3d6faaf4a6f59
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in bchess.gemspec
|
6
6
|
gemspec
|
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
data/bchess.gemspec
CHANGED
@@ -1,29 +1,28 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'bchess/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'bchess'
|
8
7
|
spec.version = Bchess::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
8
|
+
spec.authors = ['Staszek Zawadzki']
|
9
|
+
spec.email = ['s.zawadzki@visuality.pl']
|
11
10
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
11
|
+
spec.summary = 'Parsing chess PGN games.'
|
12
|
+
spec.description = 'Parsing and validating a chess games and returning as chess game objects'
|
13
|
+
spec.homepage = 'https://github.com/visualitypl/bchess'
|
14
|
+
spec.license = 'MIT'
|
16
15
|
|
17
16
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
17
|
f.match(%r{^(test|spec|features)/})
|
19
18
|
end
|
20
|
-
spec.bindir =
|
19
|
+
spec.bindir = 'exe'
|
21
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
-
spec.require_paths = [
|
21
|
+
spec.require_paths = ['lib']
|
23
22
|
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
24
|
+
spec.add_development_dependency 'pry'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'treetop', '~> 1.6'
|
29
28
|
end
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'bchess'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "bchess"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
data/lib/bchess.rb
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
1
|
+
require 'bchess/helpers/board_helpers'
|
2
|
+
require 'bchess/helpers/fen_helpers'
|
3
|
+
require 'bchess/helpers/board_helpers'
|
4
|
+
require 'bchess/helpers/castle_helpers'
|
5
|
+
require 'bchess/helpers/validations'
|
6
|
+
require 'bchess/helpers/en_passant_helpers'
|
7
|
+
require 'bchess/helpers/field_between_helpers'
|
8
8
|
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
9
|
+
require 'bchess/version'
|
10
|
+
require 'bchess/piece'
|
11
|
+
require 'bchess/king'
|
12
|
+
require 'bchess/rook'
|
13
|
+
require 'bchess/bishop'
|
14
|
+
require 'bchess/queen'
|
15
|
+
require 'bchess/knight'
|
16
|
+
require 'bchess/pawn'
|
17
|
+
require 'bchess/board'
|
18
18
|
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
19
|
+
require 'pgn/parser'
|
20
|
+
require 'pgn/pgn_file'
|
21
|
+
require 'pgn/pgn_nodes'
|
22
|
+
require 'pgn/game'
|
23
|
+
require 'pgn/game_header'
|
24
|
+
require 'pgn/game_body'
|
25
|
+
require 'pgn/move_info_parser'
|
26
26
|
|
27
27
|
module Bchess
|
28
28
|
class InvalidMoveException < StandardError; end
|
29
29
|
|
30
|
-
WHITE = 'w'
|
31
|
-
BLACK = 'b'
|
32
|
-
START_FEN = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'
|
30
|
+
WHITE = 'w'.freeze
|
31
|
+
BLACK = 'b'.freeze
|
32
|
+
START_FEN = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'.freeze
|
33
33
|
end
|
data/lib/bchess/board.rb
CHANGED
@@ -20,6 +20,7 @@ module Bchess
|
|
20
20
|
|
21
21
|
def move(piece, column, row, promoted_piece = nil)
|
22
22
|
return false if invalid_data?(piece, column, row)
|
23
|
+
|
23
24
|
@en_passant = '-' unless en_passant_detected?(piece, column, row)
|
24
25
|
|
25
26
|
if castle_detected?(piece, column)
|
@@ -30,9 +31,9 @@ module Bchess
|
|
30
31
|
validate_en_passant(piece, column, row) && execute_en_passant(piece, column, row)
|
31
32
|
elsif pawn_long_move_detected?(piece, row)
|
32
33
|
long_pawn_move(piece, column, row)
|
33
|
-
elsif piece.can_move_to_field?(column,row)
|
34
|
+
elsif piece.can_move_to_field?(column, row)
|
34
35
|
piece.move(column, row)
|
35
|
-
elsif piece.can_take_on_field?(column,row)
|
36
|
+
elsif piece.can_take_on_field?(column, row)
|
36
37
|
piece.move(column, row)
|
37
38
|
else
|
38
39
|
return false
|
@@ -45,7 +46,7 @@ module Bchess
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def get_possible_pieces(info)
|
48
|
-
@pieces.select{|p| p.can_make_move?(info, self)}
|
49
|
+
@pieces.select { |p| p.can_make_move?(info, self) }
|
49
50
|
end
|
50
51
|
|
51
52
|
def update_info(piece, column, row)
|
@@ -57,7 +58,8 @@ module Bchess
|
|
57
58
|
end
|
58
59
|
|
59
60
|
def execute_promotion(piece, column, row, promoted_piece)
|
60
|
-
raise
|
61
|
+
raise 'Promotion Not Specified' if promoted_piece.nil? || !(promoted_piece < Bchess::Piece)
|
62
|
+
|
61
63
|
pieces.delete(piece)
|
62
64
|
promoted = promoted_piece.new(piece.color, column, row)
|
63
65
|
promoted.moved = true if promoted_piece == Bchess::Rook
|
@@ -69,11 +71,11 @@ module Bchess
|
|
69
71
|
end
|
70
72
|
|
71
73
|
def at(column, row)
|
72
|
-
pieces.select{|p| p.row == row && p.column == column}.first
|
74
|
+
pieces.select { |p| p.row == row && p.column == column }.first
|
73
75
|
end
|
74
76
|
|
75
77
|
def read_fen
|
76
|
-
fen_pieces, fen_colors, fen_castles, fen_en_passant, fen_halfmove_clock, fen_move_number = fen.strip.split(
|
78
|
+
fen_pieces, fen_colors, fen_castles, fen_en_passant, fen_halfmove_clock, fen_move_number = fen.strip.split(' ')
|
77
79
|
set_pieces(fen_pieces)
|
78
80
|
set_to_move(fen_colors)
|
79
81
|
set_castles(fen_castles)
|
@@ -84,13 +86,13 @@ module Bchess
|
|
84
86
|
|
85
87
|
def print
|
86
88
|
puts 'Pieces WHITE: '
|
87
|
-
puts _pieces(Bchess::WHITE).map
|
89
|
+
puts _pieces(Bchess::WHITE).map(&:to_s).join(', ')
|
88
90
|
puts 'Pieces BLACK: '
|
89
|
-
puts _pieces(Bchess::BLACK).map
|
91
|
+
puts _pieces(Bchess::BLACK).map(&:to_s).join(', ')
|
90
92
|
end
|
91
93
|
|
92
94
|
def king(color)
|
93
|
-
@pieces.select{ |p| p.class == Bchess::King && p.color == color }.first
|
95
|
+
@pieces.select { |p| p.class == Bchess::King && p.color == color }.first
|
94
96
|
end
|
95
97
|
|
96
98
|
def change_to_move
|
@@ -100,7 +102,7 @@ module Bchess
|
|
100
102
|
private
|
101
103
|
|
102
104
|
def remove_old_piece(column, row, color)
|
103
|
-
taken_piece = _other_pieces(color).select{|p| p.row == row && p.column == column}.first
|
105
|
+
taken_piece = _other_pieces(color).select { |p| p.row == row && p.column == column }.first
|
104
106
|
pieces.delete(taken_piece)
|
105
107
|
end
|
106
108
|
|
@@ -112,20 +114,20 @@ module Bchess
|
|
112
114
|
_king = king(color)
|
113
115
|
_pieces = _other_pieces(color)
|
114
116
|
|
115
|
-
_pieces.any?{|p| attacks?(p, _king)}
|
117
|
+
_pieces.any? { |p| attacks?(p, _king) }
|
116
118
|
end
|
117
119
|
|
118
120
|
def attacks?(piece, king)
|
119
121
|
piece.can_take_on_field?(king.column, king.row) &&
|
120
|
-
piece.fields_between(king.column, king.row).none?{|f| at(*f)}
|
122
|
+
piece.fields_between(king.column, king.row).none? { |f| at(*f) }
|
121
123
|
end
|
122
124
|
|
123
125
|
def _pieces(color)
|
124
|
-
@pieces.select{ |p| p.color == color }
|
126
|
+
@pieces.select { |p| p.color == color }
|
125
127
|
end
|
126
128
|
|
127
129
|
def _other_pieces(color)
|
128
|
-
@pieces.
|
130
|
+
@pieces.reject { |p| p.color == color }
|
129
131
|
end
|
130
132
|
end
|
131
133
|
end
|
data/lib/bchess/game.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
module Bchess
|
2
2
|
module BoardHelpers
|
3
3
|
def field(column, row)
|
4
|
-
(column+97).chr + (row+1).to_s
|
4
|
+
(column + 97).chr + (row + 1).to_s
|
5
5
|
end
|
6
6
|
|
7
7
|
def invalid_data?(piece, column, row)
|
8
|
-
piece.nil? || !(0..7).
|
8
|
+
piece.nil? || !(0..7).cover?(column) || !(0..7).cover?(row)
|
9
9
|
end
|
10
10
|
|
11
11
|
def castle_detected?(piece, column)
|
12
|
-
piece.
|
12
|
+
piece.is_a?(Bchess::King) && piece.column == 4 && (column - piece.column).abs == 2
|
13
13
|
end
|
14
14
|
|
15
15
|
def promotion_detected?(piece, row)
|
16
|
-
piece.
|
16
|
+
piece.is_a?(Bchess::Pawn) && (row == 0 || row == 7)
|
17
17
|
end
|
18
18
|
|
19
19
|
def en_passant_detected?(piece, column, row)
|
20
|
-
piece.
|
20
|
+
piece.is_a?(Bchess::Pawn) && piece.row != row && piece.column != column && at(column, row).nil? && piece.can_take_on_field?(column, row)
|
21
21
|
end
|
22
22
|
|
23
23
|
def pawn_long_move_detected?(piece, row)
|
24
|
-
piece.
|
24
|
+
piece.is_a?(Bchess::Pawn) && (piece.row - row).abs == 2
|
25
25
|
end
|
26
26
|
|
27
27
|
def kings_present?
|
@@ -37,7 +37,7 @@ module Bchess
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def field(column, row)
|
40
|
-
(column+97).chr + (row+1).to_s
|
40
|
+
(column + 97).chr + (row + 1).to_s
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module EnPassantHelpers
|
2
|
-
def validate_en_passant(
|
3
|
-
#TODO
|
2
|
+
def validate_en_passant(_piece, _column, _row)
|
3
|
+
# TODO
|
4
4
|
true
|
5
5
|
end
|
6
6
|
|
@@ -17,6 +17,6 @@ module EnPassantHelpers
|
|
17
17
|
def long_pawn_move(piece, column, row)
|
18
18
|
piece.move(column, row)
|
19
19
|
direction = piece.color == Bchess::WHITE ? 1 : -1
|
20
|
-
@en_passant = field(column, (row + piece.row)/2 - direction)
|
20
|
+
@en_passant = field(column, (row + piece.row) / 2 - direction)
|
21
21
|
end
|
22
22
|
end
|
@@ -2,25 +2,25 @@ module Bchess
|
|
2
2
|
module FenHelpers
|
3
3
|
def fen_hash
|
4
4
|
{
|
5
|
-
'k': {klass: Bchess::King, color: Bchess::BLACK},
|
6
|
-
'q': {klass: Bchess::Queen, color: Bchess::BLACK},
|
7
|
-
'r': {klass: Bchess::Rook, color: Bchess::BLACK},
|
8
|
-
'b': {klass: Bchess::Bishop, color: Bchess::BLACK},
|
9
|
-
'n': {klass: Bchess::Knight, color: Bchess::BLACK},
|
10
|
-
'p': {klass: Bchess::Pawn, color: Bchess::BLACK},
|
11
|
-
'K': {klass: Bchess::King, color: Bchess::WHITE},
|
12
|
-
'Q': {klass: Bchess::Queen, color: Bchess::WHITE},
|
13
|
-
'R': {klass: Bchess::Rook, color: Bchess::WHITE},
|
14
|
-
'B': {klass: Bchess::Bishop, color: Bchess::WHITE},
|
15
|
-
'N': {klass: Bchess::Knight, color: Bchess::WHITE},
|
16
|
-
'P': {klass: Bchess::Pawn, color: Bchess::WHITE}
|
5
|
+
'k': { klass: Bchess::King, color: Bchess::BLACK },
|
6
|
+
'q': { klass: Bchess::Queen, color: Bchess::BLACK },
|
7
|
+
'r': { klass: Bchess::Rook, color: Bchess::BLACK },
|
8
|
+
'b': { klass: Bchess::Bishop, color: Bchess::BLACK },
|
9
|
+
'n': { klass: Bchess::Knight, color: Bchess::BLACK },
|
10
|
+
'p': { klass: Bchess::Pawn, color: Bchess::BLACK },
|
11
|
+
'K': { klass: Bchess::King, color: Bchess::WHITE },
|
12
|
+
'Q': { klass: Bchess::Queen, color: Bchess::WHITE },
|
13
|
+
'R': { klass: Bchess::Rook, color: Bchess::WHITE },
|
14
|
+
'B': { klass: Bchess::Bishop, color: Bchess::WHITE },
|
15
|
+
'N': { klass: Bchess::Knight, color: Bchess::WHITE },
|
16
|
+
'P': { klass: Bchess::Pawn, color: Bchess::WHITE }
|
17
17
|
}
|
18
18
|
end
|
19
19
|
|
20
20
|
def write_fen
|
21
21
|
result = ''
|
22
22
|
7.downto(0) do |i|
|
23
|
-
line_pieces = pieces.select{ |p| p.row == i }
|
23
|
+
line_pieces = pieces.select { |p| p.row == i }
|
24
24
|
one_line = create_fen_line(line_pieces)
|
25
25
|
result << one_line
|
26
26
|
result << '/' unless i == 0
|
@@ -33,7 +33,7 @@ module Bchess
|
|
33
33
|
counter = 0
|
34
34
|
|
35
35
|
0.upto(7) do |i|
|
36
|
-
piece = pieces.select{ |p| p.column == i }.first
|
36
|
+
piece = pieces.select { |p| p.column == i }.first
|
37
37
|
if !!piece
|
38
38
|
if counter > 0
|
39
39
|
line.concat(counter.to_s)
|
@@ -52,13 +52,13 @@ module Bchess
|
|
52
52
|
|
53
53
|
def set_pieces(board)
|
54
54
|
pieces.clear
|
55
|
-
board.split(
|
55
|
+
board.split('/').each_with_index do |line, index|
|
56
56
|
column = 0
|
57
57
|
line.each_char do |char|
|
58
58
|
if char.to_i != 0
|
59
59
|
column += char.to_i - 1
|
60
60
|
else
|
61
|
-
pieces << fen_hash[char.to_sym][:klass].new(fen_hash[char.to_sym][:color], column, 7-index)
|
61
|
+
pieces << fen_hash[char.to_sym][:klass].new(fen_hash[char.to_sym][:color], column, 7 - index)
|
62
62
|
end
|
63
63
|
column += 1
|
64
64
|
end
|
@@ -82,15 +82,15 @@ module Bchess
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def to_fen(piece)
|
85
|
-
fen_hash.key(
|
85
|
+
fen_hash.key(klass: piece.class, color: piece.color).to_s
|
86
86
|
end
|
87
87
|
|
88
88
|
def change_halfmove_clock(piece)
|
89
|
-
if piece.
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
89
|
+
@halfmove_clock = if piece.is_a?(Bchess::Pawn)
|
90
|
+
0
|
91
|
+
else
|
92
|
+
halfmove_clock + 1
|
93
|
+
end
|
94
94
|
end
|
95
95
|
|
96
96
|
def update_castles_after_move(piece)
|
@@ -104,9 +104,9 @@ module Bchess
|
|
104
104
|
|
105
105
|
def update_castles_after_king_move(color)
|
106
106
|
if color == Bchess::WHITE
|
107
|
-
@castles.
|
107
|
+
@castles.delete!('K').delete!('Q')
|
108
108
|
else
|
109
|
-
@castles.
|
109
|
+
@castles.delete!('k').delete!('q')
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module FieldBetweenHelpers
|
2
|
-
def row_fields(dcolumn,
|
2
|
+
def row_fields(dcolumn, _drow)
|
3
3
|
smaller, bigger = [column, dcolumn].sort
|
4
|
-
(smaller+1..bigger-1).map{|c| [c, row] }
|
4
|
+
(smaller + 1..bigger - 1).map { |c| [c, row] }
|
5
5
|
end
|
6
6
|
|
7
|
-
def column_fields(
|
7
|
+
def column_fields(_dcolumn, drow)
|
8
8
|
smaller, bigger = [row, drow].sort
|
9
|
-
(smaller+1..bigger-1).map{|r| [column, r] }
|
9
|
+
(smaller + 1..bigger - 1).map { |r| [column, r] }
|
10
10
|
end
|
11
11
|
|
12
12
|
def diagonal_fields(dcolumn, drow)
|
@@ -14,21 +14,21 @@ module FieldBetweenHelpers
|
|
14
14
|
if dcolumn > column
|
15
15
|
if drow > row
|
16
16
|
(dcolumn - column - 1).times do |i|
|
17
|
-
fields << [dcolumn-(i+1), drow-(i+1)]
|
17
|
+
fields << [dcolumn - (i + 1), drow - (i + 1)]
|
18
18
|
end
|
19
19
|
else
|
20
20
|
(dcolumn - column - 1).times do |i|
|
21
|
-
fields << [dcolumn-(i+1), drow+(i+1)]
|
21
|
+
fields << [dcolumn - (i + 1), drow + (i + 1)]
|
22
22
|
end
|
23
23
|
end
|
24
24
|
else
|
25
25
|
if drow > row
|
26
26
|
(column - dcolumn - 1).times do |i|
|
27
|
-
fields << [dcolumn+(i+1), drow-(i+1)]
|
27
|
+
fields << [dcolumn + (i + 1), drow - (i + 1)]
|
28
28
|
end
|
29
29
|
else
|
30
30
|
(column - dcolumn - 1).times do |i|
|
31
|
-
fields << [dcolumn+(i+1), drow+(i+1)]
|
31
|
+
fields << [dcolumn + (i + 1), drow + (i + 1)]
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -37,6 +37,7 @@ module FieldBetweenHelpers
|
|
37
37
|
|
38
38
|
def fields_between(dcolumn, drow)
|
39
39
|
return [] unless can_move_to_field?(dcolumn, drow)
|
40
|
+
|
40
41
|
if same_row?(drow)
|
41
42
|
row_fields(dcolumn, drow)
|
42
43
|
elsif same_column?(dcolumn)
|
data/lib/bchess/king.rb
CHANGED
data/lib/bchess/knight.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Bchess
|
2
2
|
class Knight < Piece
|
3
|
-
|
4
3
|
def initiialize(*args)
|
5
4
|
super(args)
|
6
5
|
end
|
@@ -13,7 +12,7 @@ module Bchess
|
|
13
12
|
super && by_jump(dcolumn, drow)
|
14
13
|
end
|
15
14
|
|
16
|
-
def fields_between(
|
15
|
+
def fields_between(_column, _row)
|
17
16
|
[]
|
18
17
|
end
|
19
18
|
|
data/lib/bchess/pawn.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Bchess
|
2
2
|
class Pawn < Piece
|
3
|
-
|
4
3
|
def initiialize(*args)
|
5
4
|
super(args)
|
6
5
|
end
|
@@ -35,11 +34,11 @@ module Bchess
|
|
35
34
|
column == dcolumn
|
36
35
|
end
|
37
36
|
|
38
|
-
def direction_kept?(
|
37
|
+
def direction_kept?(_dcolumn, drow)
|
39
38
|
white? ? drow > row : row > drow
|
40
39
|
end
|
41
40
|
|
42
|
-
def row_diff?(
|
41
|
+
def row_diff?(_dcolumn, drow)
|
43
42
|
(row - drow).abs <= (starting_position? ? 2 : 1)
|
44
43
|
end
|
45
44
|
|
@@ -48,7 +47,7 @@ module Bchess
|
|
48
47
|
end
|
49
48
|
|
50
49
|
def pawn_position?
|
51
|
-
(1..6).
|
50
|
+
(1..6).cover?(row)
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
data/lib/bchess/queen.rb
CHANGED
data/lib/bchess/version.rb
CHANGED
data/lib/pgn/game_header.rb
CHANGED
@@ -8,43 +8,43 @@ module Bchess
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def player_white
|
11
|
-
@player_white ||= values[
|
11
|
+
@player_white ||= values['White']
|
12
12
|
end
|
13
13
|
|
14
14
|
def player_black
|
15
|
-
@player_black ||= values[
|
15
|
+
@player_black ||= values['Black']
|
16
16
|
end
|
17
17
|
|
18
18
|
def elo_white
|
19
|
-
@elo_white ||= values[
|
19
|
+
@elo_white ||= values['WhiteElo']
|
20
20
|
end
|
21
21
|
|
22
22
|
def elo_black
|
23
|
-
@elo_black ||= values[
|
23
|
+
@elo_black ||= values['BlackElo']
|
24
24
|
end
|
25
25
|
|
26
26
|
def event
|
27
|
-
@event ||= values[
|
27
|
+
@event ||= values['Event']
|
28
28
|
end
|
29
29
|
|
30
30
|
def site
|
31
|
-
@site ||= values[
|
31
|
+
@site ||= values['Site']
|
32
32
|
end
|
33
33
|
|
34
34
|
def date
|
35
|
-
@date ||= values[
|
35
|
+
@date ||= values['Date']
|
36
36
|
end
|
37
37
|
|
38
38
|
def round
|
39
|
-
@round ||= values[
|
39
|
+
@round ||= values['Round']
|
40
40
|
end
|
41
41
|
|
42
42
|
def eco
|
43
|
-
@eco ||= values[
|
43
|
+
@eco ||= values['Eco']
|
44
44
|
end
|
45
45
|
|
46
46
|
def result
|
47
|
-
@result ||= values[
|
47
|
+
@result ||= values['Result']
|
48
48
|
end
|
49
49
|
|
50
50
|
def values
|
data/lib/pgn/move_info_parser.rb
CHANGED
@@ -3,11 +3,11 @@ module Bchess
|
|
3
3
|
class MoveInfoParser
|
4
4
|
attr_accessor :info, :move, :castle, :move_string
|
5
5
|
|
6
|
-
CHECK =
|
7
|
-
TAKE =
|
8
|
-
TAKE_2 =
|
9
|
-
MATE =
|
10
|
-
PROMOTION =
|
6
|
+
CHECK = '+'.freeze
|
7
|
+
TAKE = 'x'.freeze
|
8
|
+
TAKE_2 = ':'.freeze
|
9
|
+
MATE = '#'.freeze
|
10
|
+
PROMOTION = '='.freeze
|
11
11
|
|
12
12
|
def initialize(move, castle)
|
13
13
|
@move = move
|
@@ -38,7 +38,7 @@ module Bchess
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def extract_piece_type(move_string)
|
41
|
-
if
|
41
|
+
if move_string.size == 2 || move_string.size && pawn_taking?(move_string)
|
42
42
|
Bchess::Pawn
|
43
43
|
else
|
44
44
|
get_piece_from_letter(move_string[0])
|
@@ -58,9 +58,9 @@ module Bchess
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def extract_additional_info(move_string)
|
61
|
-
if (
|
61
|
+
if (move_string.size == 3) && pawn_taking?(move_string)
|
62
62
|
move_string[0]
|
63
|
-
elsif
|
63
|
+
elsif move_string.size == 4
|
64
64
|
move_string[1]
|
65
65
|
end
|
66
66
|
end
|
@@ -79,26 +79,26 @@ module Bchess
|
|
79
79
|
def basic_move_data(move_split)
|
80
80
|
@move_string = move_split.last.strip
|
81
81
|
|
82
|
-
raise InvalidMoveException
|
82
|
+
raise InvalidMoveException, 'Wrong move description' if move_string.size < 2
|
83
|
+
|
83
84
|
color = move_split.size == 2 ? Bchess::WHITE : Bchess::BLACK
|
84
85
|
number = move_split.first.strip if move_split.size == 2
|
85
86
|
{
|
86
87
|
piece_color: color,
|
87
|
-
move_number:
|
88
|
-
check:
|
88
|
+
move_number: number,
|
89
|
+
check: move_string.include?(CHECK),
|
89
90
|
take: move_string.include?(TAKE) || move_string.include?(TAKE_2),
|
90
|
-
mate: move_string.include?(MATE)
|
91
|
+
mate: move_string.include?(MATE)
|
91
92
|
}
|
92
93
|
end
|
93
94
|
|
94
|
-
|
95
95
|
def get_piece_from_letter(letter)
|
96
96
|
{
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
97
|
+
'K' => Bchess::King,
|
98
|
+
'Q' => Bchess::Queen,
|
99
|
+
'R' => Bchess::Rook,
|
100
|
+
'B' => Bchess::Bishop,
|
101
|
+
'N' => Bchess::Knight
|
102
102
|
}[letter]
|
103
103
|
end
|
104
104
|
end
|
data/lib/pgn/parser.rb
CHANGED
@@ -2,7 +2,7 @@ require 'treetop'
|
|
2
2
|
|
3
3
|
module Bchess
|
4
4
|
module PGN
|
5
|
-
class ParserException <
|
5
|
+
class ParserException < RuntimeError; end
|
6
6
|
|
7
7
|
class Parser
|
8
8
|
attr_reader :input, :output, :error, :tree
|
@@ -15,13 +15,13 @@ module Bchess
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def parse
|
18
|
-
if input.
|
18
|
+
if input.is_a?(String)
|
19
19
|
@tree = @@parser.parse(input)
|
20
|
-
elsif input.
|
20
|
+
elsif input.is_a?(Bchess::PGN::PGNFile)
|
21
21
|
@tree = @@parser.parse(input.load_games)
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
unless tree
|
25
25
|
raise PGN::ParserException, "Parse error at offset: #{@@parser.index}"
|
26
26
|
end
|
27
27
|
|
@@ -34,8 +34,8 @@ module Bchess
|
|
34
34
|
root_elements = root_node.elements
|
35
35
|
return unless root_elements
|
36
36
|
|
37
|
-
root_elements.delete_if{ |node| node.class.name ==
|
38
|
-
root_elements.each{ |node| sanitize_tree(node) }
|
37
|
+
root_elements.delete_if { |node| node.class.name == 'Treetop::Runtime::SyntaxNode' }
|
38
|
+
root_elements.each { |node| sanitize_tree(node) }
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/lib/pgn/pgn_file.rb
CHANGED
data/lib/pgn/pgn_nodes.rb
CHANGED
@@ -10,7 +10,7 @@ module Sexp
|
|
10
10
|
|
11
11
|
class PHeader < Treetop::Runtime::SyntaxNode
|
12
12
|
def parse(value)
|
13
|
-
val = value.split(
|
13
|
+
val = value.split(' ', 2)
|
14
14
|
|
15
15
|
[val[0].delete('['), val[1].delete('"]').rstrip]
|
16
16
|
end
|
@@ -72,11 +72,11 @@ class Treetop::Runtime::SyntaxNode
|
|
72
72
|
def create_value_hash
|
73
73
|
hash = {}
|
74
74
|
|
75
|
-
|
75
|
+
elements.each do |element|
|
76
76
|
key = element.elements.first.text_value
|
77
77
|
value = element.elements.last.text_value
|
78
78
|
|
79
|
-
hash[key] = value.
|
79
|
+
hash[key] = value.delete('"')
|
80
80
|
end
|
81
81
|
|
82
82
|
hash
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bchess
|
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
|
- Staszek Zawadzki
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,20 +80,6 @@ dependencies:
|
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '1.6'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
83
|
description: Parsing and validating a chess games and returning as chess game objects
|
84
84
|
email:
|
85
85
|
- s.zawadzki@visuality.pl
|
@@ -126,7 +126,7 @@ files:
|
|
126
126
|
- lib/pgn/pgn_nodes.rb
|
127
127
|
- lib/pgn/pgn_rules.treetop
|
128
128
|
- test.sh
|
129
|
-
homepage:
|
129
|
+
homepage: https://github.com/visualitypl/bchess
|
130
130
|
licenses:
|
131
131
|
- MIT
|
132
132
|
metadata: {}
|