📄 cmd.c
字号:
{ board.side = 1^board.side; board.ep = -1 ; /* Enpassant doesn't apply after switch */ printf ("%s to move\n", board.side == white ? "White" : "Black");}void cmd_time(void){ TimeLimit[1^board.side] = atoi(token[1]) / 100.0f ;}void cmd_undo(void){ if (GameCnt >= 0) UnmakeMove (board.side, &Game[GameCnt].move); else printf ("No moves to undo! \n"); MoveLimit[board.side]++; TimeLimit[board.side] += Game[GameCnt+1].et; if (!(flags & XBOARD)) ShowBoard ();}void cmd_usage(void) { printf ( "\n" " Usage: %s [OPTION]\n" "\n" " -h, --help display this help and exit\n" " -v, --version display version information and exit\n" "\n" " -x, --xboard start in engine mode\n" " -p, --post start up showing thinking\n" " -e, --easy disable thinking in opponents time\n" " -m, --manual enable manual mode\n" " -s size, --hashsize=size specify hashtable size in slots\n" "\n" " Options xboard and post are accepted without leading dashes\n" " for backward compatibility\n" "\n" "Report bugs to <bug-gnu-chess@gnu.org>.\n" "\n", progname); }/* Play variant, we instruct interface in protover we play normal */void cmd_variant(void) {}void cmd_version(void){ if (!(flags & XBOARD)) printf ("%s %s\n", PROGRAM, VERSION); else printf ("Chess\n");}void cmd_white(void) { /* * No longer used by Xboard but requested as a feature */ NewPosition(); /* Reset some flags and settings */ CLEAR ( flags, THINK); CLEAR ( flags, MANUAL); CLEAR (flags, TIMEOUT); computer = black; if ( board.side == black ){ board.side = white; board.ep = -1; /* Hack to fixed appearing pawn bug */ }}void cmd_xboard(void){ if (tokeneq (token[1], "off")) CLEAR (flags, XBOARD); else if (tokeneq (token[1], "on")) SET (flags, XBOARD); else if (!(flags & XBOARD)) { /* set if unset and only xboard called */ SET (flags, XBOARD); /* like in xboard/winboard usage */ }}/* * Command with subcommands, could write secondary method * tables here */void cmd_show (void)/************************************************************************ * * The show command driver section. * ************************************************************************/{ if (tokeneq (token[1], "board")) ShowBoard (); else if (tokeneq (token[1], "rating")) { printf("My rating = %d\n",myrating); printf("Opponent rating = %d\n",opprating); } else if (tokeneq (token[1], "time")) ShowTime (); else if (tokeneq (token[1], "moves")) { GenCnt = 0; TreePtr[2] = TreePtr[1]; GenMoves (1); ShowMoveList (1); printf ("No. of moves generated = %ld\n", GenCnt); } else if (tokeneq (token[1], "escape")) { GenCnt = 0; TreePtr[2] = TreePtr[1]; GenCheckEscapes (1); ShowMoveList (1); printf ("No. of moves generated = %ld\n", GenCnt); } else if (tokeneq (token[1], "noncapture")) { GenCnt = 0; TreePtr[2] = TreePtr[1]; GenNonCaptures (1); FilterIllegalMoves (1); ShowMoveList (1); printf ("No. of moves generated = %ld\n", GenCnt); } else if (tokeneq (token[1], "capture")) { GenCnt = 0; TreePtr[2] = TreePtr[1]; GenCaptures (1); FilterIllegalMoves (1); ShowMoveList (1); printf ("No. of moves generated = %ld\n", GenCnt); } else if (tokeneq (token[1], "eval") || tokeneq (token[1], "score")) { int s, wp, bp, wk, bk; BitBoard *b; phase = PHASE; GenAtaks (); FindPins (&pinned); hunged[white] = EvalHung(white); hunged[black] = EvalHung(black); b = board.b[white]; pieces[white] = b[knight] | b[bishop] | b[rook] | b[queen]; b = board.b[black]; pieces[black] = b[knight] | b[bishop] | b[rook] | b[queen]; wp = ScoreP (white); bp = ScoreP (black); wk = ScoreK (white); bk = ScoreK (black); printf ("White: Mat:%4d/%4d P:%d N:%d B:%d R:%d Q:%d K:%d Dev:%d h:%d x:%d\n", board.pmaterial[white], board.material[white], wp, ScoreN(white), ScoreB(white), ScoreR(white), ScoreQ(white), wk, ScoreDev(white), hunged[white], ExchCnt[white]); printf ("Black: Mat:%4d/%4d P:%d N:%d B:%d R:%d Q:%d K:%d Dev:%d h:%d x:%d\n", board.pmaterial[black], board.material[black], bp, ScoreN(black), ScoreB(black), ScoreR(black), ScoreQ(black), bk, ScoreDev(black), hunged[black], ExchCnt[black]); printf ("Phase: %d\t", PHASE); s = ( EvaluateDraw () ? DRAWSCORE : Evaluate (-INFINITY, INFINITY)); printf ("score = %d\n", s); printf ("\n"); } else if (tokeneq (token[1], "game")) ShowGame (); else if (tokeneq (token[1], "pin")) { BitBoard b; GenAtaks (); FindPins (&b); ShowBitBoard (&b); }}void cmd_test (void)/************************************************************************* * * The test command driver section. * *************************************************************************/{ if (tokeneq (token[1], "movelist")) TestMoveList (); else if (tokeneq (token[1], "capture")) TestCaptureList (); else if (tokeneq (token[1], "movegenspeed")) TestMoveGenSpeed (); else if (tokeneq (token[1], "capturespeed")) TestCaptureGenSpeed (); else if (tokeneq (token[1], "eval")) TestEval (); else if (tokeneq (token[1], "evalspeed")) TestEvalSpeed ();}/* * This is more or less copied from the readme, and the * parser is not very clever, so the lines containing * command names should not be indented, the lines with * explanations following them should be indented. Do not * use tabs for indentation, only spaces. CAPITALS are * reserved for parameters in the command names. The * array must be terminated by two NULLs. * * This one should be integrated in the method table. * (Very much like docstrings in Lisp.) */static const char * const helpstr[] = { "^C", " Typically the interrupt key stops a search in progress,", " makes the move last considered best and returns to the", " command prompt", "quit", " quit the program.", "exit", " In analysis mode this stops analysis, otherwise it quits the program.", "help", " Produces a help blurb corresponding to this list of commands.", "book", " add - compiles book.dat from book.pgn", " on - enables use of book", " off - disables use of book", " worst - play worst move from book", " best - play best move from book", " prefer - default, same as 'book on'", " random - play any move from book", "version", " prints out the version of this program", "pgnsave FILENAME", " saves the game so far to the file from memory", "pgnload FILENAME", " loads the game in the file into memory", "force", "manual", " Makes the program stop moving. You may now enter moves", " to reach some position in the future.", " ", "white", " Program plays white", "black", " Program plays black", "go", " Computer takes whichever side is on move and begins its", " thinking immediately", "post", " Arranges for verbose thinking output showing variation, score,", " time, depth, etc.", "nopost", " Turns off verbose thinking output", "name NAME", " Lets you input your name. Also writes the log.nnn and a", " corresponding game.nnn file. For details please see", " auxillary file format sections.", "result", " Mostly used by Internet Chess server.", "activate", " This command reactivates a game that has been terminated automatically", " due to checkmate or no more time on the clock. However, it does not", " alter those conditions. You would have to undo a move or two or", " add time to the clock with level or time in that case.", "rating COMPUTERRATING OPPONENTRATING", " Inputs the estimated rating for computer and for its opponent", "new", " Sets up new game (i.e. positions in original positions)", "time", " Inputs time left in game for computer in hundredths of a second.", " Mostly used by Internet Chess server.", "hash", " on - enables using the memory hash table to speed search", " off - disables the memory hash table", "hashsize N", " Sets the hash table to permit storage of N positions", "null", " on - enables using the null move heuristic to speed search", " off - disables using the null move heuristic", "xboard", " on - enables use of xboard/winboard", " off - disables use of xboard/winboard", "depth N", " Sets the program to look N ply (half-moves) deep for every", " search it performs. If there is a checkmate or other condition", " that does not allow that depth, then it will not be ", "level MOVES MINUTES INCREMENT", " Sets time control to be MOVES in MINUTES with each move giving", " an INCREMENT (in seconds, i.e. Fischer-style clock).", "load", "epdload", " Loads a position in EPD format from disk into memory.", "save", "epdsave", " Saves game position into EPD format from memory to disk.", "switch", " Switches side to move", "solve FILENAME", "solveepd FILENAME", " Solves the positions in FILENAME", "remove", " Backs up two moves in game history", "undo", " Backs up one move in game history", "usage", " Display command line syntax", "show", " board - displays the current board", " time - displays the time settings", " moves - shows all moves using one call to routine", " escape - shows moves that escape from check using one call to routine", " noncapture - shows non-capture moves", " capture - shows capture moves", " eval [or score] - shows the evaluation per piece and overall", " game - shows moves in game history", " pin - shows pinned pieces", "test", " movelist - reads in an epd file and shows legal moves for its entries", " capture - reads in an epd file and shows legal captures for its entries", " movegenspeed - tests speed of move generator", " capturespeed - tests speed of capture move generator", " eval - reads in an epd file and shows evaluation for its entries", " evalspeed tests speed of the evaluator", "bk", " show moves from opening book.", NULL, NULL};void cmd_help (void)/************************************************************************** * * Display all the help commands. * **************************************************************************/{ const char * const *p; int count, len; if (strlen(token[1])>0) { for (p=helpstr, count=0; *p; p++) { if (strncmp(*p, token[1], strlen(token[1])) == 0) { puts(*p); while (*++p && **p != ' ') /* Skip aliases */ ; for (; *p && **p == ' '; p++) { puts(*p); } return; } } printf("Help for command %s not found\n\n", token[1]); } printf("List of commands: (help COMMAND to get more help)\n"); for (p=helpstr, count=0; *p; p++) { len = strcspn(*p, " "); if (len > 0) { count += printf("%.*s ", len, *p); if (count > 60) { count = 0; puts(""); } } } puts("");}/* * Try a method table, one could also include the documentation * strings here */struct methodtable { const char *name; void (*method) (void);};/* Last entry contains to NULL pointers *//* List commands we don't implement to avoid illegal moving them */const struct methodtable commands[] = { { "?", cmd_movenow }, { "accepted", cmd_accepted }, { "activate", cmd_activate }, { "analyze", cmd_analyze }, { "bk", cmd_bk }, { "black", cmd_black }, { "book", cmd_book }, { "computer", cmd_computer }, { "depth", cmd_depth }, { "draw", cmd_draw }, { "easy", cmd_easy }, { "edit", cmd_edit }, { "epd", cmd_epd }, { "epdload", cmd_load }, { "epdsave", cmd_save }, { "exit", cmd_exit }, { "force", cmd_force }, { "go", cmd_go }, { "hard", cmd_hard }, { "hash", cmd_hash }, { "hashsize", cmd_hashsize }, { "help", cmd_help }, { "hint", cmd_hint }, { "level", cmd_level }, { "list", cmd_list }, { "load", cmd_load }, { "manual", cmd_manual }, { "name", cmd_name }, { "new", cmd_new }, { "nopost", cmd_nopost }, { "null", cmd_null }, { "otim", cmd_otim }, { "pgnload", cmd_pgnload }, { "pgnsave", cmd_pgnsave }, { "ping", cmd_ping }, { "post", cmd_post }, { "protover", cmd_protover }, { "quit", cmd_quit }, { "random", cmd_random }, { "rating", cmd_rating }, { "rejected", cmd_rejected }, { "remove", cmd_remove }, { "result", cmd_result }, { "save", cmd_save }, { "setboard", cmd_setboard }, { "show", cmd_show }, { "solve", cmd_solve }, { "solveepd", cmd_solve }, { "st", cmd_st }, { "switch", cmd_switch }, { "test", cmd_test }, { "time", cmd_time }, { "undo", cmd_undo }, { "usage", cmd_usage }, { "variant", cmd_variant }, { "version", cmd_version }, { "white", cmd_white }, { "xboard", cmd_xboard }, { NULL, NULL }};void parse_input(void)/************************************************************************* * * This is the main user command interface driver. * *************************************************************************/{ leaf *ptr; const struct methodtable * meth; dbg_printf("parse_input() called, inputstr = *%s*\n", inputstr); split_input(); for (meth = commands; meth->name != NULL; meth++) { if (tokeneq(token[0], meth->name)) { meth->method(); return; } } /* OK, no known command, this should be a move */ ptr = ValidateMove (token[0]); if (ptr != NULL) { SANMove (ptr->move, 1); MakeMove (board.side, &ptr->move); strcpy (Game[GameCnt].SANmv, SANmv); printf("%d. ",GameCnt/2+1); printf("%s",token[0]); if (ofp != stdout) { fprintf(ofp,"%d. ",GameCnt/2+1); fprintf(ofp,"%s",token[0]); } putchar('\n'); fflush(stdout); if (ofp != stdout) { fputc('\n',ofp); fflush(ofp); } if (!(flags & XBOARD)) ShowBoard (); SET (flags, THINK); } else { /* * Must Output Illegal move to prevent Xboard accepting illegal * en passant captures and other subtle mistakes */ printf("Illegal move: %s\n",token[0]); fflush(stdout); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -