// Fhourstones 3.1 Board Logic // (http://www.cwi.nl/~tromp/c4/fhour.html) // // implementation of the well-known game // usually played on a vertical board of 7 columns by 6 rows, // where 2 players take turns in dropping counters in a column. // the first player to get four of his counters // in a horizontal, vertical or diagonal row, wins the game. // if neither player has won after 42 moves, then the game is drawn. // // This software is copyright (c) 1996-2005 by // John Tromp // Insulindeweg 908 // 1095 DX Amsterdam // Netherlands // E-mail: tromp@cwi.nl // // This notice must not be removed. // This software must not be sold for profit. // You may redistribute if your distributees have the // same rights and restrictions. class Game { static long color[]; // black and white bitboard static final int WIDTH = 7; static final int HEIGHT = 6; // bitmask corresponds to board as follows in 7x6 case: // . . . . . . . TOP // 5 12 19 26 33 40 47 // 4 11 18 25 32 39 46 // 3 10 17 24 31 38 45 // 2 9 16 23 30 37 44 // 1 8 15 22 29 36 43 // 0 7 14 21 28 35 42 BOTTOM static final int H1 = HEIGHT+1; static final int H2 = HEIGHT+2; static final int SIZE = HEIGHT*WIDTH; static final int SIZE1 = H1*WIDTH; static final long ALL1 = (1L<=0; h--) { for (int w=h; w>HEIGHT); // check diagonal \ long hori = newboard & (newboard>>H1); // check horizontal - long diag2 = newboard & (newboard>>H2); // check diagonal / long vert = newboard & (newboard>>1); // check vertical | return ((diag1 & (diag1 >> 2*HEIGHT)) | (hori & (hori >> 2*H1)) | (diag2 & (diag2 >> 2*H2)) | (vert & (vert >> 2))) != 0; } void backmove() { int n; n = moves[--nplies]; color[nplies&1] ^= 1L<<--height[n]; } void makemove(int n) { color[nplies&1] ^= 1L<