Class: Chess::CGame

Inherits:
Object
  • Object
show all
Defined in:
ext/chess.c,
ext/chess.c

Overview

This class rappresents a collection of boards of a single chess game.

Direct Known Subclasses

Game

Instance Method Summary collapse

Instance Method Details

#[](n) ⇒ Board

Returns the n-th Board of the Game or nil if the n-th Board does not exist.



210
211
212
213
214
215
216
217
218
219
220
# File 'ext/chess.c', line 210

VALUE
game_boards (VALUE self, VALUE index)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  int n = FIX2INT (index);
  Board *board = get_board (g, n);
  if (board)
    return Data_Wrap_Struct (board_klass, 0, 0, board);
  return Qnil;
}

#coord_movesArray<String>

Returns the array with all moves done in coordinate chess notation _(es: b1c3)_.



258
259
260
261
262
263
264
265
266
267
# File 'ext/chess.c', line 258

VALUE
game_coord_moves (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  VALUE moves = rb_ary_new ();
  for (int i = 0; i < g->current; i++)
    rb_ary_push (moves, rb_str_new2 (g->coord_moves[i]));
  return moves;
}

#currentBoard Also known as: board

Returns the current Board of the Game (the current chess position of the game).



228
229
230
231
232
233
234
# File 'ext/chess.c', line 228

VALUE
game_current_board (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  return game_boards (self, INT2FIX (g->current-1));
}

#drawnil

The game result is set to draw.



195
196
197
198
199
200
201
202
# File 'ext/chess.c', line 195

VALUE
game_draw (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  g->result = DRAW;
  return Qnil;
}

#each {|board, move, coord_move, index| ... } ⇒ Game, Array<String>

Cycle the Game.

Yields:

  • (board, move, coord_move, index)

    Calls block once for each Board in self, passing that board, move, coord_move and index as parameters.



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
# File 'ext/chess.c', line 339

VALUE
game_each (VALUE self)
{
  if (!rb_block_given_p ())
    return game_moves(self);
  Game *g;
  Data_Get_Struct (self, Game, g);
  for (int i = 0; i < g->current; i++)
    rb_yield_values (4,
                     Data_Wrap_Struct (board_klass, 0, 0, get_board (g, i)),
                     rb_str_new2 (g->moves[i]),
                     rb_str_new2 (g->coord_moves[i]),
                     INT2FIX (i));
  return self;
}

#full_movesObject

Deprecated.

Use #coord_moves instead.



273
274
275
276
277
278
# File 'ext/chess.c', line 273

VALUE
game_full_moves (VALUE self)
{
  printf ("DEPRECATION WARNING: `full_moves` is deprecated and will be removed, please use `coord_moves` to get the array with all moves done in coordinate chess notation.\n");
  return game_coord_moves (self);
}

#move(piece, disambiguating, to_coord, promote_in) ⇒ String

Note:

This add a new Board in the Game.

Make a move.

Raises:



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'ext/chess.c', line 71

VALUE
game_move (VALUE self, VALUE rb_piece, VALUE rb_disambiguating, VALUE rb_to_coord, VALUE rb_promote_in)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  Board *board = current_board (g);
  char piece = StringValuePtr (rb_piece)[0];
  char *disambiguating = rb_disambiguating == Qnil ? NULL : StringValuePtr (rb_disambiguating);
  char *to_coord = StringValuePtr (rb_to_coord);
  char promote_in = rb_promote_in == Qnil ? '\0' : StringValuePtr (rb_promote_in)[0];
  int from, to;
  if (
    get_coord (board, piece, disambiguating, to_coord, promote_in, &from, &to) &&
    apply_move (g, from, to, promote_in)
  )
    return rb_str_new2 (current_move (g));
  else
    rb_raise (illegal_move_error, "Illegal move");
}

#move2(from, to, promote_in) ⇒ String

Note:

This add a new Board in the Game.

Make a move.

Raises:



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'ext/chess.c', line 106

