|
|
1.1 ! root 1: /* ! 2: UNIX & MSDOS NON-DISPLAY, AND CHESSTOOL interface for Chess ! 3: ! 4: Revision: 4-25-88 ! 5: ! 6: Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. ! 7: Copyright (c) 1988 John Stanback ! 8: ! 9: This file is part of CHESS. ! 10: ! 11: CHESS is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY. No author or distributor ! 13: accepts responsibility to anyone for the consequences of using it ! 14: or for whether it serves any particular purpose or works at all, ! 15: unless he says so in writing. Refer to the CHESS General Public ! 16: License for full details. ! 17: ! 18: Everyone is granted permission to copy, modify and redistribute ! 19: CHESS, but only under the conditions described in the ! 20: CHESS General Public License. A copy of this license is ! 21: supposed to have been given to you along with CHESS so you ! 22: can know your rights and responsibilities. It should be in a ! 23: file named COPYING. Among other things, the copyright notice ! 24: and this notice must be preserved on all copies. ! 25: */ ! 26: ! 27: ! 28: #include <stdio.h> ! 29: #include <ctype.h> ! 30: #ifdef MSDOS ! 31: #include <dos.h> ! 32: #include <stdlib.h> ! 33: #include <time.h> ! 34: #else ! 35: #include <sys/param.h> ! 36: #include <sys/times.h> ! 37: #include <sys/file.h> ! 38: struct tms tmbuf1,tmbuf2; ! 39: int TerminateSearch(),Die(); ! 40: #endif MSDOS ! 41: ! 42: #include "gnuchess.h" ! 43: #ifdef NEWMOVE ! 44: #include "move.h" ! 45: #endif ! 46: ! 47: #define printz printf ! 48: #define scanz scanf ! 49: int mycnt1,mycnt2; ! 50: ! 51: ! 52: Initialize() ! 53: { ! 54: mycnt1 = mycnt2 = 0; ! 55: #ifndef MSDOS ! 56: #endif ! 57: #ifdef CHESSTOOL ! 58: setlinebuf(stdout); ! 59: /* ! 60: setvbuf(stdout,NULL,_IOLBF,BUFSIZ); ! 61: */ ! 62: printf("Chess\n"); ! 63: if (Level == 0 && !TCflag) Level = 15; ! 64: #endif CHESSTOOL ! 65: } ! 66: ! 67: ExitChess() ! 68: { ! 69: ListGame(); ! 70: exit(0); ! 71: } ! 72: ! 73: #ifndef MSDOS ! 74: Die() ! 75: { ! 76: char s[80]; ! 77: printz("Abort? "); ! 78: scanz("%s",s); ! 79: if (strcmp(s,"yes") == 0) ExitChess(); ! 80: } ! 81: ! 82: TerminateSearch() ! 83: { ! 84: timeout = true; ! 85: bothsides = false; ! 86: } ! 87: #endif MSDOS ! 88: ! 89: ! 90: InputCommand() ! 91: ! 92: /* ! 93: Process the users command. If easy mode is OFF (the computer is ! 94: thinking on opponents time) and the program is out of book, then make ! 95: the 'hint' move on the board and call SelectMove() to find a response. ! 96: The user terminates the search by entering ^C (quit siqnal) before ! 97: entering a command. If the opponent does not make the hint move, then ! 98: set Sdepth to zero. ! 99: */ ! 100: ! 101: { ! 102: int i; ! 103: short ok,tmp; ! 104: long cnt,rate,t1,t2; ! 105: unsigned short mv; ! 106: char s[80]; ! 107: ! 108: ok = quit = false; ! 109: player = opponent; ! 110: ft = 0; ! 111: if (hint > 0 && !easy && Book == NULL) ! 112: { ! 113: fflush(stdout); ! 114: time0 = time((long *)0); ! 115: algbr(hint>>8,hint & 0xFF,false); ! 116: strcpy(s,mvstr1); ! 117: tmp = epsquare; ! 118: if (VerifyMove(s,1,&mv)) ! 119: { ! 120: SelectMove(computer,2); ! 121: VerifyMove(mvstr1,2,&mv); ! 122: if (Sdepth > 0) Sdepth--; ! 123: } ! 124: ft = time((long *)0) - time0; ! 125: epsquare = tmp; ! 126: } ! 127: ! 128: #ifndef MSDOS ! 129: #endif ! 130: while (!(ok || quit)) ! 131: { ! 132: PromptForMove(); ! 133: i = scanz("%s",s); ! 134: if (i == EOF || s[0] == 0) ExitChess(); ! 135: player = opponent; ! 136: ok = VerifyMove(s,0,&mv); ! 137: if (ok && mv != hint) ! 138: { ! 139: Sdepth = 0; ! 140: ft = 0; ! 141: } ! 142: ! 143: if (strcmp(s,"bd") == 0) ! 144: { ! 145: ClrScreen(); ! 146: UpdateDisplay(0,0,1,0); ! 147: } ! 148: if (strcmp(s,"quit") == 0) quit = true; ! 149: if (strcmp(s,"post") == 0) post = !post; ! 150: if (strcmp(s,"set") == 0) EditBoard(); ! 151: if (strcmp(s,"go") == 0) ok = true; ! 152: if (strcmp(s,"help") == 0) help(); ! 153: if (strcmp(s,"force") == 0) force = !force; ! 154: if (strcmp(s,"book") == 0) Book = NULL; ! 155: if (strcmp(s,"new") == 0) NewGame(); ! 156: if (strcmp(s,"list") == 0) ListGame(); ! 157: if (strcmp(s,"level") == 0) SelectLevel(); ! 158: if (strcmp(s,"hash") == 0) hashflag = !hashflag; ! 159: if (strcmp(s,"beep") == 0) beep = !beep; ! 160: if (strcmp(s,"Awindow") == 0) ChangeAlphaWindow(); ! 161: if (strcmp(s,"Bwindow") == 0) ChangeBetaWindow(); ! 162: if (strcmp(s,"rcptr") == 0) rcptr = !rcptr; ! 163: if (strcmp(s,"hint") == 0) GiveHint(); ! 164: if (strcmp(s,"zero") == 0) ZeroTTable(); ! 165: if (strcmp(s,"both") == 0) ! 166: { ! 167: bothsides = !bothsides; ! 168: Sdepth = 0; ! 169: SelectMove(opponent,1); ! 170: ok = true; ! 171: } ! 172: if (strcmp(s,"reverse") == 0) ! 173: { ! 174: reverse = !reverse; ! 175: ClrScreen(); ! 176: UpdateDisplay(0,0,1,0); ! 177: } ! 178: if (strcmp(s,"switch") == 0) ! 179: { ! 180: computer = otherside[computer]; ! 181: opponent = otherside[opponent]; ! 182: force = false; ! 183: Sdepth = 0; ! 184: ok = true; ! 185: } ! 186: if (strcmp(s,"white") == 0) ! 187: { ! 188: computer = white; opponent = black; ! 189: ok = true; force = false; ! 190: Sdepth = 0; ! 191: } ! 192: if (strcmp(s,"black") == 0) ! 193: { ! 194: computer = black; opponent = white; ! 195: ok = true; force = false; ! 196: Sdepth = 0; ! 197: } ! 198: if (strcmp(s,"undo") == 0 && GameCnt >= 0) Undo(); ! 199: if (strcmp(s,"remove") == 0 && GameCnt >= 1) ! 200: { ! 201: Undo(); Undo(); ! 202: } ! 203: if (strcmp(s,"get") == 0) GetGame(); ! 204: if (strcmp(s,"save") == 0) SaveGame(); ! 205: if (strcmp(s,"depth") == 0) ChangeSearchDepth(); ! 206: if (strcmp(s,"random") == 0) dither = 6; ! 207: if (strcmp(s,"easy") == 0) easy = !easy; ! 208: if (strcmp(s,"contempt") == 0) SetContempt(); ! 209: if (strcmp(s,"xwndw") == 0) ChangeXwindow(); ! 210: if (strcmp(s,"test") == 0) ! 211: { ! 212: t1 = time(0); ! 213: cnt = 0; ! 214: for (i = 0; i < 10000; i++) ! 215: { ! 216: MoveList(opponent,2); ! 217: cnt += TrPnt[3] - TrPnt[2]; ! 218: } ! 219: t2 = time(0); ! 220: rate = cnt / (t2-t1); ! 221: printz("cnt= %ld rate= %ld\n",cnt,rate); ! 222: } ! 223: } ! 224: ! 225: ElapsedTime(1); ! 226: if (force) ! 227: { ! 228: computer = opponent; opponent = otherside[computer]; ! 229: } ! 230: #ifndef MSDOS ! 231: (void) times(&tmbuf1); ! 232: #ifdef CHESSTOOL ! 233: printf("%d. %s\n",++mycnt2,s); ! 234: #endif CHESSTOOL ! 235: #endif MSDOS ! 236: } ! 237: ! 238: ! 239: help() ! 240: { ! 241: ClrScreen(); ! 242: printz("CHESS command summary\n"); ! 243: printz("g1f3 move from g1 to f3\n"); ! 244: printz("nf3 move knight to f3\n"); ! 245: printz("o-o castle king side\n"); ! 246: printz("o-o-o castle queen side\n"); ! 247: printz("set edit board\n"); ! 248: printz("switch sides with computer\n"); ! 249: printz("white computer plays white\n"); ! 250: printz("black computer plays black\n"); ! 251: printz("reverse board display\n"); ! 252: printz("both computer match\n"); ! 253: printz("random randomize play\n"); ! 254: printz("undo undo last move\n"); ! 255: printz("time change level\n"); ! 256: printz("depth set search depth\n"); ! 257: printz("post principle variation\n"); ! 258: printz("hint suggest a move\n"); ! 259: printz("bd redraw board\n"); ! 260: printz("clock set time control\n"); ! 261: printz("force enter game moves\n"); ! 262: printz("list game to chess.lst\n"); ! 263: printz("save game to file\n"); ! 264: printz("get game from file\n"); ! 265: printz("new start new game\n"); ! 266: printz("quit exit CHESS\n"); ! 267: printz("Computer: "); ! 268: if (computer == white) printz("WHITE\n"); else printz("BLACK\n"); ! 269: printz("Opponent: "); ! 270: if (opponent == white) printz("WHITE\n"); else printz("BLACK\n"); ! 271: printz("Response time: %ld",Level," sec.\n"); ! 272: printz("Easy mode: "); ! 273: if (easy) printz("ON\n"); else printz("OFF\n"); ! 274: printz("Depth: %d\n",MaxSearchDepth); ! 275: printz("Random: "); ! 276: if (dither) printz("ON\n"); else printz("OFF\n"); ! 277: printz("Transposition table: "); ! 278: if (hashflag) printz("ON\n"); else printz("OFF\n"); ! 279: UpdateDisplay(0,0,1,0); ! 280: } ! 281: ! 282: ! 283: EditBoard() ! 284: ! 285: /* ! 286: Set up a board position. Pieces are entered by typing the piece ! 287: followed by the location. For example, Nf3 will place a knight on ! 288: square f3. ! 289: */ ! 290: ! 291: { ! 292: short a,r,c,sq; ! 293: char s[80]; ! 294: ! 295: ClrScreen(); ! 296: UpdateDisplay(0,0,1,0); ! 297: printz(". exit to main\n"); ! 298: printz("# clear board\n"); ! 299: printz("enter piece & location: \n"); ! 300: ! 301: a = white; ! 302: do ! 303: { ! 304: scanz("%s",s); ! 305: if (s[0] == '#') ! 306: { ! 307: for (sq = 0; sq < 64; sq++) ! 308: { ! 309: board[sq] = no_piece; color[sq] = neutral; ! 310: } ! 311: UpdateDisplay(0,0,1,0); ! 312: } ! 313: if (s[0] == 'c' || s[0] == 'C') a = otherside[a]; ! 314: c = s[1]-'a'; r = s[2]-'1'; ! 315: if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8)) ! 316: { ! 317: sq = locn[r][c]; ! 318: color[sq] = a; ! 319: if (s[0] == 'p') board[sq] = pawn; ! 320: else if (s[0] == 'n') board[sq] = knight; ! 321: else if (s[0] == 'b') board[sq] = bishop; ! 322: else if (s[0] == 'r') board[sq] = rook; ! 323: else if (s[0] == 'q') board[sq] = queen; ! 324: else if (s[0] == 'k') board[sq] = king; ! 325: else { board[sq] = no_piece; color[sq] = neutral; } ! 326: } ! 327: } ! 328: while (s[0] != '.'); ! 329: if (board[4] != king) kingmoved[white] = 10; ! 330: if (board[60] != king) kingmoved[black] = 10; ! 331: GameCnt = -1; Game50 = 0; Sdepth = 0; ! 332: InitializeStats(); ! 333: ClrScreen(); ! 334: UpdateDisplay(0,0,1,0); ! 335: } ! 336: ! 337: ! 338: ShowDepth(ch) ! 339: char ch; ! 340: { ! 341: } ! 342: ! 343: ShowResults(score,bstline,ch) ! 344: short score; ! 345: unsigned short bstline[]; ! 346: char ch; ! 347: { ! 348: #ifndef CHESSTOOL ! 349: register int i; ! 350: printz("%2d%c %5d %4ld %7ld ",Sdepth,ch,score,et,NodeCnt); ! 351: for (i = 1; bstline[i] > 0; i++) ! 352: { ! 353: algbr((short)(bstline[i] >> 8),(short)(bstline[i] & 0xFF),false); ! 354: if (i == 9 || i == 17) printz("\n "); ! 355: printz("%5s ",mvstr1); ! 356: } ! 357: printz("\n"); ! 358: #endif ! 359: } ! 360: ! 361: ! 362: SearchStartStuff(side) ! 363: short side; ! 364: { ! 365: #ifndef MSDOS ! 366: #endif ! 367: #ifndef CHESSTOOL ! 368: printz("\nMove# %d Target= %ld Clock: %ld\n", ! 369: TCmoves-TimeControl.moves[side]+1, ! 370: ResponseTime,TimeControl.clock[side]); ! 371: #endif ! 372: } ! 373: ! 374: ! 375: OutputMove() ! 376: { ! 377: #ifdef CHESSTOOL ! 378: printz("%d. ... %s\n",++mycnt1,mvstr1); ! 379: if (root->flags & draw) ! 380: { ! 381: printz("Draw\n"); ! 382: ListGame(); ! 383: exit(0); ! 384: } ! 385: if (root->score == -9999) ! 386: { ! 387: if (opponent == white) printz("White\n"); else printz("Black\n"); ! 388: ListGame(); ! 389: exit(0); ! 390: } ! 391: if (root->score == 9998) ! 392: { ! 393: if (computer == white) printz("White\n"); else printz("Black\n"); ! 394: ListGame(); ! 395: exit(0); ! 396: } ! 397: #else ! 398: printz("Nodes= %ld Eval= %ld Hash= %ld Rate= %ld ", ! 399: NodeCnt,EvalNodes,HashCnt,evrate); ! 400: printz("CPU= %.2ld:%.2ld.%.2ld\n\n", ! 401: cputimer/6000,(cputimer % 6000)/100,cputimer % 100); ! 402: ! 403: if (root->flags & epmask) UpdateDisplay(0,0,1,0); ! 404: else UpdateDisplay(root->f,root->t,0,root->flags & cstlmask); ! 405: printz("My move is: %s\n\n",mvstr1); ! 406: if (beep) printz("%c",7); ! 407: ! 408: if (root->flags & draw) printz("Draw game!\n"); ! 409: else if (root->score == -9999) printz("opponent mates!\n"); ! 410: else if (root->score == 9998) printz("computer mates!\n"); ! 411: else if (root->score < -9000) printz("opponent will soon mate!\n"); ! 412: else if (root->score > 9000) printz("computer will soon mate!\n"); ! 413: #endif CHESSTOOL ! 414: } ! 415: ! 416: ! 417: ElapsedTime(iop) ! 418: short iop; ! 419: ! 420: /* ! 421: Determine the time that has passed since the search was started. If ! 422: the elapsed time exceeds the target (ResponseTime+ExtraTime) then set ! 423: timeout to true which will terminate the search. ! 424: */ ! 425: ! 426: { ! 427: et = time((long *)0) - time0; ! 428: if (et < 0) et = 0; ! 429: ETnodes += 50; ! 430: if (et > et0 || iop == 1) ! 431: { ! 432: if (et > ResponseTime+ExtraTime && Sdepth > 1) timeout = true; ! 433: et0 = et; ! 434: if (iop == 1) ! 435: { ! 436: time0 = time((long *)0); et0 = 0; ! 437: } ! 438: #ifdef MSDOS ! 439: cputimer = 100*et; ! 440: if (et > 0) evrate = NodeCnt/(et+ft); else evrate = 0; ! 441: if (kbhit() && Sdepth > 1) ! 442: { ! 443: timeout = true; ! 444: bothsides = false; ! 445: } ! 446: #else ! 447: (void) times(&tmbuf2); ! 448: cputimer = 100*(tmbuf2.tms_utime - tmbuf1.tms_utime) / HZ; ! 449: if (cputimer > 0) evrate = (100*NodeCnt)/(cputimer+100*ft); ! 450: else evrate = 0; ! 451: #endif MSDOS ! 452: ETnodes = NodeCnt + 50; ! 453: } ! 454: } ! 455: ! 456: ! 457: SetTimeControl() ! 458: { ! 459: if (TCflag) ! 460: { ! 461: TimeControl.moves[white] = TimeControl.moves[black] = TCmoves; ! 462: TimeControl.clock[white] = TimeControl.clock[black] = 60*(long)TCminutes; ! 463: } ! 464: else ! 465: { ! 466: TimeControl.moves[white] = TimeControl.moves[black] = 0; ! 467: TimeControl.clock[white] = TimeControl.clock[black] = 0; ! 468: Level = 60*(long)TCminutes; ! 469: } ! 470: et = 0; ! 471: ElapsedTime(1); ! 472: } ! 473: ! 474: ! 475: ClrScreen() ! 476: { ! 477: #ifndef CHESSTOOL ! 478: printz("\n"); ! 479: #endif ! 480: } ! 481: ! 482: ! 483: UpdateDisplay(f,t,flag,iscastle) ! 484: short f,t,flag,iscastle; ! 485: { ! 486: #ifndef CHESSTOOL ! 487: short r,c,l; ! 488: if (flag) ! 489: { ! 490: printz("\n"); ! 491: for (r = 7; r >= 0; r--) ! 492: { ! 493: for (c = 0; c <= 7; c++) ! 494: { ! 495: if (reverse) l = locn[7-r][7-c]; else l = locn[r][c]; ! 496: if (color[l] == neutral) printz(" -"); ! 497: else if (color[l] == white) printz(" %c",qxx[board[l]]); ! 498: else printz(" %c",pxx[board[l]]); ! 499: } ! 500: printz("\n"); ! 501: } ! 502: printz("\n"); ! 503: } ! 504: #endif CHESSTOOL ! 505: } ! 506: ! 507: ! 508: GetOpenings() ! 509: ! 510: /* ! 511: Read in the Opening Book file and parse the algebraic notation for a ! 512: move into an unsigned integer format indicating the from and to ! 513: square. Create a linked list of opening lines of play, with ! 514: entry->next pointing to the next line and entry->move pointing to a ! 515: chunk of memory containing the moves. More Opening lines of up to 256 ! 516: half moves may be added to gnuchess.book. ! 517: */ ! 518: ! 519: { ! 520: FILE *fd; ! 521: int c,i,j,side; ! 522: char buffr[2048]; ! 523: struct BookEntry *entry; ! 524: unsigned short mv,*mp,tmp[100]; ! 525: ! 526: if ((fd = fopen("gnuchess.book","r")) != NULL) ! 527: { ! 528: /* ! 529: setvbuf(fd,buffr,_IOFBF,2048); ! 530: */ ! 531: Book = NULL; ! 532: i = 0; side = white; ! 533: while ((c = parse(fd,&mv,side)) >= 0) ! 534: if (c == 1) ! 535: { ! 536: tmp[++i] = mv; ! 537: side = otherside[side]; ! 538: } ! 539: else if (c == 0 && i > 0) ! 540: { ! 541: entry = (struct BookEntry *)malloc(sizeof(struct BookEntry)); ! 542: mp = (unsigned short *)malloc((i+1)*sizeof(unsigned short)); ! 543: entry->mv = mp; ! 544: entry->next = Book; ! 545: Book = entry; ! 546: for (j = 1; j <= i; j++) *(mp++) = tmp[j]; ! 547: *mp = 0; ! 548: i = 0; side = white; ! 549: } ! 550: fclose(fd); ! 551: } ! 552: } ! 553: ! 554: ! 555: int parse(fd,mv,side) ! 556: FILE *fd; ! 557: unsigned short *mv; ! 558: short side; ! 559: { ! 560: int c,i,r1,r2,c1,c2; ! 561: char s[100]; ! 562: while ((c = getc(fd)) == ' '); ! 563: i = 0; s[0] = c; ! 564: while (c != ' ' && c != '\n' && c != EOF) s[++i] = c = getc(fd); ! 565: s[++i] = '\0'; ! 566: if (c == EOF) return(-1); ! 567: if (s[0] == '!' || i < 3) ! 568: { ! 569: while (c != '\n' && c != EOF) c = getc(fd); ! 570: return(0); ! 571: } ! 572: if (s[4] == 'o') ! 573: if (side == black) *mv = 0x3C3A; else *mv = 0x0402; ! 574: else if (s[0] == 'o') ! 575: if (side == black) *mv = 0x3C3E; else *mv = 0x0406; ! 576: else ! 577: { ! 578: c1 = s[0] - 'a'; r1 = s[1] - '1'; ! 579: c2 = s[2] - 'a'; r2 = s[3] - '1'; ! 580: *mv = (locn[r1][c1]<<8) + locn[r2][c2]; ! 581: } ! 582: return(1); ! 583: } ! 584: ! 585: ! 586: GetGame() ! 587: { ! 588: FILE *fd; ! 589: char fname[40]; ! 590: int c; ! 591: short sq; ! 592: unsigned short m; ! 593: ! 594: printz("Enter file name: "); ! 595: scanz("%s",fname); ! 596: if (fname[0] == '\0') strcpy(fname,"chess.000"); ! 597: if ((fd = fopen(fname,"r")) != NULL) ! 598: { ! 599: fscanf(fd,"%hd%hd%hd",&computer,&opponent,&Game50); ! 600: fscanf(fd,"%hd%hd%hd%hd", ! 601: &castld[white],&castld[black], ! 602: &kingmoved[white],&kingmoved[black]); ! 603: fscanf(fd,"%hd%hd",&TCflag,&OperatorTime); ! 604: fscanf(fd,"%ld%ld%hd%hd", ! 605: &TimeControl.clock[white],&TimeControl.clock[black], ! 606: &TimeControl.moves[white],&TimeControl.moves[black]); ! 607: for (sq = 0; sq < 64; sq++) ! 608: { ! 609: fscanf(fd,"%hd",&m); ! 610: board[sq] = (m >> 8); color[sq] = (m & 0xFF); ! 611: if (color[sq] == 0) color[sq] = neutral; else --color[sq]; ! 612: } ! 613: GameCnt = -1; c = '?'; ! 614: while (c != EOF) ! 615: { ! 616: ++GameCnt; ! 617: c = fscanf(fd,"%hd%hd%hd%ld%hd%hd%hd",&GameList[GameCnt].gmove, ! 618: &GameList[GameCnt].score,&GameList[GameCnt].depth, ! 619: &GameList[GameCnt].nodes,&GameList[GameCnt].time, ! 620: &GameList[GameCnt].piece,&GameList[GameCnt].color); ! 621: if (GameList[GameCnt].color == 0) GameList[GameCnt].color = neutral; ! 622: else --GameList[GameCnt].color; ! 623: } ! 624: GameCnt--; ! 625: if (TimeControl.clock[white] > 0) TCflag = true; ! 626: computer--; opponent--; ! 627: } ! 628: fclose(fd); ! 629: InitializeStats(); ! 630: UpdateDisplay(0,0,1,0); ! 631: Sdepth = 0; ! 632: } ! 633: ! 634: ! 635: SaveGame() ! 636: { ! 637: FILE *fd; ! 638: char fname[40]; ! 639: short sq,i,c; ! 640: ! 641: printz("Enter file name: "); ! 642: scanz("%s",fname); ! 643: ! 644: if (fname[0] == '\0' || access(fname,W_OK) == -1) strcpy(fname,"chess.000"); ! 645: fd = fopen(fname,"w"); ! 646: fprintf(fd,"%d %d %d\n",computer+1,opponent+1,Game50); ! 647: fprintf(fd,"%d %d %d %d\n", ! 648: castld[white],castld[black],kingmoved[white],kingmoved[black]); ! 649: fprintf(fd,"%d %d\n",TCflag,OperatorTime); ! 650: fprintf(fd,"%ld %ld %d %d\n", ! 651: TimeControl.clock[white],TimeControl.clock[black], ! 652: TimeControl.moves[white],TimeControl.moves[black]); ! 653: for (sq = 0; sq < 64; sq++) ! 654: { ! 655: if (color[sq] == neutral) c = 0; else c = color[sq]+1; ! 656: fprintf(fd,"%d\n",256*board[sq] + c); ! 657: } ! 658: for (i = 0; i <= GameCnt; i++) ! 659: { ! 660: if (GameList[i].color == neutral) c = 0; ! 661: else c = GameList[i].color + 1; ! 662: fprintf(fd,"%d %d %d %ld %d %d %d\n", ! 663: GameList[i].gmove,GameList[i].score,GameList[i].depth, ! 664: GameList[i].nodes,GameList[i].time, ! 665: GameList[i].piece,c); ! 666: } ! 667: fclose(fd); ! 668: } ! 669: ! 670: ! 671: ListGame() ! 672: { ! 673: FILE *fd; ! 674: short i,f,t; ! 675: fd = fopen("chess.lst","w"); ! 676: fprintf(fd,"\n"); ! 677: fprintf(fd," score depth nodes time "); ! 678: fprintf(fd," score depth nodes time\n"); ! 679: for (i = 0; i <= GameCnt; i++) ! 680: { ! 681: f = GameList[i].gmove>>8; t = (GameList[i].gmove & 0xFF); ! 682: algbr(f,t,false); ! 683: if ((i % 2) == 0) fprintf(fd,"\n"); else fprintf(fd," "); ! 684: fprintf(fd,"%5s %5d %2d %6ld %5d",mvstr1, ! 685: GameList[i].score,GameList[i].depth, ! 686: GameList[i].nodes,GameList[i].time); ! 687: } ! 688: fprintf(fd,"\n\n"); ! 689: fclose(fd); ! 690: } ! 691: ! 692: ! 693: Undo() ! 694: ! 695: /* ! 696: Undo the most recent half-move. ! 697: */ ! 698: ! 699: { ! 700: short f,t; ! 701: f = GameList[GameCnt].gmove>>8; ! 702: t = GameList[GameCnt].gmove & 0xFF; ! 703: if (board[t] == king && distance(t,f) > 1) ! 704: castle(GameList[GameCnt].color,f,t,2); ! 705: else ! 706: { ! 707: board[f] = board[t]; color[f] = color[t]; ! 708: board[t] = GameList[GameCnt].piece; ! 709: color[t] = GameList[GameCnt].color; ! 710: if (board[f] == king) --kingmoved[color[f]]; ! 711: } ! 712: if (TCflag) ++TimeControl.moves[color[f]]; ! 713: GameCnt--; mate = false; Sdepth = 0; ! 714: UpdateDisplay(0,0,1,0); ! 715: InitializeStats(); ! 716: } ! 717: ! 718: ! 719: ShowMessage(s) ! 720: char *s; ! 721: { ! 722: #ifndef CHESSTOOL ! 723: printz("%s\n"); ! 724: #endif CHESSTOOL ! 725: } ! 726: ! 727: ShowSidetomove() ! 728: { ! 729: } ! 730: ! 731: PromptForMove() ! 732: { ! 733: #ifndef CHESSTOOL ! 734: printz("\nYour move is? "); ! 735: #endif CHESSTOOL ! 736: } ! 737: ! 738: ! 739: ShowCurrentMove(pnt,f,t) ! 740: short pnt,f,t; ! 741: { ! 742: } ! 743: ! 744: ChangeAlphaWindow() ! 745: { ! 746: printz("window: "); ! 747: scanz("%hd",&Awindow); ! 748: } ! 749: ! 750: ChangeBetaWindow() ! 751: { ! 752: printz("window: "); ! 753: scanz("%hd",&Bwindow); ! 754: } ! 755: ! 756: GiveHint() ! 757: { ! 758: algbr((short)(hint>>8),(short)(hint & 0xFF),false); ! 759: printz("try %s\n",mvstr1); ! 760: } ! 761: ! 762: ! 763: SelectLevel() ! 764: { ! 765: OperatorTime = 30000; ! 766: printz("Enter #moves #minutes: "); ! 767: scanz("%hd %hd",&TCmoves,&TCminutes); ! 768: printz("Operator time= "); ! 769: scanz("%hd",&OperatorTime); ! 770: TCflag = (TCmoves > 1); ! 771: SetTimeControl(); ! 772: } ! 773: ! 774: ! 775: ChangeSearchDepth() ! 776: { ! 777: printz("depth= "); ! 778: scanz("%hd",&MaxSearchDepth); ! 779: } ! 780: ! 781: SetContempt() ! 782: { ! 783: printz("contempt= "); ! 784: scanz("%hd",&contempt); ! 785: } ! 786: ! 787: ChangeXwindow() ! 788: { ! 789: printz("xwndw= "); ! 790: scanz("%hd",&xwndw); ! 791: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.