🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.chess
Article #462

Chess960

#462
From: Jason Sidabras
Date: Thu, 21 Aug 2008 01:21
383 lines
13055 bytes
Hello,

I have just made a patch for gnuchess 5.07 which adds the -n switch to
play chess960 and increments to version 5.08. Testing is needed for
castling but I think everything should work.

"Chess960 is a chess variant produced by the late former World
Champion Bobby Fischer by modifying the rules of Shuffle Chess so that
castling possibilities exist for all starting positions. Fischer's
goal was to create a chess variant in which chess creativity and
talent would be more important than memorization and analysis of
opening moves."

Enjoy!

Jason

----------- BEGIN: gnuchess-5.07_5.08.diff  --------------

/diff -ur ../gnuchess-5.07/configure ./configure
--- ../gnuchess-5.07/configure  Thu Aug  7 06:55:12 2003
+++ ./configure Wed Aug 20 17:50:47 2008
@@ -1545,7 +1545,7 @@

 # Define the identity of the package.
  PACKAGE=gnuchess
- VERSION=5.07
+ VERSION=5.08

 cat >>confdefs.h <<_ACEOF
diff -ur ../gnuchess-5.07/src/cmd.c ./src/cmd.c
--- ../gnuchess-5.07/src/cmd.c  Mon Jun 30 06:00:02 2003
+++ ./src/cmd.c Tue Aug 19 18:38:34 2008
@@ -536,6 +536,11 @@
      " Options xboard and post are accepted without leading dashes\n"
      " for backward compatibility\n"
      "\n"
+     " Type of Game: "
+     "\n"
+     " -n, --chess960      Chess960, Fischer Random Chess Game"
+     "\n"
+     "\n"
      "Report bugs to
<bug-gnu-ch...<http://groups.google.com/groups/unlock?_done=/group/gnu.chess/browse_thread/thread/96942ddaf90181d8&msg=f369fe9d6d700b2d>
@gnu.org>.\n"
      "\n", progname);
      }
diff -ur ../gnuchess-5.07/src/common.h ./src/common.h
--- ../gnuchess-5.07/src/common.h       Mon Jun 30 06:28:38 2003
+++ ./src/common.h      Wed Aug 20 12:59:16 2008
@@ -533,6 +533,7 @@
 void InitRotAtak (void);
 void InitDistance (void);
 void InitVars (void);
+void Init960 (void);
 void InitHashCode (void);
 void InitHashTable (void);
 void CalcHashSize (int);
diff -ur ../gnuchess-5.07/src/init.c ./src/init.c
--- ../gnuchess-5.07/src/init.c Thu Jun 12 16:33:06 2003
+++ ./src/init.c        Wed Aug 20 17:52:38 2008
@@ -61,7 +61,36 @@
    InitInput ();
 }

+void Initialize960 (void)
+/
**************************************************************************
+ *
+ *  The main initialization driver.
+ *
+
**************************************************************************/
+{
+   InitLzArray ();
+   InitBitPosArray ();
+   InitMoveArray ();
+   InitRay ();
+   InitFromToRay ();
+   InitRankFileBit ();
+   InitPassedPawnMask ();
+   InitIsolaniMask ();
+   InitSquarePawnMask ();
+   InitBitCount ();
+   InitRotAtak ();
+   InitRandomMasks ();
+   InitDistance ();
+   Init960 ();
+   InitHashCode ();
+   InitHashTable ();
+   CalcHashKey ();
+   ShowSmallBoard ();
+   InitInput ();
+}

