Class: Bchess::Piece

Inherits:
Object
  • Object
show all
Includes:
BoardHelpers, FieldBetweenHelpers
Defined in:
lib/bchess/piece.rb

Direct Known Subclasses

Bishop, King, Knight, Pawn, Queen, Rook

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from FieldBetweenHelpers

#column_fields, #diagonal_fields, #fields_between, #row_fields

Methods included from BoardHelpers

#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

#colorObject (readonly)

Returns the value of attribute color.



3
4
5
# File 'lib/bchess/piece.rb', line 3

def color
  @color
end

#columnObject (readonly)

Returns the value of attribute column.



3
4
5
# File 'lib/bchess/piece.rb', line 3

def column
  @column
end

#rowObject (readonly)

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

Returns:

  • (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

Returns:

  • (Boolean)


26
27
28
# File 'lib/bchess/piece.rb', line 26

def at?(dcolumn, drow)
  column == dcolumn && row == drow
end

#black?Boolean

Returns:

  • (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 (dcolumn, drow, range)
  same_row?(drow) && (column - dcolumn).abs <= range  ||
  same_column?(dcolumn) && (row - drow).abs <= range
end

#can_be_promoted?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/bchess/piece.rb', line 93

def can_be_promoted?
  false
end

#can_en_passant?(column, row, board) ⇒ Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

#movedObject



18
19
20
# File 'lib/bchess/piece.rb', line 18

def moved
  false
end

#nameObject

Raises:

  • (Exception)


22
23
24
# File 'lib/bchess/piece.rb', line 22

def name
  raise Exception.new("Should be defined in subclass")
end

#to_sObject



14
15
16
# File 'lib/bchess/piece.rb', line 14

def to_s
  name + field(column, row)
end

#valid?Boolean

Returns:

  • (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

Returns:

  • (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) # TODO
end

#white?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/bchess/piece.rb', line 111

def white?
  color == Bchess::WHITE
end