Class: MailChess::Board

Inherits:
Object
  • Object
show all
Defined in:
lib/mail_chess/board.rb

Overview

Represents a chessboard.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(db, board_id) ⇒ Board

Create a new Board object.

Arguments:

db: Sequel database object
board_id: (Integer)


29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/mail_chess/board.rb', line 29

def initialize db, board_id
  @db = db

  Board.create_tables(@db) if Board.need_to_create_tables?(@db)

  @db_entry = @db[:boards].filter(:id => board_id).first

  @id = @db_entry[:id].to_i
  @pieces = {}
  @db[:pieces].filter(:board_id => @id).all.each do |p|
    Piece::Piece.load! db, p[:id], self
  end
end

Instance Attribute Details

#boardObject

Board itself.



19
20
21
# File 'lib/mail_chess/board.rb', line 19

def board
  @board
end

#idObject (readonly)

Board ID in database.



16
17
18
# File 'lib/mail_chess/board.rb', line 16

def id
  @id
end

#piecesObject

Pieces on this board.



22
23
24
# File 'lib/mail_chess/board.rb', line 22

def pieces
  @pieces
end

Class Method Details

.create_tables(db) ⇒ Object

Create tables.



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/mail_chess/board.rb', line 51

def self.create_tables db
  db.create_table? :boards do
    primary_key :id
  end

  db.create_table? :pieces do
    primary_key :id
    String :type
    String :color
    String :position
    foreign_key :board_id, :boards, :key => :id
  end
end

.load!(db, filter, value) ⇒ Object

Load game from database.

Arguments:

db: Sequel database object
filter: (Symbol) :id only (for now)
value: filters value

Returns: (Board)

Raises:

  • (ArgumentError)


87
88
89
90
91
92
93
94
95
96
97
# File 'lib/mail_chess/board.rb', line 87

def self.load! db, filter, value
  raise ArgumentError unless [:id, :reference].index(filter)
  dataset = db[:games].filter(filter => value)
  raise ArgumentError unless dataset.all.size == 1

  id = dataset.first[:id]

  b = Board.new db, id

  return b
end

.need_to_create_tables?(db) ⇒ Boolean

Checks if needed to create tables.

Returns: (Boolean)

Returns:

  • (Boolean)


46
47
48
# File 'lib/mail_chess/board.rb', line 46

def self.need_to_create_tables? db
  return (db.tables + [:boards, :pieces]).uniq.size != db.tables.size
end

.new!(db) ⇒ Object

Create new board object and save it to database.

Arguments:

db: Sequel database object

Returns: (Board)



71
72
73
74
75
76
77
# File 'lib/mail_chess/board.rb', line 71

def self.new! db
  Board.create_tables(db) if Board.need_to_create_tables?(db)

  id = db[:boards].insert

  return Board.new db, id
end

Instance Method Details

#add(field, piece) ⇒ Object

Add a new piece to board.

Arguments:

field: (String)
piece: (Piece)

Returns: (Piece)



122
123
124
125
126
# File 'lib/mail_chess/board.rb', line 122

def add field, piece
  @pieces[field] = piece

  return piece
end

#delete!Object

Delete game – save! won’t fix it!



107
108
109
110
111
112
113
# File 'lib/mail_chess/board.rb', line 107

def delete!
  pieces.values.each do |p|
    p.delete!
  end
  
  # board deleted in Game class
end

#remove(field) ⇒ Object

Removes a piece from board.

Arguments:

field: (String)

Returns: (Piece)



134
135
136
137
138
139
# File 'lib/mail_chess/board.rb', line 134

def remove field
  piece = @pieces[field]
  @pieces.delete(field)

  return piece
end

#save!Object

Save game – save the pieces.



100
101
102
103
104
# File 'lib/mail_chess/board.rb', line 100

def save!
  pieces.values.each do |p|
    p.save!
  end
end

#start!Object

Place the start position of pieces.



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/mail_chess/board.rb', line 142

def start!
  COLS.each do |c|
    Piece::Pawn.new!(@db, self, c + '2', :white)
    Piece::Pawn.new!(@db, self, c + '7', :black)
  end

  %w[a h].each do |c|
    Piece::Rook.new!(@db, self, c + '1', :white)
    Piece::Rook.new!(@db, self, c + '8', :black)
  end

  %w[b g].each do |c|
    Piece::Knight.new!(@db, self, c + '1', :white)
    Piece::Knight.new!(@db, self, c + '8', :black)
  end

  %w[c f].each do |c|
    Piece::Bishop.new!(@db, self, c + '1', :white)
    Piece::Bishop.new!(@db, self, c + '8', :black)
  end

  Piece::Queen.new!(@db, self, 'd1', :white)
  Piece::Queen.new!(@db, self, 'd8', :black)

  Piece::King.new!(@db, self, 'e1', :white)
  Piece::King.new!(@db, self, 'e8', :black)
end

#to_html(player = :white) ⇒ Object

Generate HTML output.

Attributes:

player: (Symbol) which view

Returns: (String)



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/mail_chess/board.rb', line 176

def to_html player = :white
  result = '<table border="0" cellpadding="0" cellspacing="0">'
  result << '<tr height="40"><td align="center" width="40"></td>'

  cols = (player == :white ? COLS : COLS.reverse)
  cols.each do |c|
    result << '<td align="center" width="40"><b>'
    result << c.capitalize + '</b></td>'
  end
  result << '<td align="center" width="40"></td></tr>'

  rows = (player == :white ? ROWS : ROWS.reverse)
  start_color = :white

  rows.each do |r|
    result << '<tr height="40"><td align="center"><b>' + r + '</b></td>'
    cell_color = start_color
    cols.each do |c|
      result << '<td align="center" bgcolor="'
      result << (cell_color == :white ? '#ffffff' : '#d0d0d0')
      result << '">'
      
      if @pieces[c + r]
        result << '<font size="6">'
        result << @pieces[c + r].html
        result << '</font>'
      end
      result << '</td>'
      cell_color = (cell_color == :white ? :black : :white)
    end
    result << '<td align="center"><b>' + r + '</b></td></tr>'
    start_color = (start_color == :white ? :black : :white)
  end

  result << '<tr height="40"><td align="center" width="40"></td>'
  cols.each do |c|
    result << '<td align="center" width="40"><b>'
    result << c.capitalize + '</b></td>'
  end
  result << '<td align="center" width="40"></td></tr>'

  result << '</table>'

  return result
end