Class: Bchess::Piece
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#additional_info?(info) ⇒ Boolean
-
#at?(dcolumn, drow) ⇒ Boolean
-
#black? ⇒ Boolean
-
#by_diagonal(dcolumn, drow, range) ⇒ Object
-
#by_line(dcolumn, drow, range) ⇒ Object
-
#can_be_promoted? ⇒ Boolean
-
#can_en_passant?(column, row, board) ⇒ Boolean
-
#can_make_move?(info, board) ⇒ Boolean
-
#can_move?(column, row) ⇒ Boolean
-
#can_move_or_take?(column, row, board) ⇒ Boolean
-
#can_move_to_field?(dcolumn, drow) ⇒ Boolean
-
#can_take?(column, row, board, en_passant = false) ⇒ Boolean
-
#can_take_on_field?(dcolumn, drow) ⇒ Boolean
-
#clear_path?(column, row, board) ⇒ Boolean
-
#initialize(color, column, row) ⇒ Piece
constructor
-
#move(dcolumn, drow) ⇒ Object
-
#moved ⇒ Object
-
#name ⇒ Object
-
#to_s ⇒ Object
-
#valid? ⇒ Boolean
-
#valid_position_after?(dcolumn, drow, board) ⇒ Boolean
-
#white? ⇒ Boolean
#column_fields, #diagonal_fields, #fields_between, #row_fields
#castle_detected?, #en_passant_detected?, #field, #invalid_data?, #kings_present?, #pawn_long_move_detected?, #promotion_detected?, #to_column, #to_row
Constructor Details
#initialize(color, column, row) ⇒ Piece
Returns a new instance of Piece.
8
9
10
11
12
|
# File 'lib/bchess/piece.rb', line 8
def initialize(color, column, row)
@color = color
@column = column
@row = row
end
|
Instance Attribute Details
#color ⇒ Object
Returns the value of attribute color.
3
4
5
|
# File 'lib/bchess/piece.rb', line 3
def color
@color
end
|
#column ⇒ Object
Returns the value of attribute column.
3
4
5
|
# File 'lib/bchess/piece.rb', line 3
def column
@column
end
|
#row ⇒ Object
Returns the value of attribute row.
3
4
5
|
# File 'lib/bchess/piece.rb', line 3
def row
@row
end
|
Instance Method Details
#additional_info?(info) ⇒ Boolean
80
81
82
|
# File 'lib/bchess/piece.rb', line 80
def additional_info?(info)
info.nil? || to_column(info) == column || to_row(info) == row
end
|
#at?(dcolumn, drow) ⇒ Boolean
26
27
28
|
# File 'lib/bchess/piece.rb', line 26
def at?(dcolumn, drow)
column == dcolumn && row == drow
end
|
#black? ⇒ Boolean
115
116
117
|
# File 'lib/bchess/piece.rb', line 115
def black?
color == Bchess::BLACK
end
|
#by_diagonal(dcolumn, drow, range) ⇒ Object
106
107
108
109
|
# File 'lib/bchess/piece.rb', line 106
def by_diagonal(dcolumn, drow, range)
same_diagonal?(dcolumn, drow) &&
(column - dcolumn).abs <= range
end
|
#by_line(dcolumn, drow, range) ⇒ Object
101
102
103
104
|
# File 'lib/bchess/piece.rb', line 101
def by_line(dcolumn, drow, range)
same_row?(drow) && (column - dcolumn).abs <= range ||
same_column?(dcolumn) && (row - drow).abs <= range
end
|
93
94
95
|
# File 'lib/bchess/piece.rb', line 93
def can_be_promoted?
false
end
|
#can_en_passant?(column, row, board) ⇒ Boolean
67
68
69
|
# File 'lib/bchess/piece.rb', line 67
def can_en_passant?(column, row, board)
board.en_passant == field(column, row) && can_take?(column, row, board, true)
end
|
#can_make_move?(info, board) ⇒ Boolean
35
36
37
38
39
40
41
42
43
44
|
# File 'lib/bchess/piece.rb', line 35
def can_make_move?(info, board)
row = to_row(info[:row])
column = to_column(info[:column])
board.at(column, row)&.color != color &&
kind_of?(info[:piece_type]) &&
info[:piece_color] == color &&
can_move_or_take?(column, row, board) &&
additional_info?(info[:additional_info])
end
|
#can_move?(column, row) ⇒ Boolean
59
60
61
|
# File 'lib/bchess/piece.rb', line 59
def can_move?(column, row)
can_move_to_field?(column, row)
end
|
#can_move_or_take?(column, row, board) ⇒ Boolean
46
47
48
49
50
51
52
53
|
# File 'lib/bchess/piece.rb', line 46
def can_move_or_take?(column, row, board)
clear_path?(column, row, board) &&
(
can_move?(column, row) ||
can_take?(column, row, board) ||
can_en_passant?(column, row, board)
) && valid_position_after?(column, row, board)
end
|
#can_move_to_field?(dcolumn, drow) ⇒ Boolean
84
85
86
87
|
# File 'lib/bchess/piece.rb', line 84
def can_move_to_field?(dcolumn, drow)
!(column == dcolumn && drow == row) &&
(0..7).include?(dcolumn) && (0..7).include?(drow)
end
|
#can_take?(column, row, board, en_passant = false) ⇒ Boolean
63
64
65
|
# File 'lib/bchess/piece.rb', line 63
def can_take?(column, row, board, en_passant = false)
can_take_on_field?(column, row) && (!!board.at(column, row) || en_passant)
end
|
#can_take_on_field?(dcolumn, drow) ⇒ Boolean
89
90
91
|
# File 'lib/bchess/piece.rb', line 89
def can_take_on_field?(dcolumn, drow)
can_move_to_field?(dcolumn, drow)
end
|
#clear_path?(column, row, board) ⇒ Boolean
55
56
57
|
# File 'lib/bchess/piece.rb', line 55
def clear_path?(column, row, board)
fields_between(column, row).none?{|f| board.at(*f)}
end
|
#move(dcolumn, drow) ⇒ Object
30
31
32
33
|
# File 'lib/bchess/piece.rb', line 30
def move(dcolumn, drow)
@column = dcolumn
@row = drow
end
|
#moved ⇒ Object
18
19
20
|
# File 'lib/bchess/piece.rb', line 18
def moved
false
end
|
#name ⇒ Object
22
23
24
|
# File 'lib/bchess/piece.rb', line 22
def name
raise Exception.new("Should be defined in subclass")
end
|
#to_s ⇒ Object
14
15
16
|
# File 'lib/bchess/piece.rb', line 14
def to_s
name + field(column, row)
end
|
#valid? ⇒ Boolean
97
98
99
|
# File 'lib/bchess/piece.rb', line 97
def valid?
(0..7).include?(column) && (0..7).include?(row)
end
|
#valid_position_after?(dcolumn, drow, board) ⇒ Boolean
71
72
73
74
75
76
77
78
|
# File 'lib/bchess/piece.rb', line 71
def valid_position_after?(dcolumn, drow, board)
fen = board.write_fen
helper_board = Bchess::Board.new(fen)
helper_board.read_fen
helper_piece = helper_board.at(column, row)
helper_board.move(helper_piece, dcolumn, drow, Bchess::Queen) end
|
#white? ⇒ Boolean
111
112
113
|
# File 'lib/bchess/piece.rb', line 111
def white?
color == Bchess::WHITE
end
|