简易五子棋的实现(C++)

news2025/5/31 21:57:50

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)

目录

      • 一、效果图
      • 二、代码(带注释)
      • 三、说明

一、效果图

在这里插入图片描述

二、代码(带注释)

#include <iostream>
#include <vector>

using namespace std;

const int BOARD_SIZE = 15; // 定义棋盘大小为 15x15
vector<vector<char>> board(BOARD_SIZE, vector<char>(BOARD_SIZE, '.')); // 初始化棋盘,所有位置都是空的(用'.'表示)

// 打印棋盘的函数
void printBoard() {
    for (int i = 0; i < BOARD_SIZE; ++i) {
        for (int j = 0; j < BOARD_SIZE; ++j) {
            cout << board[i][j] << " ";
        }
        cout << endl;
    }
}

// 落子的函数
bool makeMove(int x, int y, char player) {
    // 检查落子的位置是否有效
    if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[x][y] != '.') {
        return false;
    }
    board[x][y] = player; // 在指定位置放置玩家的棋子
    return true;
}

// 检查是否赢得比赛的函数
bool checkWin(int x, int y) {
    char player = board[x][y];
    int count;

    // 水平方向检查
    count = 1;
    for (int i = x - 1; i >= 0 && board[i][y] == player; --i) count++;
    for (int i = x + 1; i < BOARD_SIZE && board[i][y] == player; ++i) count++;
    if (count >= 5) return true;

    // 垂直方向检查
    count = 1;
    for (int i = y - 1; i >= 0 && board[x][i] == player; --i) count++;
    for (int i = y + 1; i < BOARD_SIZE && board[x][i] == player; ++i) count++;
    if (count >= 5) return true;

    // 对角线检查(左上到右下)
    count = 1;
    for (int i = 1; x - i >= 0 && y - i >= 0 && board[x - i][y - i] == player; ++i) count++;
    for (int i = 1; x + i < BOARD_SIZE && y + i < BOARD_SIZE && board[x + i][y + i] == player; ++i) count++;
    if (count >= 5) return true;

    // 对角线检查(左下到右上)
    count = 1;
    for (int i = 1; x - i >= 0 && y + i < BOARD_SIZE && board[x - i][y + i] == player; ++i) count++;
    for (int i = 1; x + i < BOARD_SIZE && y - i >= 0 && board[x + i][y - i] == player; ++i) count++;
    if (count >= 5) return true;

    return false;
}

// 检查棋盘是否已满的函数
bool isBoardFull() {
    for (int i = 0; i < BOARD_SIZE; ++i) {
        for (int j = 0; j < BOARD_SIZE; ++j) {
            if (board[i][j] == '.') {
                return false;
            }
        }
    }
    return true;
}

// 主函数
int main() {
    int x, y;
    char currentPlayer = 'X'; // 初始玩家
    while (true) {
        printBoard(); // 打印棋盘
        cout << "玩家" << currentPlayer << ", 输入行列的来放入棋子: ";
        cin >> x >> y;
        if (makeMove(x, y, currentPlayer)) { // 尝试落子
            if (checkWin(x, y)) { // 检查是否赢得比赛
                cout << "玩家 " << currentPlayer << " wins!" << endl;
                break;
            } else if (isBoardFull()) { // 检查是否平局
                cout << "平局了!" << endl;
                break;
            }
            currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; // 更换玩家
        } else {
            cout << "无效移动,请重新尝试" << endl;
        }
    }
    return 0;
}

三、说明

上述代码实现了一个简单的棋盘游戏,适用于两位玩家,棋盘大小:15x15。关于实现思路和自定义函数说明如下:

  1. 棋盘初始化:棋盘是一个15x15的网格,初始化时用’.'表示空位。

  2. 打印棋盘printBoard()函数打印当前棋盘的状态。

  3. 落子makeMove()函数允许玩家在棋盘上放置他们的符号(‘X’或’O’),前提是所选单元格为空。

  4. 检查胜利checkWin()函数检查玩家的最后一个动作是否赢得了游戏。它水平、垂直和对角线(两个方向)检查是否有连续的5个相同符号。

  5. 检查棋盘是否已满isBoardFull()函数检查棋盘上是否还有空位。

  6. 游戏循环:在main()中,游戏继续循环,每位玩家轮流进行移动。每次移动后,它检查是否胜利或平局。如果一方胜利或棋盘已满(导致平局),游戏结束。

  7. 用户输入:玩家通过标准输入(cin)输入他们的移动,他们需要输入行号和列号。

  8. 处理无效移动:如果进行了无效的移动,游戏会提示用户重新尝试。

这个棋盘游戏,基于文本实现,在控制台中进行,能够提供一个简单但功能完备的双人棋盘游戏实现。

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1355517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取CNN/DM适用于评估Bart的格式的数据集(类似于test.source、test.source.tokenized)

项目场景&#xff1a; 复现文本摘要任务评估CNN/DM数据集 问题描述 abisee老哥的代码获取的是bin格式的数据集 时间久远&#xff0c;一些依赖的配置版本难以复现 笔者需要能评估Bart 格式的数据集 形式类似于test.source、test.source.tokenized 解决方案&#xff1a; 经过坚…

确定转角起始扭矩值的方法有哪些

在预紧螺栓时&#xff0c;扭矩加角度法是一种常用的方法。这种方法需要确定转角起始扭矩值&#xff0c;以确保螺栓能够被正确地预紧。确定转角起始扭矩值的方法如下&#xff0c;SunTorque智能扭矩系统带大家一起了解。1. 确定螺栓规格和性能参数 在预紧螺栓之前&#xff0c;需要…

