【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…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...



