void GTPArchiving_loadSGF( GauGoEngine* engine, int argc, char** argv ) { // Must have exactly 1 argument if( argc != 2 ){ GauGoEngine_sayError( UNKOWN_COMMAND ); return; } char* filename = argv[1]; SGFTree tree; tree.root = NULL; tree.lastnode = NULL; if( !sgftree_readfile( &tree, filename ) ){ GauGoEngine_sayError( FILE_NOT_FOUND ); return; } // Get board size and reset/resize the board accordingly sgftreeForward( &tree ); int size=19; sgfGetIntProperty( tree.lastnode, "SZ", &size ); engine->options.boardSize = size; GauGoEngine_resetBoard( engine ); // Read and play main variation while( sgftreeForward( &tree ) ){ // Pass node if( is_pass_node( tree.lastnode, size ) ){ GauGoEngine_play( engine, PASS ); } else{ if( is_move_node( tree.lastnode ) ){ INTERSECTION move = Board_intersection( engine->board, get_moveY(tree.lastnode->props, size), get_moveX(tree.lastnode->props, size) ); // SGF validation check if( !Board_isLegal(engine->board, move) ){ GauGoEngine_sayError(BAD_DATA); } // Must be able to play GauGoEngine_play( engine, move ); } else if( is_pass_node( tree.lastnode, size ) ){ GauGoEngine_play( engine, PASS ); } } } // Success GauGoEngine_saySuccess(""); }
int main(int argc, char *argv[]) { Gameinfo gameinfo; SGFTree sgftree; int i; char *infilename = "ccc.sgf"; char *untilstring = NULL; char *scoringmode = NULL; int orientation = 0; float memory = (float) DEFAULT_MEMORY; /* Megabytes used for hash table. */ int seed = 0; int seed_specified = 0; sgftree_clear(&sgftree); gameinfo_clear(&gameinfo); gg_optarg = "-l"; scoringmode = gg_optarg; // no while switch here /* Start random number seed. */ if (!seed_specified) seed = time(0); /* Initialize the GNU Go engine. */ init_gnugo(memory, seed); sgftree_readfile(&sgftree, infilename); gameinfo_play_sgftree_rot(&gameinfo, &sgftree, untilstring, orientation); gameinfo.game_record = sgftree; load_and_score_sgf_file(&sgftree, &gameinfo, scoringmode); if (profile_patterns) report_pattern_profiling(); sgfFreeNode(sgftree.root); return 0; } /* end main */
int main(int argc, char *argv[]) { Gameinfo gameinfo; SGFTree sgftree; int i; int mandated_color = EMPTY; enum mode playmode = MODE_UNKNOWN; int replay_color = EMPTY; char *infilename = "ccc.sgf"; char *untilstring = NULL; char *scoringmode = NULL; char *outflags = NULL; char *gtpfile = NULL; char *gtp_dump_commands_file = NULL; int gtp_tcp_ip_mode = 0; char *gtp_tcp_ip_address = NULL; char *printsgffile = NULL; char decide_this[8]; char *decide_that = NULL; char debuginfluence_move[4] = "\0"; int benchmark = 0; /* benchmarking mode (-b) */ FILE *output_check; int orientation = 0; char mc_pattern_name[40] = ""; char mc_pattern_filename[320] = ""; float memory = (float) DEFAULT_MEMORY; /* Megabytes used for hash table. */ int seed = 0; int seed_specified = 0; int requested_boardsize = -1; sgftree_clear(&sgftree); gameinfo_clear(&gameinfo); gg_optarg = "-l"; scoringmode = gg_optarg; // no while switch here /* Start random number seed. */ if (!seed_specified) seed = time(0); /* Initialize the GNU Go engine. */ init_gnugo(memory, seed); sgftree_readfile(&sgftree, infilename); gameinfo_play_sgftree_rot(&gameinfo, &sgftree, untilstring, orientation); gameinfo.game_record = sgftree; if (mandated_color != EMPTY) gameinfo.to_move = mandated_color; if (!infilename) { fprintf(stderr, "gnugo: --score must be used with -l\n"); exit(EXIT_FAILURE); } load_and_score_sgf_file(&sgftree, &gameinfo, scoringmode); if (profile_patterns) report_pattern_profiling(); sgfFreeNode(sgftree.root); return 0; } /* end main */
void do_play_ascii(Gameinfo *gameinfo) { int m, num; float fnum; int passes = 0; /* two passes and its over */ int tmp; char line[80]; char *line_ptr = line; char *command; char *tmpstring; int state = 1; if (have_time_settings()) clock_on = 1; while (state == 1) { state = 0; /* No score is estimated yet. */ current_score_estimate = NO_SCORE; /* Allow resignation at interface level (the engine may still be not * allowed to resign. */ resignation_allowed = 1; printf("\nBeginning ASCII mode game.\n\n"); gameinfo_print(gameinfo); /* Does the computer play first? If so, make a move. */ if (gameinfo->computer_player == gameinfo->to_move) state = computer_move(gameinfo, &passes); /* main ASCII Play loop */ while (state == 0) { /* Display game board. */ if (opt_showboard) ascii_showboard(); #if !READLINE /* Print the prompt */ mprintf("%s(%d): ", color_to_string(gameinfo->to_move), movenum + 1); /* Read a line of input. */ line_ptr = line; if (!fgets(line, 80, stdin)) return; #else snprintf(line, 79, "%s(%d): ", color_to_string(gameinfo->to_move), movenum + 1); if (!(line_ptr = readline(line))) return; add_history(line_ptr); #endif while (state == 0 && (command = strtok(line_ptr, ";"), line_ptr = 0, command)) { /* Get the command or move. */ switch (get_command(command)) { case RESIGN: state = ascii_endgame(gameinfo, 1); break; case END: case EXIT: case QUIT: return; case HELP: show_commands(); break; case CMD_HELPDEBUG: printf(DEBUG_COMMANDS); break; case SHOWBOARD: opt_showboard = !opt_showboard; break; case INFO: printf("\n"); gameinfo_print(gameinfo); break; case SETBOARDSIZE: if (sgf_initialized) { printf("Boardsize cannot be changed after record is started!\n"); break; } command += 10; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } if (!check_boardsize(num, stdout)) break; /* Init board. */ board_size = num; clear_board(); /* In case max handicap changes on smaller board. */ gameinfo->handicap = place_fixed_handicap(gameinfo->handicap); sgfOverwritePropertyInt(sgftree.root, "SZ", board_size); sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap); break; case SETHANDICAP: if (sgf_initialized) { printf("Handicap cannot be changed after game is started!\n"); break; } command += 9; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } if (num < 0 || num > MAX_HANDICAP) { printf("\nInvalid handicap: %d\n", num); break; } /* Init board. */ clear_board(); /* Place stones on board but don't record sgf * in case we change more info. */ gameinfo->handicap = place_fixed_handicap(num); printf("\nSet handicap to %d\n", gameinfo->handicap); gameinfo->to_move = (gameinfo->handicap ? WHITE : BLACK); break; case FREEHANDICAP: if (sgf_initialized) { printf("Handicap cannot be changed after game is started!\n"); break; } while (*command && *command != ' ') command++; ascii_free_handicap(gameinfo, command); break; case SETKOMI: if (sgf_initialized) { printf("Komi cannot be modified after game record is started!\n"); break; } command += 5; if (sscanf(command, "%f", &fnum) != 1) { printf("\nInvalid command syntax!\n"); break; } komi = fnum; printf("\nSet Komi to %.1f\n", komi); break; case SETDEPTH: command += 6; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } mandated_depth = num; printf("\nSet depth to %d\n", mandated_depth); break; case SETLEVEL: command += 6; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } set_level(num); printf("\nSet level to %d\n", num); break; case DISPLAY: if (!opt_showboard) ascii_showboard(); break; case FORCE: command += 6; /* skip the force part... */ switch (get_command(command)) { case MOVE: state = do_move(gameinfo, command, &passes, 1); break; case PASS: state = do_pass(gameinfo, &passes, 1); break; default: printf("Illegal forced move: %s %d\n", command, get_command(command)); break; } break; case MOVE: state = do_move(gameinfo, command, &passes, 0); break; case PASS: state = do_pass(gameinfo, &passes, 0); break; case PLAY: command += 5; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } if (num >= 0) for (m = 0; m < num; m++) { gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player); state = computer_move(gameinfo, &passes); if (state) break; if (passes >= 2) break; } else { printf("\nInvalid number of moves specified: %d\n", num); break; } break; case PLAYBLACK: if (gameinfo->computer_player == WHITE) gameinfo->computer_player = BLACK; if (gameinfo->computer_player == gameinfo->to_move) state = computer_move(gameinfo, &passes); break; case PLAYWHITE: if (gameinfo->computer_player == BLACK) gameinfo->computer_player = WHITE; if (gameinfo->computer_player == gameinfo->to_move) state = computer_move(gameinfo, &passes); break; case SWITCH: gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player); state = computer_move(gameinfo, &passes); break; case UNDO: case CMD_BACK: if (undo_move(1)) { sgftreeAddComment(&sgftree, "undone"); sgftreeBack(&sgftree); gameinfo->to_move = OTHER_COLOR(gameinfo->to_move); } else printf("\nCan't undo.\n"); break; case CMD_FORWARD: if (sgftreeForward(&sgftree)) gameinfo->to_move = gnugo_play_sgfnode(sgftree.lastnode, gameinfo->to_move); else printf("\nEnd of game tree.\n"); break; case CMD_LAST: while (sgftreeForward(&sgftree)) gameinfo->to_move = gnugo_play_sgfnode(sgftree.lastnode, gameinfo->to_move); break; case COMMENT: printf("\nEnter comment. Press ENTER when ready.\n"); fgets(line, 80, stdin); sgftreeAddComment(&sgftree, line); break; case SCORE: showscore = !showscore; if (!showscore) current_score_estimate = NO_SCORE; break; case CMD_DEAD: silent_examine_position(FULL_EXAMINE_DRAGONS); showdead = !showdead; break; case CMD_CAPTURE: strtok(command, " "); showcapture(strtok(NULL, " ")); break; case CMD_DEFEND: strtok(command, " "); showdefense(strtok(NULL, " ")); break; case CMD_SHOWMOYO: tmp = printmoyo; printmoyo = PRINTMOYO_MOYO; silent_examine_position(EXAMINE_DRAGONS); printmoyo = tmp; break; case CMD_SHOWTERRI: tmp = printmoyo; printmoyo = PRINTMOYO_TERRITORY; silent_examine_position(EXAMINE_DRAGONS); printmoyo = tmp; break; case CMD_SHOWAREA: tmp = printmoyo; printmoyo = PRINTMOYO_AREA; silent_examine_position(EXAMINE_DRAGONS); printmoyo = tmp; break; case CMD_SHOWDRAGONS: silent_examine_position(EXAMINE_DRAGONS); showboard(1); break; case CMD_GOTO: strtok(command, " "); ascii_goto(gameinfo, strtok(NULL, " ")); break; case CMD_SAVE: strtok(command, " "); tmpstring = strtok(NULL, " "); if (tmpstring) { /* discard newline */ tmpstring[strlen(tmpstring) - 1] = 0; /* make sure we are saving proper handicap */ init_sgf(gameinfo); writesgf(sgftree.root, tmpstring); printf("You may resume the game"); printf(" with -l %s --mode ascii\n", tmpstring); printf("or load %s\n", tmpstring); } else printf("Please specify filename\n"); break; case CMD_LOAD: strtok(command, " "); tmpstring = strtok(NULL, " "); if (tmpstring) { /* discard newline */ tmpstring[strlen(tmpstring) - 1] = 0; if (!sgftree_readfile(&sgftree, tmpstring)) { fprintf(stderr, "Cannot open or parse '%s'\n", tmpstring); break; } /* to avoid changing handicap etc. */ if (gameinfo_play_sgftree(gameinfo, &sgftree, NULL) == EMPTY) fprintf(stderr, "Cannot load '%s'\n", tmpstring); else { sgf_initialized = 1; sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap); } } else printf("Please specify a filename\n"); break; case CMD_LISTDRAGONS: silent_examine_position(EXAMINE_DRAGONS); show_dragons(); break; default: printf("\nInvalid command: %s", command); break; } if (passes >= 2) state = ascii_endgame(gameinfo, 0); } #if READLINE free(line_ptr); #endif } sgffile_output(&sgftree); passes = 0; /* Play a different game next time. */ update_random_seed(); /* Free the sgf tree and prepare for a new game. */ sgfFreeNode(sgftree.root); sgftree_clear(&sgftree); sgftreeCreateHeaderNode(&sgftree, board_size, komi, gameinfo->handicap); sgf_initialized = 0; gameinfo_clear(gameinfo); } }