odoo17 | 模型之间的关系

前言 上一章介绍了自定义的创建 包含基本字段的模型的视图。但是&#xff0c;在任何实际业务场景中&#xff0c;我们需要的不仅仅是 一个模型。此外&#xff0c;模型之间的链接是必要的。人们可以很容易地想象一个模型包含 客户和另一个包含用户列表的客户。您可能需要推荐客户…

分布式图文详解!

分布式理论 1. 说说CAP原则&#xff1f; CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、 Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;这3个基本…

进程的韵律:探索计算机世界中的动态舞台

这里写目录标题 进程定义进程的组成进程与程序区别进程与线程区别进程特点进程控制结尾 进程定义 进程&#xff1a;一个具有一定功能的程序在一个数据集合上的一次动态执行过程。 进程是指正在运行的程序&#xff0c;它是操作系统进行资源分配和调度的基本单位。在计算机中&…

【安装pybluez】报错解决python setup.py egg_info did not run successfully.

python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [1 lines of output] error in PyBluez setup command: use_2to3 is invalid. [end of output] Preparing metadata (setup.py) … error error: subprocess-exited-with-error python setup.p…

SpringBoot连接MySQL并整合MyBatis-Plus

SpringBoot连接MySQL并整合MyBatis-Plus 配置springboot版本目录结构pom.xml文件application.yml数据库表代码Test.javaTestMapper.javaTestMapper.xmlTestService.javaTestServiceImpl.javaTestController.java效果配置 springboot版本 <parent><groupId>org.sp…

【面试高频算法解析】算法练习2 回溯

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯双指针滑动窗口深度优先搜索…

JavaScript高级程序设计读书记录(二):语言基础,操作符,语句,函数

4. 操作符 4.1 一元操作符 只操作一个值的操作符叫一元操作符&#xff08;unary operator&#xff09;。一元操作符是 ECMAScript中最简单的操作符。 1. 递增/递减操作符 递增和递减操作符-- 直接照搬自 C 语言&#xff0c;但有两个版本&#xff1a;前缀版和后缀版。 无论使…

使用KVM命令集管理虚拟机

1、KVM基本功能管理 1&#xff09;查看命令帮助 [rootlocalhost ~]# virsh -h ......//省略输出内容 2&#xff09;查看KVM的配置文件存放目录&#xff08;rhel7.1是虚拟机系统实例的配置文件&#xff09; [rootlocalhost ~]# ls /etc/libvirt/qemu autostart networks r…

Spark内核解析-脚本解析2(六)

2、脚本解析 在看源码之前&#xff0c;我们一般会看相关脚本了解其初始化信息以及Bootstrap类&#xff0c;Spark也不例外&#xff0c;而Spark中相关的脚本如下&#xff1a; %SPARK_HOME%/sbin/start-master.sh %SPARK_HOME%/sbin/start-slaves.sh %SPARK_HOME%/sbin/start-all…

SQL中 Group by Grouping Sets 分组的用法

文章目录 1. 用法2. 语法3. 实际应用3.1 求总和与小计3.2 按多个维度分组3.3 标记小计和总计 1. 用法 将Grouping Sets 运算符添加到Group by 子句中&#xff0c;使用Grouping Set 可以在一个查询中指定数据的多个分组&#xff0c;其结果与针对指定的组执行union all 运算等效…

《设计模式》之策略模式

策略模式定义 比如对象的某个行为&#xff0c;在不同场景有不同实现方式&#xff0c;可以将这些行为的具体实现定义为一组策略&#xff0c;每个实现类实现种策略&#xff0c;在不同场景使用不同的实现&#xff0c;并且可以自由切换策略。 策略模式结构 策略模式需要一个策略…

SpringBoot的测试

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【iOS安全】JS 调用Objective-C中WKWebview Handler的三种方式

有三种实现途径 1. WKScriptMessageHandler OC部分&#xff1a;注册并实现Handler 将OC中的方法"nativeMethod"注册为JavaScript Message Handler&#xff0c;从而WebView中的JavaScript代码可以调用该方法 // Register in Objective-C code - (void)setupWKWebVi…

table的最后一行需要加底色

<tr class"font12" v-for"(item, index) in OrderAuditDiscountList.list" :key"index":class"OrderAuditDiscountList.list.length - 1 index ? blodfont : "> 其中&#xff1a; :class"OrderAuditDiscountList.list.le…

分布式锁Lock4J 使用总结

Lok4j 简介 lock4j是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组件。 特点 简单易用&#xff0c;功能强大&#xff0c;扩展性强。支持redission,redisTemplate,zookeeper。可混用&#xff0c…

羊大师讲解,羊奶为什么更适合高血压人群?

羊大师讲解&#xff0c;羊奶为什么更适合高血压人群&#xff1f; 高血压是一种常见的健康问题&#xff0c;它会引起诸多并发症并增加心脑血管疾病的风险。与此同时&#xff0c;人们越来越关注饮食对健康的影响。作为一种营养丰富且适合高血压人群的饮品&#xff0c;羊奶备受关…

Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

玩转JNPF可视化平台,软件开发如此简单!

以 Vue 为技术栈的低代码 JNPF &#xff0c;开发力量还可以。这款低代码和市面上的其他低代码区别很大的&#xff0c;相较于轻流、简道云、轻宜搭、微搭、帆软、活字格等等&#xff0c;这类面向业务人群使用的低代码&#xff08;不需要研发人员操作的编写的&#xff0c;我更愿意…