⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一款运行在linux上的象棋游戏。用GTK/GNOME环境下用GLADE开发。
💻 C
字号:
/* GNU Chess 5.0 - main.c - entry point   Copyright (c) 1999-2002 Free Software Foundation, Inc.   GNU Chess is based on the two research programs    Cobalt by Chua Kong-Sian and Gazebo by Stuart Cracraft.   GNU Chess is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2, or (at your option)   any later version.   GNU Chess is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with GNU Chess; see the file COPYING.  If not, write to   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.   Contact Info:      bug-gnu-chess@gnu.org     cracraft@ai.mit.edu, cracraft@stanfordalumni.org, cracraft@earthlink.net*/#include <time.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <getopt.h>#include <errno.h>                                                              #include "common.h"#include "book.h"short distance[64][64];short taxicab[64][64];unsigned char lzArray[65536];BitBoard DistMap[64][8];BitBoard BitPosArray[64];BitBoard NotBitPosArray[64];BitBoard MoveArray[8][64];BitBoard Ray[64][8];BitBoard FromToRay[64][64];BitBoard RankBit[8];BitBoard FileBit[8];BitBoard Ataks[2][7];BitBoard PassedPawnMask[2][64];BitBoard IsolaniMask[8];BitBoard SquarePawnMask[2][64];BitBoard Rook00Atak[64][256];BitBoard Rook90Atak[64][256];BitBoard Bishop45Atak[64][256];BitBoard Bishop315Atak[64][256];BitBoard pinned;BitBoard rings[4];BitBoard boxes[2];BitBoard stonewall[2];BitBoard pieces[2];BitBoard mask_kr_trapped_w[3];BitBoard mask_kr_trapped_b[3];BitBoard mask_qr_trapped_w[3];BitBoard mask_qr_trapped_b[3];BitBoard boardhalf[2];BitBoard boardside[2];short directions[64][64];unsigned char BitCount[65536];leaf Tree[MAXTREEDEPTH];leaf *TreePtr[MAXPLYDEPTH];int RootPV;GameRec Game[MAXGAMEDEPTH];int GameCnt;int RealGameCnt;short RealSide;int computer;unsigned int flags;unsigned int preanalyze_flags;int cboard[64];int Mvboard[64];Board board;HashType hashcode[2][7][64];HashType ephash[64];HashType WKCastlehash;HashType WQCastlehash;HashType BKCastlehash;HashType BQCastlehash;HashType Sidehash;HashType HashKey;HashType PawnHashKey;HashSlot *HashTab[2];PawnSlot *PawnTab[2];int Idepth;int SxDec;int Game50;int lazyscore[2];int maxposnscore[2];int rootscore;int lastrootscore;unsigned long GenCnt;unsigned long NodeCnt;unsigned long QuiesCnt;unsigned long EvalCnt;unsigned long EvalCall;unsigned long ChkExtCnt;unsigned long OneRepCnt;unsigned long RcpExtCnt;unsigned long PawnExtCnt;unsigned long HorzExtCnt;unsigned long ThrtExtCnt;unsigned long KingExtCnt;unsigned long NullCutCnt;unsigned long FutlCutCnt;unsigned long RazrCutCnt;unsigned long TotalGetHashCnt;unsigned long GoodGetHashCnt;unsigned long TotalPutHashCnt;unsigned long CollHashCnt;unsigned long TotalPawnHashCnt;unsigned long GoodPawnHashCnt;unsigned long RepeatCnt;unsigned HashSize;unsigned long TTHashMask;unsigned long PHashMask;char SANmv[SANSZ];unsigned long history[2][4096];int killer1[MAXPLYDEPTH];int killer2[MAXPLYDEPTH];int ChkCnt[MAXPLYDEPTH];int ThrtCnt[MAXPLYDEPTH];char id[32];char solution[64];double ElapsedTime;Timer StartTime;float SearchTime;int SearchDepth;int MoveLimit[2];float TimeLimit[2];int TCMove;int TCinc;float TCTime;int castled[2];int hunged[2];int phase;int Hashmv[MAXPLYDEPTH];short RootPieces;short RootPawns;short RootMaterial;short RootAlpha;short RootBeta;short pickphase[MAXPLYDEPTH];short InChk[MAXPLYDEPTH];short KingThrt[2][MAXPLYDEPTH];short threatmv;uint8_t threatply;short KingSafety[2];short pscore[64];short bookmode;short bookfirstlast;char *progname;FILE *ofp;int myrating, opprating, suddendeath, TCionc;char name[50];int computerplays;		/* Side computer is playing */int wasbookmove;		/* True if last move was book move */int nmovesfrombook;		/* Number of moves since last book move */int newpos, existpos;		/* For book statistics */float maxtime;		/* Max time for the next searched move */int n;		/* Last mobility returned by CTL */int ExchCnt[2];	/* How many exchanges? */int bookloaded = 0;  	/* Is the book loaded already into memory? */int slider[8] = { 0, 0, 0, 1, 1, 1, 0, 0 };int Value[7] = { 0, ValueP, ValueN, ValueB, ValueR, ValueQ, ValueK};int range[8] = { 0, 0, 0, 1, 1, 1, 0, 0 };int ptype[2] = { pawn, bpawn };char algbr[64][3] ={ "a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1",  "a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2",  "a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3",  "a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4",  "a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5",  "a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6",  "a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7",  "a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8" };char algbrfile[9] = "abcdefgh";char algbrrank[9] = "12345678";  char notation[8] = { " PNBRQK" };char lnotation[8] = { " pnbrqk" };short Shift00[64] ={ 56, 56, 56, 56, 56, 56, 56, 56,  48, 48, 48, 48, 48, 48, 48, 48,  40, 40, 40, 40, 40, 40, 40, 40,  32, 32, 32, 32, 32, 32, 32, 32,  24, 24, 24, 24, 24, 24, 24, 24,  16, 16, 16, 16, 16, 16, 16, 16,   8,  8,  8,  8,  8,  8,  8,  8,   0,  0,  0,  0,  0,  0,  0,  0};int r90[64] ={ A8, A7, A6, A5, A4, A3, A2, A1,  B8, B7, B6, B5, B4, B3, B2, B1,  C8, C7, C6, C5, C4, C3, C2, C1,  D8, D7, D6, D5, D4, D3, D2, D1,  E8, E7, E6, E5, E4, E3, E2, E1,  F8, F7, F6, F5, F4, F3, F2, F1,  G8, G7, G6, G5, G4, G3, G2, G1,  H8, H7, H6, H5, H4, H3, H2, H1 };short Shift90[64] ={ 0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56,  0, 8, 16, 24, 32, 40, 48, 56};int r45[64] ={ E4, F3, H2, C2, G1, D1, B1, A1,  E5, F4, G3, A3, D2, H1, E1, C1,  D6, F5, G4, H3, B3, E2, A2, F1,   B7, E6, G5, H4, A4, C3, F2, B2,  G7, C7, F6, H5, A5, B4, D3, G2,   C8, H7, D7, G6, A6, B5, C4, E3,   F8, D8, A8, E7, H6, B6, C5, D4,   H8, G8, E8, B8, F7, A7, C6, D5 };short Shift45[64] ={ 28, 36, 43, 49, 54, 58, 61, 63,  21, 28, 36, 43, 49, 54, 58, 61,  15, 21, 28, 36, 43, 49, 54, 58,  10, 15, 21, 28, 36, 43, 49, 54,   6, 10, 15, 21, 28, 36, 43, 49,   3,  6, 10, 15, 21, 28, 36, 43,   1,  3,  6, 10, 15, 21, 28, 36,   0,  1,  3,  6, 10, 15, 21, 28 };int Mask45[64] ={ 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01,  0x7F, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03,   0x3F, 0x7F, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07,   0x1F, 0x3F, 0x7F, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F,   0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x7F, 0x3F, 0x1F,   0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x7F, 0x3F,   0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x7F,   0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF };int r315[64] ={ A1, C1, F1, B2, G2, E3, D4, D5,  B1, E1, A2, F2, D3, C4, C5, C6,  D1, H1, E2, C3, B4, B5, B6, A7,  G1, D2, B3, A4, A5, A6, H6, F7,  C2, A3, H3, H4, H5, G6, E7, B8,  H2, G3, G4, G5, F6, D7, A8, E8,  F3, F4, F5, E6, C7, H7, D8, G8,  E4, E5, D6, B7, G7, C8, F8, H8 };short Shift315[64] ={ 63, 61, 58, 54, 49, 43, 36, 28,  61, 58, 54, 49, 43, 36, 28, 21,  58, 54, 49, 43, 36, 28, 21, 15,  54, 49, 43, 36, 28, 21, 15, 10,  49, 43, 36, 28, 21, 15, 10,  6,  43, 36, 28, 21, 15, 10,  6,  3,  36, 28, 21, 15, 10,  6,  3,  1,  28, 21, 15, 10,  6,  3,  1,  0 };int Mask315[64] ={ 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF,  0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x7F,  0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x7F, 0x3F,  0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x7F, 0x3F, 0x1F,  0x1F, 0x3F, 0x7F, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F,  0x3F, 0x7F, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07,  0x7F, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03,  0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };int rank6[2] = { 5, 2 };int rank7[2] = { 6, 1 };int rank8[2] = { 7, 0 };int main (int argc, char *argv[]){  int i;  /*   * Parse command line arguments conforming with getopt_long syntax   * Note: we have to support "xboard" and "post" as bare strings   * for backward compatibility.   */   int c;  int opt_help = 0, opt_version = 0, opt_post = 0, opt_xboard = 0, opt_hash = 0, opt_easy = 0, opt_manual = 0;  char *endptr;  progname = argv[0]; /* Save in global for cmd_usage */  while (1)  {    static struct option long_options[] =    {        {"hashsize", 1, 0, 's'},        {"version", 0, 0, 'v'},        {"help", 0, 0, 'h'},        {"xboard", 0, 0, 'x'},        {"post", 0, 0, 'p'},        {"easy", 0, 0, 'e'},        {"manual", 0, 0, 'm'},        {0, 0, 0, 0}    };     /* getopt_long stores the option index here. */     int option_index = 0;     c = getopt_long (argc, argv, "ehmpvxs:",             long_options, &option_index);     /* Detect the end of the options. */   if (c == -1)     break;   /*     * Options with a straight flag, could use getoopt_long    * flag setting but this is more "obvious" and easier to    * modify.    */   switch (c)     {     case 'v':       opt_version = 1;       break;     case 'h':       opt_help = 1;       break;     case 'x':       opt_xboard = 1;       break;     case 'p':       opt_post = 1;       break;     case 'e':       opt_easy = 1;       break;     case 'm':       opt_manual = 1;       break;     case 's':           if  ( optarg == NULL ){ /* we have error such as two -s */         opt_help = 1;         break;       }       errno = 0; /* zero error indicator */       opt_hash = strtol (optarg, &endptr, 10);       if ( errno != 0 || *endptr != '\0' ){         printf("Hashsize out of Range or Invalid\n");         return(1);       }       break;     case '?': /* On error give help - getopt does a basic message. */       opt_help = 1;       break;     default:       puts ("Option Processing Failed\n");       abort();     }  } /* end of getopt_long style parsing */  /* Initialize random number generator */  srand((unsigned int) time(NULL));    /* initialize control flags */  flags = ULL(0);  /* output for thinking */  ofp = stdout;  /* Handle old style command line options */  if (argc > 1) {    for (i = 0; i < argc; i++) {      if (strcmp(argv[i],"xboard") == 0) {	SET (flags, XBOARD);      } else if (strcmp(argv[i],"post") == 0) {	SET (flags, POST);      }    }  }  if (opt_xboard == 1)	SET (flags, XBOARD);  if (opt_post == 1)	SET (flags, POST);	  if (opt_manual ==1)	SET (flags, MANUAL);  cmd_version();    /* If the version option was specified we can exit here */  if (opt_version == 1)	return(0);    /* If a usage statement is required output it here */  if (opt_help == 1){    cmd_usage();    return (1); /* Maybe an error if due to bad arguments. */  }  dbg_open(NULL);  HashSize = 0 ; /* Set HashSize zero */  if ( opt_hash != 0)    CalcHashSize(opt_hash);  Initialize ();  if ( opt_easy == 0)   SET (flags, HARD);  if (argc > 1) {    for (i = 0; i < argc; i++) {      if (strcmp(argv[i],"xboard") == 0) {	SET (flags, XBOARD);      } else if (strcmp(argv[i],"post") == 0) {	SET (flags, POST);      }     }  }  bookmode = BOOKPREFER;  bookfirstlast = 3;  while (!(flags & QUIT)) {    dbg_printf("Waiting for input...\n");    wait_for_input();    dbg_printf("Parsing input...\n");    parse_input();    dbg_printf("input_status = %d\n", input_status);    if ((flags & THINK) && !(flags & MANUAL) && !(flags & ENDED)) {      if (!(flags & XBOARD)) printf("Thinking...\n");      Iterate ();      CLEAR (flags, THINK);    }    RealGameCnt = GameCnt;    RealSide = board.side;    dbg_printf("Waking up input...\n");    dbg_printf("input_status = %d\n", input_status);    input_wakeup();    dbg_printf("input_status = %d\n", input_status);    /* Ponder only after first move */    /* Ponder or (if pondering disabled) just wait for input */    if ((flags & HARD) && !(flags & QUIT) ) {      ponder();    }  }    CleanupInput();  /*  Some cleaning up  */  free (HashTab[0]);  free (HashTab[1]);  dbg_close();  return (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -