五子棋游戏
https://github.com/2810zhc/Simple_Gomoku
项目简介
这是一个简单的五子棋游戏,支持玩家对战、玩家与机器人对战两种模式。游戏支持计时功能,并具有判定禁手与胜负的规则。
采用了博弈树且包含基本的禁手功能(“三、三” “四、四” “长连”),考虑到了不同的禁手可能,如连续活三和跳跃活三。
功能概述
- 玩家对战:两个玩家轮流下棋,直到某一方获胜或棋盘满为止。
- 人机对战:玩家与机器人进行对战,机器人自动计算落子位置。
- 计时功能:每步棋有时间限制,每个玩家有总比赛时间。
- 禁手规则:判断是否犯规(例如,四连禁手),并判负。
- 胜利判断:当一方形成五个连子时,判定该玩家胜利。
游戏模式
游戏提供四种操作模式供玩家选择:
- 玩家对战:两名玩家在同一台计算机上进行对战。
- 人机对战:玩家与机器人进行对战。
- 规则阅读:显示五子棋的规则说明。
- 退出:退出游戏。
=======
部分禁手规则代码
#include "Rule.h"
bool Rule::checkWin(const Board& board, int x, int y, char stone) {
int directions[4][2] = { {0, 1}, {1, 0}, {1, 1}, {1, -1} };//方向变换
for (const auto& dir : directions) {
int count = 1;
for (int step = 1; step < 5; ++step) {
int nx = x + step * dir[0], ny = y + step * dir[1];
if (board.getCell(nx, ny) == stone) count++;
else break;
}
for (int step = 1; step < 5; ++step) {
int nx = x - step * dir[0], ny = y - step * dir[1];
if (board.getCell(nx, ny) == stone) count++;
else break;
}
if (count >= 5) return true;
}
return false;
}
bool Rule::isForbiddenMove(Board& board, int x, int y, char stone, int& liveThreeCount, int& liveFourCount) {
if (stone != 'X') return false; // 只有黑棋需要检测禁手
board.removeStone(x, y);
int temp_three = liveThreeCount;
int flag1 = 0; int flag2 = 0;
for (int i = 0; i < Board::SIZE; ++i) {
for (int j = 0; j < Board::SIZE; ++j) {
if (board.getCell(i, j) == 'X') {
//往各个方位生长
int x_num, k_num;
expandInDirection(board, i, j, 1, 0, x_num, k_num); // 下方向 (1, 0)
if (x_num == 4 && k_num == 2) {
liveThreeCount++; // 存在活三
flag1 = 1;
}
if (x_num == 5 && k_num == 2) {
liveFourCount++; // 存在活四
flag2 = 1;
}
int x_num2, k_num2;
expandInDirection(board, i, j, 0, 1, x_num2, k_num2); // 右方向 (0, 1)
if (x_num2 == 4 && k_num2 == 2) {