VALUE
game_move2 (VALUE self, VALUE rb_from, VALUE rb_to, VALUE rb_promote_in)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  Board *board = current_board (g);
  int from = coord_to_square (StringValuePtr (rb_from));
  int to = coord_to_square (StringValuePtr (rb_to));
  char promote_in = rb_promote_in == Qnil ? '\0' : StringValuePtr (rb_promote_in)[0];
  if (pseudo_legal_move (board, from, to) && apply_move (g, from, to, promote_in))
    return rb_str_new2 (current_move (g));
  else
    rb_raise (illegal_move_error, "Illegal move");
}

#move3(from, to, promote_in) ⇒ String

Note:

This add a new Board in the Game.

Make a move. Each square on the chessboard is represented by an integer according to the following scheme:

8 | 56 57 58 59 60 61 62 63
7 | 48 49 50 51 52 53 54 55
6 | 40 41 42 43 44 45 46 47
5 | 32 33 34 35 36 37 38 39
4 | 24 25 26 27 28 29 30 31
3 | 16 17 18 19 20 21 22 23
2 |  8  9 10 11 12 13 14 15
1 |  0  1  2  3  4  5  6  7
  +-------------------------
     a  b  c  d  e  f  g  h

Raises:



150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'ext/chess.c', line 150

VALUE
game_move3 (VALUE self, VALUE rb_from, VALUE rb_to, VALUE rb_promote_in)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  Board *board = current_board (g);
  int from = FIX2INT (rb_from);
  int to = FIX2INT (rb_to);
  char promote_in = rb_promote_in == Qnil ? '\0' : StringValuePtr (rb_promote_in)[0];
  if (pseudo_legal_move (board, from, to) && apply_move (g, from, to, promote_in))
    return rb_str_new2 (current_move (g));
  else
    rb_raise (illegal_move_error, "Illegal move");
}

#movesArray<String>

Returns the array with all moves done _(es: Nc3)_.



241
242
243
244
245
246
247
248
249
250
# File 'ext/chess.c', line 241

VALUE
game_moves (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  VALUE moves = rb_ary_new ();
  for (int i = 0; i < g->current; i++)
    rb_ary_push (moves, rb_str_new2 (g->moves[i]));
  return moves;
}

#resign(color) ⇒ nil

The game result is set to ‘1-0’ if color is black, otherwise is set to ‘0-1’ if color is white.



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'ext/chess.c', line 173

VALUE
game_resign (VALUE self, VALUE color)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  const char *c;
  if (TYPE (color) == T_SYMBOL)
    c = rb_id2name (SYM2ID (color));
  else
    c = StringValuePtr (color);
  if (strcmp (c, "black") == 0)
    g->result = WHITE_WON;
  else if (strcmp (c, "white") == 0)
    g->result = BLACK_WON;
  return Qnil;
}

#resultString

Returns the result of the game.



306
307
308
309
310
311
312
313
314
315
# File 'ext/chess.c', line 306

VALUE
game_result (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  char *result = result_to_s (g->result);
  VALUE rb_result = rb_str_new2 (result);
  free (result);
  return rb_result;
}

#rollback!Game

Rollback last move.



360
361
362
363
364
365
366
367
# File 'ext/chess.c', line 360

VALUE
game_rollback (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  rollback (g);
  return self;
}

#set_fen!(fen) ⇒ Game

Set the game position by FEN string.



36
37
38
39
40
41
42
43
# File 'ext/chess.c', line 36

VALUE
game_set_fen (VALUE self, VALUE fen)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  set_fen (g, StringValuePtr (fen));
  return self;
}

#sizeInteger

Returns the number of moves done.



322
323
324
325
326
327
328
# File 'ext/chess.c', line 322

VALUE
game_size (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  return INT2FIX (g->current);
}

#threefold_repetition?Boolean

Returns true if a player can claim draw by the threefold repetition rule, false otherwise.



285
286
287
288
289
290
291
292
293
294
# File 'ext/chess.c', line 285

VALUE
game_threefold_repetition (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  if (threefold_repetition (g))
    return Qtrue;
  else
    return Qfalse;
}

#to_sString

Current Board to string.



374
375
376
377
378
379
380
381
382
383
384
# File 'ext/chess.c', line 374

VALUE
game_to_s (VALUE self)
{
  Game *g;
  Data_Get_Struct (self, Game, g);
  Board *b = get_board (g, g->current-1);
  char *s = print_board (b);
  VALUE rb_s = rb_str_new2 (s);
  free (s);
  return rb_s;
}