home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 57
/
Amiga_Dream_57.iso
/
Amiga
/
Jeux
/
Reflexion
/
Crafty-15.19.lha
/
crafty-15.19
/
src
/
analyze.c
next >
Wrap
C/C++ Source or Header
|
1998-09-13
|
4KB
|
120 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "chess.h"
#include "data.h"
/* last modified 05/19/97 */
/*
********************************************************************************
* *
* Analyze() is used to handle the "analyze" command. this mode basically *
* puts Crafty into a "permanent pondering" state, where it reads a move from *
* the input stream, and then "ponders" for the opposite side. whenever a *
* move is entered, Crafty reads this move, updates the game board, and then *
* starts "pondering" for the other side. *
* *
********************************************************************************
*/
void Analyze() {
int i, move, back_number, readstat=1;
TREE *tree=local[0];
/*
----------------------------------------------------------
| |
| initialize. |
| |
----------------------------------------------------------
*/
ponder_move=0;
analyze_mode=1;
draw_score_normal=1;
if (!xboard) display_options|=1+2+4;
printf("Analyze Mode: type \"exit\" to terminate.\n");
/*
----------------------------------------------------------
| |
| now loop waiting on input, searching the current |
| position continually until a move comes in. |
| |
----------------------------------------------------------
*/
do {
do {
last_pv.path_iteration_depth=0;
last_pv.path_length=0;
analyze_move_read=0;
pondering=1;
tree->position[1]=tree->position[0];
(void) Iterate(wtm,think,0);
pondering=0;
if (book_move) moves_out_of_book=0;
if (!xboard) {
if (wtm) printf("analyze.White(%d): ",move_number);
else printf("analyze.Black(%d): ",move_number);
fflush(stdout);
}
if (!analyze_move_read) do {
readstat=Read(1,buffer);
if (readstat < 0) break;
nargs=ReadParse(buffer,args," ;");
Print(4095,"%s\n",buffer);
if (strstr(args[0],"timeleft") && !xboard) {
if (wtm) printf("analyze.White(%d): ",move_number);
else printf("analyze.Black(%d): ",move_number);
fflush(stdout);
}
} while (strstr(args[0],"timeleft"));
else nargs=ReadParse(buffer,args," ;");
if (readstat < 0) break;
move=0;
if (!strcmp(args[0],"exit")) break;
move=InputMove(tree,args[0],0,wtm,1,0);
if (move) {
fseek(history_file,((move_number-1)*2+1-wtm)*10,SEEK_SET);
fprintf(history_file,"%9s\n",OutputMove(tree,move,0,wtm));
if (!xboard) {
if (wtm) Print(128,"White(%d): ",move_number);
else Print(128,"Black(%d): ",move_number);
Print(128,"%s\n",OutputMove(tree,move,0,wtm));
}
else {
if (wtm) Print(128,"White(%d): ",move_number);
else Print(128,"Black(%d): ",move_number);
Print(128,"%s\n",OutputMove(tree,move,0,wtm));
}
MakeMoveRoot(tree,move,wtm);
display=tree->pos;
last_mate_score=0;
}
else if (OptionMatch("back",args[0])) {
if (nargs > 1) back_number=atoi(args[1]);
else back_number=1;
for (i=0;i<back_number;i++) {
wtm=ChangeSide(wtm);
if (ChangeSide(wtm)) move_number--;
}
if (move_number == 0) {
move_number=1;
wtm=1;
}
sprintf(buffer,"reset %d",move_number);
(void) Option(tree);
display=tree->pos;
}
else {
pondering=0;
if (Option(tree) == 0) printf("illegal move.\n");
pondering=1;
display=tree->pos;
}
} while (!move);
if (readstat < 0 || !strcmp(args[0],"exit")) break;
wtm=ChangeSide(wtm);
if (wtm) move_number++;
} while (1);
analyze_mode=0;
printf("analyze complete.\n");
pondering=0;
}