mirror of
https://github.com/LHY0125/Gobang-Game.git
synced 2026-05-09 18:09:46 +08:00
125 lines
3.1 KiB
C
125 lines
3.1 KiB
C
/**
|
||
* @file init_board.c
|
||
* @brief 初始化游戏棋盘源文件
|
||
* @note 本文件定义了初始化游戏棋盘的相关函数。
|
||
* 它负责设置游戏的初始状态,包括棋盘大小、玩家标识、游戏规则等。
|
||
*/
|
||
|
||
#include "init_board.h"
|
||
#include "gobang.h"
|
||
#include "game_mode.h"
|
||
#include "config.h"
|
||
#include "globals.h"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
/**
|
||
* @brief 初始化棋盘为全空状态并重置步数计数器
|
||
* 清空棋盘数组并将所有位置设为EMPTY,同时将step_count重置为0
|
||
*/
|
||
void empty_board()
|
||
{
|
||
// 初始化棋盘状态为全空
|
||
for (int i = 0; i < BOARD_SIZE; i++)
|
||
{
|
||
for (int j = 0; j < BOARD_SIZE; j++)
|
||
{
|
||
board[i][j] = EMPTY;
|
||
}
|
||
}
|
||
step_count = 0; // 重置步数计数器
|
||
}
|
||
|
||
/**
|
||
* @brief 打印当前棋盘状态
|
||
* 以可读格式输出棋盘,包括行列号和棋子状态
|
||
* 玩家棋子显示为'x',AI棋子显示为'○',空位显示为'·'
|
||
*/
|
||
void print_board()
|
||
{
|
||
// 打印列号(1-BOARD_SIZE显示)
|
||
printf("\n ");
|
||
for (int i = 0; i < BOARD_SIZE; i++)
|
||
{
|
||
printf("%2d", i + 1);
|
||
if (i + 1 == 9) // 处理列号9和10+的对齐
|
||
{
|
||
printf(" ");
|
||
}
|
||
}
|
||
printf("\n");
|
||
|
||
// 逐行打印棋盘内容
|
||
for (int i = 0; i < BOARD_SIZE; i++)
|
||
{
|
||
printf("%2d ", i + 1); // 打印行号(1-BOARD_SIZE)
|
||
for (int j = 0; j < BOARD_SIZE; j++)
|
||
{
|
||
if (board[i][j] == PLAYER)
|
||
{
|
||
printf("x "); // 玩家棋子
|
||
}
|
||
else if (board[i][j] == AI)
|
||
{
|
||
printf("○ "); // AI棋子(使用○显示)
|
||
}
|
||
else
|
||
{
|
||
printf("· "); // 空位
|
||
}
|
||
}
|
||
printf("\n"); // 每行结束换行
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 配置棋盘大小
|
||
*
|
||
* @param player1 玩家1
|
||
* @param player2 玩家2
|
||
*/
|
||
void setup_board_size()
|
||
{
|
||
printf("通常棋盘大小分为休闲棋盘(13X13)、标准棋盘(15X15)和特殊棋盘(19X19)\n");
|
||
char prompt[100];
|
||
sprintf(prompt, "请输入棋盘大小(5~%d)(默认为标准棋盘):\n", MAX_BOARD_SIZE);
|
||
BOARD_SIZE = get_integer_input(prompt, 5, MAX_BOARD_SIZE);
|
||
}
|
||
|
||
/**
|
||
* @brief Set the up game options object
|
||
* 配置游戏选项,包括禁手规则、计时器和时间限制
|
||
*/
|
||
void setup_game_options()
|
||
{
|
||
use_forbidden_moves = get_integer_input("是否启用禁手规则 (1-是, 0-否): ", 0, 1);
|
||
|
||
use_timer = get_integer_input("是否启用计时器 (1-是, 0-否): ", 0, 1);
|
||
if (use_timer)
|
||
{
|
||
time_limit = get_integer_input("请输入每回合的时间限制 (1~60分钟): ", 1, 60) * 60;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 确定先手玩家
|
||
*
|
||
* @param player1
|
||
* @param player2
|
||
* @return int player1 or player2
|
||
*/
|
||
int determine_first_player(int player1, int player2)
|
||
{
|
||
char prompt[100];
|
||
sprintf(prompt, "请选择先手方 (1 for Player %d, 2 for Player %d): ", player1, player2);
|
||
int first_player_choice = get_integer_input(prompt, 1, 2);
|
||
if (first_player_choice == 1)
|
||
{
|
||
return player1;
|
||
}
|
||
else
|
||
{
|
||
return player2;
|
||
}
|
||
} |