[gnome-games] chess: Track halfmove clock



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]