+
+
 void InitFICS (void)
 {
    if (flags & XBOARD) {
@@ -793,3 +822,216 @@
    nmovesfrombook = 0;
    ExchCnt[white] = ExchCnt[black] = 0;
 }
+
+int Die6 (void)
+{
+/
***************************************************************************
+ *
+ * Simulate 6-sided die for random board placement
+ *
+
***************************************************************************/

+
+   int i;
+   /*
+   ** Seed the random number generator with the current time
+   ** of day.
+   */
+   srand( (unsigned int)time( NULL ) );
+
+   i = rand() % 5;
+   return i;
+
+}
+
+void Init960 (void)
+/
***************************************************************************
+ *
+ * Uses the Bodlaender's dice-rolling method to determine the
starting
+ * random placement of pieces.
+ *
+
***************************************************************************/

+{
+static const int KnownBoard[16] =
+{
+   A1, B1, C1, D1, E1, F1, G1, H1,
+   A8, B8, C8, D8, E8, F8, G8, H8
+};
+
+static int ninboard[64] =
+{ empty, empty,  empty,  empty, empty, empty,  empty,  empty,
+  pawn,  pawn,   pawn,   pawn,  pawn,  pawn,   pawn,   pawn,
+  empty, empty,  empty,  empty, empty, empty,  empty,  empty,
+  empty, empty,  empty,  empty, empty, empty,  empty,  empty,
+  empty, empty,  empty,  empty, empty, empty,  empty,  empty,
+  empty, empty,  empty,  empty, empty, empty,  empty,  empty,
+  pawn,  pawn,   pawn,   pawn,  pawn,  pawn,   pawn,   pawn,
+  empty, empty,  empty,  empty, empty, empty,  empty,  empty};
+
+   int j;
+   int i;
+
+   memset (&board, 0, sizeof (board));
+
+   /* Initialzie Pawns */
+   for (i = 8; i < 16; i++)
+      SETBIT (board.b[white][pawn], i);
+   for (i = 48; i < 56; i++)
+      SETBIT (board.b[black][pawn], i);
+
+   /* Bishop placement */
+   do {
+       j = Die6 ();
+   } while ( j == 4 || j == 5 && ninboard[j] != empty );
+
+   /* Black Squares Bishop */
+   SETBIT (board.b[white][bishop], 2*j);
+   ninboard[2*j] = bishop;
+   SETBIT (board.b[black][bishop], 63-2*j);
+   ninboard[63-2*j] = bishop;
+
+
+   do {
+      j = Die6 ();
+   } while ( j == 4 || j == 5 && ninboard[j] != empty );
+
+   /* White Squares Bishop */
+   SETBIT (board.b[white][bishop], 2*j+1);
+   ninboard[2*j+1] = bishop;
+   SETBIT (board.b[black][bishop], 63-2*j-1);
+   ninboard[63-2*j-1] = bishop;
+
+   /* Queen Placement */
+   do {
+      j = Die6 ();
+   } while ( ninboard[j] != empty );
+
+   SETBIT (board.b[white][queen], j);
+   ninboard[j] = queen;
+   SETBIT (board.b[black][queen], 63-j);
+   ninboard[63-j] = queen;
+
+   /* Knight Placement */
+   do {
+      j = Die6 ();
+   } while ( ninboard[j] != empty );
+
+   SETBIT (board.b[white][knight], j);
+   ninboard[j] = knight;
+   SETBIT (board.b[black][knight], 63-j);
+   ninboard[63-j] = knight;
+
+   do {
+      j = Die6 ();
+   } while ( ninboard[j] != empty );
+
+   SETBIT (board.b[white][knight], j);
+   ninboard[j] = knight;
+   SETBIT (board.b[black][knight], 63-j);
+   ninboard[63-j] = knight;
+
+   /* Set Rook King Rook combination */
+
+   int p = 3;
+
+   for ( j = 0; j < 8; j ++ ) {
+      if ( p == 1 || p == 3 && ninboard[j] == empty ) {
+         SETBIT (board.b[white][rook], j);
+         ninboard[j] = rook;
+         SETBIT (board.b[black][rook], 63-j);
+         ninboard[63-j] = rook;
+         p = p - 1;
+      }
+      if ( p == 2 && ninboard[j] == empty ) {
+         SETBIT (board.b[white][king], j);
+         ninboard[j] = king;
+         SETBIT (board.b[black][king], 63-j);
+         ninboard[63-j] = king;
+         board.king[white] = KnownBoard[j];
+         board.king[black] = KnownBoard[15-j];
+         p = p - 1;
+      }
+   }
+
+
+   SETBIT (stonewall[white], D4); /* SMC */
+   SETBIT (stonewall[white], E3); /* SMC */
+   SETBIT (stonewall[white], F4); /* SMC */
+
+   SETBIT (stonewall[black], D5); /* SMC */
+   SETBIT (stonewall[black], E6); /* SMC */
+   SETBIT (stonewall[black], F5); /* SMC */
+
+   rings[0] = ULL(0x0000001818000000);
+   rings[1] = ULL(0x00003C24243C0000);
+   rings[2] = ULL(0x007E424242427E00);
+   rings[3] = ULL(0xFF818181818181FF);
+
+   boxes[0] = ULL(0x00003C3C3C3C0000); /* rings[0] | rings[1] */
+   boxes[1] = ULL(0x007E7E7E7E7E7E00); /* rings[0] | rings[1] |
rings[2] */
+
+   boardhalf[white] = RankBit[0]|RankBit[1]|RankBit[2]|RankBit[3];
+   boardhalf[black] = RankBit[4]|RankBit[5]|RankBit[6]|RankBit[7];
+   boardside[ks] = FileBit[4]|FileBit[5]|FileBit[6]|FileBit[7];
+   boardside[qs] = FileBit[0]|FileBit[1]|FileBit[2]|FileBit[3];
+
+   board.flag |= (WCASTLE | BCASTLE);
+   RealSide = board.side = white;
+   board.ep = -1;
+   RealGameCnt = GameCnt = -1;
+   Game50 = 0;
+   computer = black;
+   CalcHashKey ();
+   Game[0].hashkey = HashKey;
+   board.pmaterial[white] = board.pmaterial[black] =
+      2*ValueR + 2*ValueN + 2*ValueB + ValueQ;
+   board.material[white] = board.material[black] =
+      board.pmaterial[white] + 8*ValueP;
+
+   /* Initialize pgn values */
+   initial_comments = NULL;
+   /* Reset values; doing this again will cause a trivial memory leak
+    * when reloading PGN files as games, but it's not worth fixing.
*/
+   pgn_event = pgn_site =
+   pgn_date = pgn_round = pgn_white = pgn_black =
+   pgn_whiteELO = pgn_blackELO = pgn_result =
+   pgn_othertags = NULL;
+
+
+   UpdateFriends ();
+   UpdateCBoard ();
+   UpdateMvboard ();
+
+   for (i = A1; i <= H8; i++)
+   {
+      if (cboard[i])
+      {
+         SETBIT (board.blockerr90, r90[i]);
+         SETBIT (board.blockerr45, r45[i]);
+         SETBIT (board.blockerr315, r315[i]);
+      }
+   }
+
+   /* TreePtr[0] is practically unused.  TreePtr[1] points to the
+    * base of the tree.
+    */
+   TreePtr[0] = TreePtr[1] = Tree;
+
+   /* Initialize some of the game flags */
+   SET (flags, USEHASH);
+   SET (flags, USENULL);
+   SearchTime = 5;
+   SearchDepth = 0;
+   board.castled[white] = board.castled[black] = false;
+   phase = PHASE;
+
+/*  Calculate the ttable hashmask & pawntable hashmask */
+   if ( HashSize == 0 )
+     CalcHashSize(HashSize);
+
+   signal (SIGINT, EndSearch);
+
+   nmovesfrombook = 0;
+
+
+}
+
diff -ur ../gnuchess-5.07/src/main.c ./src/main.c
--- ../gnuchess-5.07/src/main.c Mon Jun 30 06:00:02 2003
+++ ./src/main.c        Wed Aug 20 17:20:38 2008
@@ -298,7 +298,7 @@
    */

   int c;
-  int opt_help = 0, opt_version = 0, opt_post = 0, opt_xboard = 0,
opt_hash = 0, opt_easy = 0, opt_manual = 0;
+  int opt_help = 0, opt_version = 0, opt_post = 0, opt_xboard = 0,
opt_hash = 0, opt_easy = 0, opt_manual = 0, opt_ninesixty = 0;
   char *endptr;

   progname = argv[0]; /* Save in global for cmd_usage */
@@ -309,6 +309,7 @@
     {
         {"hashsize", 1, 0, 's'},
         {"version", 0, 0, 'v'},
+        {"chess960", 0, 0, 'n'},
         {"help", 0, 0, 'h'},
         {"xboard", 0, 0, 'x'},
         {"post", 0, 0, 'p'},
@@ -321,7 +322,7 @@

     int option_index = 0;

-    c = getopt_long (argc, argv, "ehmpvxs:",
+    c = getopt_long (argc, argv, "ehmpnvxs:",
              long_options, &option_index);

     /* Detect the end of the options. */
@@ -350,6 +351,9 @@
      case 'e':
        opt_easy = 1;
        break;
+     case 'n':
+       opt_ninesixty = 1;
+       break;
      case 'm':
        opt_manual = 1;
        break;
@@ -417,7 +421,13 @@
   if ( opt_hash != 0)
     CalcHashSize(opt_hash);

-  Initialize ();
+
+  if ( opt_ninesixty == 1 ) {
+     printf("Generating Random Board...\n");
+     Initialize960 ();
+  }
+  else
+     Initialize ();

   if ( opt_easy == 0)
    SET (flags, HARD);
------------ END gnuchess-5.07_5.08.diff --------------------------
Technical Details
Message-ID: <mailman.17269.1219355147.18990.info-gnu-chess@gnu.org>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news1.google.com!newsfeed.stanford.edu!news.stanford.edu!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Thread: 10d71d,e46b4af176a63c0c,start
X-Google-Attributes: gid10d71d,domainid0,public,usenet
X-Google-Language: ENGLISH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news2.google.com!news1.google.com!newsfeed.stanford.edu!news.stanford.edu!not-for-mail
From: "Jason Sidabras" <jason.sidabras@gmail.com>
Newsgroups: gnu.chess
Subject: Chess960
Date: Wed, 20 Aug 2008 20:21:43 -0500
Lines: 383
Approved: info-gnu-chess@gnu.org
Message-ID: <mailman.17269.1219355147.18990.info-gnu-chess@gnu.org>
NNTP-Posting-Host: lists.gnu.org
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Trace: news.stanford.edu 1219355150 346 199.232.76.165 (21 Aug 2008 21:45:50 GMT)
X-Complaints-To: news@news.stanford.edu
To: info-gnu-chess@gnu.org
Envelope-to: info-gnu-chess@gnu.org
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
 h=domainkey-signature:received:received:message-id:date:from:to
 :subject:mime-version:content-type;
 bh=gMhO8dh9UKIUes59DG74RQSCJREIQ7q7Z0gXTFx5daE=;
 b=TQ53Jk7g/2hy7D+46OXFl77d7lQEpDjnIpxAcleg+tVznNvsjgq5KC+s61ls/+FeXl
 fdFOxKJSIJScFMTwS4eSi6/WJ9i0+a5bG4OqyfAvF86LlygQi5GM/aKc1nf1lSnlzLv2
 ExVK8D8YQi0/zKplYd+TrRAgxbbWB7nxLrrv8=
DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma;
 h=message-id:date:from:to:subject:mime-version:content-type;
 b=OrONK4iKltm9xeVeKqhmmF3svIKrHzwmvwcTInwKWoXb2j1Chp5TyRpp4K3u7DWlMX
 GhYSqJhHqExorq1ueNDMFl69VwGJkeHtGOUmOlYvVS/DipgLYBjxNWXLWBG7UcJPjLMw
 bT64SIgBGwoYlvebwqXB/0Z2MYdz/QWEQHupQ=
X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2)
X-Mailman-Approved-At: Thu, 21 Aug 2008 17:45:46 -0400
Content-Disposition: inline
X-Content-Filtered-By: Mailman/MimeDel 2.1.5
X-BeenThere: info-gnu-chess@gnu.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Announcements and discussions about GNU Chess <info-gnu-chess.gnu.org>
List-Unsubscribe: <http://lists.gnu.org/mailman/listinfo/info-gnu-chess>,
 <mailto:info-gnu-chess-request@gnu.org?subject=unsubscribe>
List-Archive: <http://lists.gnu.org/pipermail/info-gnu-chess>
List-Post: <mailto:info-gnu-chess@gnu.org>
List-Help: <mailto:info-gnu-chess-request@gnu.org?subject=help>
List-Subscribe: <http://lists.gnu.org/mailman/listinfo/info-gnu-chess>,
 <mailto:info-gnu-chess-request@gnu.org?subject=subscribe>