static boolean history_forward (hex_t hex) { unsigned int current = hex->history_current; int i, j; if (hex->history_current == hex->history_size) return FALSE; i = hex->history[current][0]; j = hex->history[current][1]; hex->end_of_game_p = hex->history[current][2]; CELL (hex,i,j).player = hex->player; SWITCH_PLAYER (hex); hex->history_current++; return TRUE; }
static boolean history_backward (hex_t hex) { unsigned int current; int i, j; if (hex->history_current == 0) return FALSE; hex->history_current--; current = hex->history_current; i = hex->history[current][0]; j = hex->history[current][1]; hex->end_of_game_p = 0; CELL(hex,i,j).player = 0; SWITCH_PLAYER (hex); return TRUE; }
hex_status_t hex_move (hex_t hex, uint i, uint j) { hex_status_t status; unsigned int current; status = hex_move_1 (hex, hex->player, i, j); if (status == HEX_SUCCESS) { SWITCH_PLAYER (hex); /* Truncate the 'future' history */ if (hex->history_current < hex->history_size) recompute_setting (hex); current = hex->history_current; hex->history[current][0] = i; hex->history[current][1] = j; hex->history[current][2] = hex->end_of_game_p; hex->history_current++; hex_truncate_history (hex); } return status; }
int ai_play(ai* self, int col, int row) { int i, move_id = -1, moves_len = self->moves_len; future_move *move; for (i=0; i<moves_len; i++) { move = (self->moves)[i]; if ((move->col == col) && (move->row == row)) { move_id = i; break; } } if (move_id < 0) { return CANNOT_PLAY_HERE; } /* delete all others possible moves */ for (i=0; i<moves_len; i++) { if (move_id != i) { free_future_move((self->moves)[i]); } } /* put this move's future moves into current position */ self->moves = move->moves; self->moves_len = move->moves_len; /* delete this move */ move->moves = NULL; free_future_move(move); put_piece_by_colrow(self->b, col, row, self->current_player_c); SWITCH_PLAYER(self->current_player_c); return 0; }