// 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); if ((y & (y >> 2*HEIGHT)) != 0) // check diagonal \ return true; y = newboard & (newboard>>H1); if ((y & (y >> 2*H1)) != 0) // check horizontal - return true; y = newboard & (newboard>>H2); // check diagonal / if ((y & (y >> 2*H2)) != 0) return true; y = newboard & (newboard>>1); // check vertical | return (y & (y >> 2)) != 0; } void backmove() { int n; n = moves[--nplies]; color[nplies&1] ^= 1L<<--height[n]; } void makemove(int n) { color[nplies&1] ^= 1L<