[gnome-games] chess: Track halfmove clock
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-games] chess: Track halfmove clock
- Date: Tue, 25 Jan 2011 05:21:36 +0000 (UTC)
commit 695cf43e87266388ce4e6c901646b62a29b82b98
Author: Robert Ancell <robert ancell canonical com>
Date: Tue Jan 25 14:53:52 2011 +1000
chess: Track halfmove clock
glchess/src/chess-game.vala | 16 ++++++++++++----
glchess/src/test-chess-game.vala | 8 ++++----
2 files changed, 16 insertions(+), 8 deletions(-)
---
diff --git a/glchess/src/chess-game.vala b/glchess/src/chess-game.vala
index ac5cd31..c3c1c1f 100644
--- a/glchess/src/chess-game.vala
+++ b/glchess/src/chess-game.vala
@@ -212,6 +212,7 @@ public class ChessState
public bool can_castle_queenside[2];
public int en_passant_index = -1;
public CheckState check_state;
+ public int halfmove_clock;
public ChessPiece board[64];
public ChessMove? last_move = null;
@@ -299,8 +300,8 @@ public class ChessState
en_passant_index = get_index (fields[3][1] - '1', fields[3][0] - 'a');
}
- /* Field 5: Halfmove count */
- // FIXME
+ /* Field 5: Halfmove clock */
+ halfmove_clock = fields[4].to_int ();
/* Field 6: Fullmove number */
number = (fields[5].to_int () - 1) * 2;
@@ -386,9 +387,8 @@ public class ChessState
else
value.append_c ('-');
- // FIXME: Halfmove count
value.append_c (' ');
- value.append_c ('0');
+ value.append_printf ("%d", halfmove_clock);
value.append_c (' ');
if (current_player.color == Color.WHITE)
@@ -576,6 +576,7 @@ public class ChessState
var old_black_can_castle_kingside = can_castle_kingside[Color.BLACK];
var old_black_can_castle_queenside = can_castle_queenside[Color.BLACK];
var old_en_passant_index = en_passant_index;
+ var old_halfmove_clock = halfmove_clock;
/* Update board */
board[start] = null;
@@ -623,6 +624,12 @@ public class ChessState
else
en_passant_index = -1;
+ /* Reset halfmove count when pawn moved or piece taken */
+ if (piece.type == PieceType.PAWN || victim != null)
+ halfmove_clock = 0;
+ else
+ halfmove_clock++;
+
/* Test if this move would leave that player in check */
bool result = true;
if (test_check && is_in_check (player))
@@ -648,6 +655,7 @@ public class ChessState
can_castle_kingside[Color.BLACK] = old_black_can_castle_kingside;
can_castle_queenside[Color.BLACK] = old_black_can_castle_queenside;
en_passant_index = old_en_passant_index;
+ halfmove_clock = old_halfmove_clock;
return result;
}
diff --git a/glchess/src/test-chess-game.vala b/glchess/src/test-chess-game.vala
index 03e4ecd..089d202 100644
--- a/glchess/src/test-chess-game.vala
+++ b/glchess/src/test-chess-game.vala
@@ -67,11 +67,11 @@ class GlChess
/* Castle kingside */
test_good_move ("8/8/8/8/8/8/8/4K2R w K - 0 1", "O-O",
- "8/8/8/8/8/8/8/5RK1 b - - 0 1");
+ "8/8/8/8/8/8/8/5RK1 b - - 1 1");
/* Castle queenside */
test_good_move ("8/8/8/8/8/8/8/R3K3 w Q - 0 1", "O-O-O",
- "8/8/8/8/8/8/8/2KR4 b - - 0 1");
+ "8/8/8/8/8/8/8/2KR4 b - - 1 1");
/* Can't castle if pieces moved */
test_bad_move ("8/8/8/8/8/8/8/4K2R w - - 0 1", "O-O");
@@ -90,11 +90,11 @@ class GlChess
/* Check */
test_good_move ("k7/8/8/8/8/8/8/1R6 w - - 0 1", "b1a1",
- "k7/8/8/8/8/8/8/R7 b - - 0 1", CheckState.CHECK);
+ "k7/8/8/8/8/8/8/R7 b - - 1 1", CheckState.CHECK);
/* Checkmate */
test_good_move ("k7/8/8/8/8/8/1R6/1R6 w - - 0 1", "b1a1",
- "k7/8/8/8/8/8/1R6/R7 b - - 0 1", CheckState.CHECKMATE);
+ "k7/8/8/8/8/8/1R6/R7 b - - 1 1", CheckState.CHECKMATE);
stdout.printf ("%d/%d tests successful\n", test_count - failure_count, test_count);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]