mirror of
https://github.com/LHY0125/Gobang-Game.git
synced 2026-05-10 02:19:46 +08:00
233 lines
5.1 KiB
C
233 lines
5.1 KiB
C
/**
|
|
* @file gobang.h
|
|
* @author ??????(3364451258@qq.com??15236416560@163.com??lhy3364451258@outlook.com)
|
|
* @brief ?????????????
|
|
* @version 3.0
|
|
* @date 2025-06-30
|
|
*
|
|
* @copyright Copyright (c) 2025
|
|
*
|
|
* @note ??????gobang.c???????????????????????????????
|
|
* @note ??????
|
|
* 1. ???5x5??25x25??????????
|
|
* 2. ????????????????AI????
|
|
* 3. ?????????????????????
|
|
* 4. ???????????0-base????
|
|
* 5. ?????????????????
|
|
* 6. ??????????????????????????????????
|
|
* 7. ????????????????????????
|
|
*/
|
|
|
|
#ifndef GO_BANG_H
|
|
#define GO_BANG_H
|
|
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
|
|
// ????
|
|
/**
|
|
* @brief ????????????
|
|
* @note 25x25????????????????????????????????????AI??????
|
|
*/
|
|
#define MAX_BOARD_SIZE 25 // ????????????(5x5??25x25)
|
|
|
|
/**
|
|
* @brief ???????
|
|
* @note ???1/2????????????????????????????
|
|
*/
|
|
#define PLAYER 1 // ???????????
|
|
#define AI 2 // AI????????
|
|
#define PLAYER1 1 // ???1????????
|
|
#define PLAYER2 2 // ???2????????
|
|
|
|
/**
|
|
* @brief ??????????
|
|
* @note ??????PLAYER/AI??????
|
|
*/
|
|
#define EMPTY 0 // ??????????
|
|
|
|
/**
|
|
* @brief ?????????
|
|
* @note ?????????????????????????????
|
|
*/
|
|
#define MAX_STEPS (MAX_BOARD_SIZE * MAX_BOARD_SIZE) // ??????????????????
|
|
|
|
// ??????????
|
|
extern int BOARD_SIZE; // ?????????????(???15)
|
|
extern int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; // ?????????????
|
|
extern int step_count; // ?????????????
|
|
extern bool use_forbidden_moves; // ?????????????
|
|
extern int use_timer; // ????????????
|
|
extern int time_limit; // ??????????
|
|
extern const int direction[4][2];
|
|
|
|
/**
|
|
* @brief ?????????????
|
|
* @note ?????????????????AI??????
|
|
* @note ??????:
|
|
* - player: ????????(PLAYER/AI)
|
|
* - x/y: 0-based????????
|
|
*/
|
|
typedef struct
|
|
{
|
|
int player; // ????????
|
|
int x, y; // ????????
|
|
} Step;
|
|
|
|
extern Step steps[MAX_STEPS]; // ???????????????????
|
|
|
|
bool handle_player_turn(int current_player);
|
|
|
|
/**
|
|
* @brief ?????????????
|
|
* @note ????????????????????????
|
|
* @note ??????:
|
|
* - continuous_chess: ??????????????
|
|
* - check_start: ??????????????????(??????)
|
|
* - check_end: ??????????????????(??????)
|
|
*/
|
|
typedef struct
|
|
{
|
|
int continuous_chess; // ????????????
|
|
bool check_start; // ????????????????????
|
|
bool check_end; // ????????????????????
|
|
} DirInfo;
|
|
|
|
// ????????
|
|
/**
|
|
* @brief ???????????????
|
|
*/
|
|
void empty_board();
|
|
|
|
/**
|
|
* @brief ????????????
|
|
*/
|
|
void print_board();
|
|
|
|
/**
|
|
* @brief ??????????????????????
|
|
* @param x ??????(0-base)
|
|
* @param y ??????(0-base)
|
|
* @return true ?????????????
|
|
* @return false ????????????????
|
|
*/
|
|
bool have_space(int x, int y);
|
|
|
|
/**
|
|
* @brief ???????????
|
|
*/
|
|
void setup_board_size();
|
|
|
|
/**
|
|
* @brief ??????????
|
|
* @note ????????????????????????
|
|
*/
|
|
void setup_game_options();
|
|
|
|
/**
|
|
* @brief ???????????
|
|
* @param player1 ???1????
|
|
* @param player2 ???2????
|
|
* @return int ??????????
|
|
*/
|
|
int determine_first_player(int player1, int player2);
|
|
|
|
/**
|
|
* @brief ???????????
|
|
* @param x ??????(0-base)
|
|
* @param y ??????(0-base)
|
|
* @param player ?????
|
|
* @return true ?????
|
|
* @return false ???????
|
|
*/
|
|
bool is_forbidden_move(int x, int y, int player);
|
|
|
|
/**
|
|
* @brief ??????????
|
|
* @param x ??????(0-base)
|
|
* @param y ??????(0-base)
|
|
* @return true ??????
|
|
* @return false ???????(????????)
|
|
*/
|
|
bool player_move(int x, int y, int player);
|
|
|
|
/**
|
|
* @brief ???????????????????????????
|
|
* @param x ?????????
|
|
* @param y ?????????
|
|
* @param dx ??????????(-1,0,1)
|
|
* @param dy ??????????(-1,0,1)
|
|
* @param player ?????(PLAYER/AI)
|
|
* @return DirInfo ???????????????????????????
|
|
*/
|
|
DirInfo count_specific_direction(int x, int y, int dx, int dy, int player);
|
|
|
|
/**
|
|
* @brief ????????????????????????????
|
|
* @param x ??????(0-base)
|
|
* @param y ??????(0-base)
|
|
* @param player ?????(PLAYER/AI)
|
|
* @return true ??????????
|
|
* @return false ????????????
|
|
*/
|
|
bool check_win(int x, int y, int player);
|
|
|
|
/**
|
|
* @brief ??????????
|
|
* @return true ??????
|
|
* @return false ???????(????????)
|
|
* @note ????????AI????????????
|
|
*/
|
|
bool return_move(int steps_to_undo);
|
|
|
|
/**
|
|
* @brief ???????????
|
|
* ????????????????????????
|
|
*/
|
|
void review_process(int game_mode);
|
|
|
|
/**
|
|
* @brief ???????????????????????
|
|
* @param player ??????????(PLAYER/AI)
|
|
* @return int ???(???????????????)
|
|
*/
|
|
int evaluate_performance(int player);
|
|
|
|
/**
|
|
* @brief ?????????????
|
|
* @param x ??????
|
|
* @param y ??????
|
|
* @param player ?????
|
|
* @return int ?????????
|
|
*/
|
|
int calculate_step_score(int x, int y, int player);
|
|
|
|
/**
|
|
* @brief ???????????????????
|
|
* @param filename ???????????
|
|
* @return int ??????:
|
|
* 0: ???
|
|
* 1: ?????????
|
|
* 2: ????????
|
|
* 3: ??????????
|
|
*/
|
|
int save_game_to_file(const char *filename, int game_mode);
|
|
|
|
/**
|
|
* @brief ????????????????????
|
|
*/
|
|
void handle_save_record(int game_mode);
|
|
|
|
/**
|
|
* @brief ???????????????
|
|
* @param filename ???????????
|
|
* @return true ??????
|
|
* @return false ???????
|
|
*/
|
|
int load_game_from_file(const char *filename);
|
|
|
|
#endif // GO_BANG_H
|