📄 main.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 = 1, opt_manual = 0;
char *endptr;
// Initialize the hardware etc.
InitSystem();
argc = 0;
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)0); // 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)) {
ShowGfxBoard();
dbg_printf("Waiting for input...\n");
wait_for_input();
dbg_printf("Parsing input...\n");
parse_input();
ShowGfxBoard();
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 + -