【C++】 C++游戏设计---五子棋小游戏
1. 游戏介绍
一个简单的 C++ 五子棋小游戏
1.1 游戏规则:
- 双人轮流输入下入点坐标
- 横竖撇捺先成五子连线者胜
- 同一坐标点不允许重复输入
1.2 初始化与游戏界面

2. 源代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>using namespace std;const int BOARD_SIZE = 15;
char board[BOARD_SIZE][BOARD_SIZE];void initBoard() {for (int i = 0; i < BOARD_SIZE; ++i) {for (int j = 0; j < BOARD_SIZE; ++j) {board[i][j] = '.';}}
}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 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;
}bool checkWin(int x, int y, char player) {int count;// 横向检查count = 0;for (int i = max(0, x - 4); i <= x; ++i) {if (board[y][i] == player) {count++;} else {count = 0;}}for (int i = x + 1; i < min(BOARD_SIZE, x + 5); ++i) {if (board[y][i] == player) {count++;} else {break;}}if (count >= 5) return true;// 纵向检查count = 0;for (int i = max(0, y - 4); i <= y; ++i) {if (board[i][x] == player) {count++;} else {count = 0;}}for (int i = y + 1; i < min(BOARD_SIZE, y + 5); ++i) {if (board[i][x] == player) {count++;} else {break;}}if (count >= 5) return true;// 斜向(从左上到右下)检查count = 0;for (int i = max(-4, -x); i <= 0; ++i) {if (x + i >= 0 && x + i < BOARD_SIZE && y + i >= 0 && y + i < BOARD_SIZE && board[y + i][x + i] == player) {count++;} else {count = 0;}}for (int i = 1; i <= min(4, BOARD_SIZE - 1 - x); ++i) {if (x + i >= 0 && x + i < BOARD_SIZE && y + i >= 0 && y + i < BOARD_SIZE && board[y + i][x + i] == player) {count++;} else {break;}}if (count >= 5) return true;// 斜向(从右上到左下)检查count = 0;for (int i = max(-4, -x); i <= 0; ++i) {if (x + i >= 0 && x + i < BOARD_SIZE && y - i >= 0 && y - i < BOARD_SIZE && board[y - i][x + i] == player) {count++;} else {count = 0;}}for (int i = 1; i <= min(4, BOARD_SIZE - 1 - x); ++i) {if (x + i >= 0 && x + i < BOARD_SIZE && y - i >= 0 && y - i < BOARD_SIZE && board[y - i][x + i] == player) {count++;} else {break;}}if (count >= 5) return true;return false;
}int main() {initBoard();bool isPlayerX = true;bool gameOver = false;while (!gameOver) {printBoard();int x, y;cout << (isPlayerX ? "Player X" : "Player O") << ", enter your move (row column): ";cin >> y >> x;if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[y][x] != '.') {cout << "Invalid move. Try again." << endl;continue;}board[y][x] = isPlayerX ? 'X' : 'O';if (checkWin(x, y, board[y][x])) {printBoard();cout << (isPlayerX ? "Player X wins!" : "Player O wins!") << endl;gameOver = true;} else if (isBoardFull()) {printBoard();cout << "It's a draw!" << endl;gameOver = true;} else {isPlayerX = !isPlayerX;}}return 0;
}
3. 主要代码释解
这段代码是一个简单的五子棋游戏的实现,下面是对主要函数和异常错误处理机制的详解:
initBoard()- 功能:初始化棋盘,将所有位置设置为’.',表示空白。
- 实现:通过双重循环遍历二维数组
board,并将每个元素设置为’.'。
printBoard()- 功能:打印当前棋盘的状态。
- 实现:通过双重循环遍历二维数组
board,并打印每个元素。
isBoardFull()- 功能:检查棋盘是否已满。
- 实现:通过双重循环遍历二维数组
board,如果所有位置都不是’.',则返回true,表示棋盘已满。
checkWin(int x, int y, char player)- 功能:检查给定玩家是否在(x, y)位置获胜。
- 实现:检查横向、纵向、两个对角线方向是否有连续的 5 个相同的棋子。如果找到,则返回
true,表示该玩家获胜。
main()- 功能:游戏的主循环,处理玩家的输入,更新棋盘状态,并判断游戏是否结束。
- 实现:
- 初始化棋盘。
- 在一个循环中交替让两个玩家输入他们的移动。
- 检查移动是否有效(即在棋盘范围内且位置为空)。
- 更新棋盘,并检查是否有玩家获胜或棋盘已满。
4. 异常和错误处理机制
- 输入有效性检查
- 在
main()函数中,玩家输入移动后,代码检查移动是否在棋盘范围内,以及对应位置是否为空。 - 如果移动无效(即
x或y超出范围,或者对应位置不是’.'),则打印错误消息,并通过continue跳过当前循环的剩余部分,提示玩家重新输入。
- 在
- 棋盘满时结束游戏
- 在玩家每次移动后,调用
isBoardFull()检查棋盘是否已满。 - 如果棋盘已满,则打印平局消息,并通过设置
gameOver为true结束游戏。
- 在玩家每次移动后,调用
- 检查获胜条件
- 在玩家每次移动后,调用
checkWin()检查该玩家是否获胜。 - 如果玩家获胜,则打印获胜消息,并通过设置
gameOver为true结束游戏。
- 在玩家每次移动后,调用
5. 可改进点
- 异常处理:代码中没有使用 C++ 的异常处理机制,例如
try-catch块。在某些情况下,如果输入不是整数,cin会进入错误状态,这可能导致无限循环。可以通过检查cin的状态并清除错误标志来处理这种情况。 - 边界条件检查:在
checkWin()函数中,对斜向检查的边界条件处理可以进一步优化,以避免不必要的条件判断。 - 代码重用:
checkWin()函数中的横向、纵向和斜向检查有大量重复代码,可以通过提取重复代码到单独的函数中来简化。
这个游戏实现简单,但包含了基本的游戏逻辑和错误处理机制,适合作为学习C++和游戏编程的入门项目。
相关文章:
【C++】 C++游戏设计---五子棋小游戏
1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则: 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…...
仿RabitMQ 模拟实现消息队列项目开发文档2(个人项目)
项目需求分析 核心概念 现在需要将这个项目梳理清楚了,便于之后的代码实现。项目中具有一个生产消费模型: 其中生产者和消费者的个数是可以灵活改变的,让系统资源更加合理的分配。消息队列的主逻辑和上面的逻辑基本一样,只不过我…...
李佳琦回到巅峰背后,双11成直播电商分水岭
时间倏忽而过,又一年的双11即将宣告结束。 从双11正式开始前的《新所有女生的offer》,到被作为“比价”标杆被其他平台直播间蹭、被与其他渠道品牌比较,再到直播间运营一时手快多发了红包……整个双11周期下来,李佳琦直播间在刷新…...
云计算在教育领域的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…...
C语言 | Leetcode C语言题解之第543题二叉树的直径
题目: 题解: typedef struct TreeNode Node;int method (Node* root, int* max) {if (root NULL) return 0;int left method (root->left, max);int right method (root->right, max);*max *max > (left right) ? *max : (left right);…...
6、If、While、For、Switch
6、If、While、For、Switch 一、If 1、if-else if (boolean) {代码块 } else if (boolean) {代码块 } else if (boolean) {代码块 } else { // 默认情况代码块 }关于IDEA单元测试控制台不能输入数据的问题: https://blog.csdn.net/m0_72900498/article/details/…...
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
随着智慧城市和数字化转型的推进,视频监控系统已成为保障公共安全、提升管理效率的重要工具。特别是在大中型项目中,跨区域的网络化视频监控需求日益增长,这要求视频监控管理平台不仅要具备强大的视频资源管理能力,还要能够适应多…...
【多线程】线程池如何知道一个线程的任务已经完成
目录 1. 说明2. 任务的生命周期3. 状态更新4. 线程间的协作5. 内部数据结构6. 回调与通知7. 线程池的关闭与清理 1. 说明 1.线程池通过一系列内部机制来知道一个线程的任务已经完成。2.这些机制主要涉及任务的生命周期管理、状态更新以及线程间的协作。 2. 任务的生命周期 1…...
Transformer介绍(一)
Transformer是一种特殊的神经网络,一种机器学习模型。 谷歌在2017年推出的原版Transformer,论文《Attention Is All You Need》,专注于将一种语言的文本翻译成另一种。 而我们要关注的Transformer变种,即构建ChatGPT等工具的模型…...
[CKS] TLS Secrets创建与挂载
目前的所有题目为2024年10月后更新的最新题库,考试的k8s版本为1.31.1 BackGround 您必须使用存储在TLS Secret中的SSL文件,来保护Web 服务器的安全访问。 Task 在clever-cactus namespace中为名为clever-cactus的现有Deployment创建名为clever-cactu…...
java双向链表解析实现双向链表的创建含代码
双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建(头插法)二.AddLast创建(尾叉法)三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…...
【Kafka-go】golang的kafka应用
网络上关于go的Kafka还是比较少的今天就先出一篇入门级别的,之后再看看能能出一个公司业务场景中的消息流。 一、下载github.com/segmentio/kafka-go包 go get github.com/segmentio/kafka-go二、建立kafka连接 正常来说下面的配置host topic partition 应该写在…...
redis:set集合命令,内部编码,使用场景
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码使用场景总结 前言…...
45期代码随想录算法营总结
代码随想录训练营总结与收获 在为期60天的代码随想录训练营结束后,我感慨良多。这段时间不仅让我在编程技能上有了明显的提升,更让我在学习习惯和时间管理上有了深刻的反思和改变。 报名参加这个训练营对我来说是一个重要的监督机制。之前我总是拖延&a…...
深入理解Java中的instanceof关键字及接口新特性:方法实现的可能性
目录 引言 1. 什么是instanceof关键字? 1.1 语法结构 1.2 instanceof的用法示例 1.3 instanceof的应用场景 2. Java中的接口能包含方法实现吗? 2.1 默认方法(Default Method) 2.2 静态方法(Static Method&…...
【python中如果class没有self会怎行】
python中如果class没有self会怎样TOC 在Python中,self是一个约定俗成的名称,用于表示类的实例。如果没有使用self,会导致以下问题: 1、无法访问实例属性: 在类的方法中,如果没有self,方法将无…...
【算法】(Python)动态规划
动态规划: dynamic programming。"programming"指的是一种表格法,而非编写计算机程序。通常解决最优化问题(optimization problem)。将问题拆分成若干个子问题,求解各子问题来得到原问题的解。适用于多阶段…...
EasyExcel 学习之 导出 “提示问题”
EasyExcel 学习之 导出 “提示问题” 现象分析解决(伪代码)前端 POST 实现后端实现 现象 EasyExcel 支持导出 xlsx、xls、csv 三种文件格式。在导出过程中可能发生各种异常,当发生异常时应该提示错误信息而非导出一个错误的文件。 分析 首…...
应用系统开发(3)低功耗四运算放大器LM324N
LM324N 是一种广泛使用的 低功耗四运算放大器,由德州仪器(Texas Instruments)和其他制造商生产。它具有四个独立的运算放大器,能够在单电源或双电源模式下运行,适合多种模拟电路应用。以下是详细信息: 芯片基本信息 型号:LM324N封装类型:常见 DIP(双列直插封装)或 SO…...
基于微信小程序的电商平台+LW示例参考
1.项目介绍 系统角色:管理员、普通用户功能模块:管理员(用户管理、商品分类、商品管理、订单管理、系统管理等),普通用户(个人中心、收藏、我的订单、查看商品等)技术选型:SpringBo…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...



