C++五子棋游戏-含禁手

五子棋游戏

https://github.com/2810zhc/Simple_Gomoku

项目简介

这是一个简单的五子棋游戏,支持玩家对战、玩家与机器人对战两种模式。游戏支持计时功能,并具有判定禁手与胜负的规则。

采用了博弈树且包含基本的禁手功能(“三、三” “四、四” “长连”),考虑到了不同的禁手可能,如连续活三和跳跃活三。

功能概述

  • 玩家对战:两个玩家轮流下棋,直到某一方获胜或棋盘满为止。
  • 人机对战:玩家与机器人进行对战,机器人自动计算落子位置。
  • 计时功能:每步棋有时间限制,每个玩家有总比赛时间。
  • 禁手规则:判断是否犯规(例如,四连禁手),并判负。
  • 胜利判断:当一方形成五个连子时,判定该玩家胜利。

游戏模式

游戏提供四种操作模式供玩家选择:

  1. 玩家对战:两名玩家在同一台计算机上进行对战。
  2. 人机对战:玩家与机器人进行对战。
  3. 规则阅读:显示五子棋的规则说明。
  4. 退出:退出游戏。

=======

部分禁手规则代码

#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) {
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值