/** * @brief ui_ggs_update * * Update a game. * * @param ui User Interface. */ static void ui_ggs_update(UI *ui) { char buffer[256], s_move[4]; Play *play; int edax_turn, turn; Board board[1]; printf("[received GGS_BOARD_UPDATE]\n"); // set correct played game if (strcmp(ui->ggs->board->player[0].name, ui->ggs->me) == 0) { play = ui->play; edax_turn = BLACK; } else if (strcmp(ui->ggs->board->player[1].name, ui->ggs->me) == 0) { play = ui->play + 1; edax_turn = WHITE; } else { return ; } if (!ui->ggs->board->match_type->is_synchro) play = ui->play; // set board as an edax's board sprintf(buffer, "%s %c", ui->ggs->board->board, ui->ggs->board->turn); turn = board_set(board, buffer); // update the board... if possible if (!play_move(play, ui->ggs->board->move)) { info("<Updating with bad move %s>\n", move_to_string(ui->ggs->board->move, play->player, s_move)); } if (!board_equal(board, play->board)) { // may happens when game diverges info("<Resynchronize boards: diverging games>\n"); *play->board = *board; play->player = turn; } if (turn != play->player) { // should never happen: TODO fatal error? printf("[WARNING: updating player's turn]\n"); play->player = turn; } printf("[%s's turn in game %s]\n", ui->ggs->board->player[play->player].name, ui->ggs->board->id); // playing same game... ? ui->is_same_play = (!ui->ggs->board->match_type->is_synchro || board_equal(ui->play[0].board, ui->play[1].board)); if (ui->is_same_play) printf("<Playing same game...>\n"); // set time & start thinking if (play->player == edax_turn) { printf("<My turn>\n"); ui_ggs_play(ui, edax_turn); } else { printf("<Opponent turn>\n"); ui_ggs_ponder(ui, edax_turn); } }
void test_board_save_to_file_saved_board_matches_original_when_loaded() { const char *filename = "test_board.chs"; board_t *to_save = board_init_start(); bool overwrite = true; int result; /* Save the file */ result = board_save_to_file(filename, to_save, overwrite); TEST_ASSERT_MESSAGE( result == 0, "Expected overwriting save of valid board to succeed" ); /* Reload the file into a new board_t* */ board_t *loaded_board; loaded_board = board_load_from_file(filename); TEST_ASSERT_MESSAGE( loaded_board != NULL, "Expected board load from valid file to succeed" ); /* Check that the old and new board match */ bool boards_match; boards_match = board_equal(to_save, loaded_board); TEST_ASSERT_MESSAGE( boards_match, "Expected the loaded board to match the saved one" ); board_destroy(loaded_board); board_destroy(to_save); }
/** * @brief ui_ggs_join * * Join a new game. * This is a new game from Edax point of view. * This may be a saved game from GGS side. * * @param ui User Interface. */ static void ui_ggs_join(UI *ui) { char buffer[256]; char s_move[4]; Play *play; int edax_turn, i; printf("[received GGS_BOARD_JOIN]\n"); // set correct played game if (strcmp(ui->ggs->board->player[0].name, ui->ggs->me) == 0) { play = ui->play; edax_turn = BLACK; } else if (strcmp(ui->ggs->board->player[1].name, ui->ggs->me) == 0) { play = ui->play + 1; edax_turn = WHITE; } else { warn("Edax is not concerned by this game\n"); return ; } // non synchro games => play a single match if (!ui->ggs->board->match_type->is_synchro) play = ui->play; // set board sprintf(buffer, "%s %c", ui->ggs->board->board_init, ui->ggs->board->turn_init); play_set_board(play, buffer); for (i = 0; i < ui->ggs->board->move_list_n; i++) { if (!play_move(play, ui->ggs->board->move_list[i])) { error("cannot play GGS move %s ?", move_to_string(ui->ggs->board->move_list[i], play->player, s_move)); break; } } printf("[%s's turn in game %s]\n", ui->ggs->board->player[play->player].name, ui->ggs->board->id); board_print(play->board, play->player, stdout); ui->is_same_play = (ui->ggs->board->move_list_n == 0 || board_equal(ui->play[0].board, ui->play[1].board) || !ui->ggs->board->match_type->is_synchro); if (ui->is_same_play) printf("[Playing same game]\n"); // set time & start thinking if (play->player == edax_turn) { printf("<My turn>\n"); ggs_client_send(ui->ggs, "tell .%s =====================================\n", ui->ggs->me); ui_ggs_play(ui, edax_turn); ui_ggs_ponder(ui, edax_turn); } else { printf("[Waiting opponent move]\n"); // ui_ggs_ponder(ui, edax_turn); } }
bool game_is_ok(const game_t * game) { board_t board[1]; int pos, move; if (game == NULL) return false; if (game->size < 0 || game->size > GameSize) return false; if (game->pos < 0 || game->pos > game->size) return false; // optional heavy DEBUG mode if (!UseSlowDebug) return true; if (!board_is_ok(game->start_board)) return false; board_copy(board,game->start_board); for (pos = 0; pos <= game->size; pos++) { if (pos == game->pos) { if (!board_equal(game->board,board)) return false; } if (pos >= game->size) break; if (game->key[pos] != board->key) return false; move = game->move[pos]; if (!move_is_legal(move,board)) ; move_do(board,move); } if (game->status != game_comp_status(game)) return false; return true; }