Class: MailChess::Piece::Queen

Inherits:
Piece
  • Object
show all
Defined in:
lib/mail_chess/pieces/queen.rb

Overview

Represents a queen chess piece.

Instance Attribute Summary

Attributes inherited from Piece

#board, #color, #hits, #html, #id, #moves, #type

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Piece

#can_hit?, #can_move?, create_tables, #delete!, load!, #move, need_to_create_tables?, #position, #save!

Constructor Details

#initialize(db, piece_id, board = nil) ⇒ Queen

Calls the superclass.



11
12
13
14
15
# File 'lib/mail_chess/pieces/queen.rb', line 11

def initialize db, piece_id, board = nil
  super db, piece_id, board
  
  @html = @color == :white ? '♕' : '♛'
end

Class Method Details

.new!(db, board, position, color) ⇒ Object

Overwrite superclass method.



18
19
20
21
22
23
24
25
26
27
# File 'lib/mail_chess/pieces/queen.rb', line 18

def self.new! db, board, position, color
  super db, board, position, color

  id = db[:pieces].insert(:type => 'queen', 
                          :color => color.to_s,
                          :position => position,
                          :board_id => board.id)

  return Queen.new db, id, board
end

Instance Method Details

#generate_movesObject

Generate the possible moves.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/mail_chess/pieces/queen.rb', line 30

def generate_moves
  super
  
  r, c = ROWS.index(position[1]), COLS.index(position[0])
  f = {:ul => false, :uc => false, :ur => false,
    :ml => false, :mc => true,  :mr => false,
    :bl => false, :bc => false, :br => false}
  
  (1..7).each do |i|
    pos = [] 
    {'u' => -1, 'm' => 0, 'b' => 1}.each do |y, v|
      {'l' => -1, 'c' => 0, 'r' => 1}.each do |x, w|
        s, cc, rr = (y + x).to_sym, c + w * i, r + v * i
        if cc >= 0 and cc <= 7 and rr >= 0 and rr <= 7
          pos << [s, COLS[cc] + ROWS[rr]] if !f[s]
        else
          f[s] = true
        end
      end
    end
    
    break if pos.empty?
    pos.each do |s, p|
      if @board.pieces[p]
        @hits << p if @board.pieces[p].color != @color
        f[s] = true
      else
        @moves << p
      end
    end
  end
end