五子棋小游戏(sut实验报告)
- 实验目的
实现人与人或人与电脑进行五子棋对弈
- 实验内容
启动游戏,显示游戏参数设置界面,用户输入参数后进入游戏界面,显示棋盘及双方博弈过程,游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏,可选择继续下一局或者退出游戏。
- 分析与设计
设计棋盘:使用for循环的嵌套并定义一个二维数组存储棋子
void create_board(char board[N][N] , int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){cout << ' ' << board[i][j] << ' ';//" %c "if(j < n - 1)cout << '|';}cout << endl;if(i < n - 1){for(int j = 0;j < n;j++){cout << "---";if(j < n - 1)cout << '|';}}cout << endl;}
}
下棋:下棋是有先后顺序,为了保持顺序以及判断是否胜利,定义一个game函数来设置下棋流程。下棋者可以是人也可以是电脑,先对人下棋设置一个函数play_game和play_game_2,来定义双方下棋的位置与不同棋子,
//玩家下棋
bool play_game(char board[N][N] , int n)
{int x,y;cout << "请玩家1下棋->" << endl;while(1){cin >> x >> y;if(x >= 0 && x < n && y >= 0 && y < n){if(board[x][y] == ' '){board[x][y] = '*';return check_game(board,n);break;}elsecout << "该点已经下过,请您重新下谢谢" << endl;}else{cout << "坐标越界,请重新输入" << endl;} }
}
bool play_game_2(char board[N][N] , int n)
{int x,y;cout << "请玩家2下棋->" << endl;while(1){cin >> x >> y;if(x >= 0 && x < n && y >= 0 && y < n){if(board[x][y] == ' '){board[x][y] = '#';return check_game(board,n);break;}elsecout << "该点已经下过,请您重新下谢谢" << endl;}else{cout << "坐标越界,请重新输入" << endl;} }
}
而电脑下棋就定义一个种子srand使电脑随机性下棋。
//电脑下棋
bool computer_game(char board[N][N],int n)
{srand((unsigned int)time(NULL)); //设置随机生成的数字cout << "电脑1下棋->";int x,y;while(1){x = rand() % n;y = rand() % n;if(board[x][y] == ' '){board[x][y] = '#';cout << x << ',' << y << endl;return check_game(board,n);break;} }
}
判断胜利:五子棋胜利条件是五个子横着竖着斜着相连,这个时候就要判断其连通性,判断连通性最好办法就是使用DFS,首先利用两个for循环嵌套遍历当前board数组,随后对四个可能的联通方向通过DFS递归探索,如果五子确实相连,这个时候返回true,不相连则返回false。
//判断是否胜利
int dx[N] = { 1, 1, 0, 1 };
int dy[N] = { 0, 1, 1,-1 };
//判断直线是否能走
bool dfs(int x,int y,char a,int i,int res)
{if(board[x][y] != a)//五个子不全连return false;else if(res == 5) return true; //五个子全连return dfs(x + dx[i], y + dy[i],a,i,res+1);
}
//遍历四种途径
bool check(char board[N][N],int x,int y)
{ for(int i = 0;i <= 3;i++)//四种胜利的路径判断一遍{if(dfs(x,y,board[x][y],i,1) == true){return true;}}return false;
}
bool check_game(char board[N][N],int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(board[i][j] != ' ')if(check(board,i,j) == true)return true;}}return false;
}
最后主函数利用while循环的嵌套判断玩家选择方式,如果其输入错误的数字,那么就会循环,直到输入正确。
另外这里也需要判断是否棋盘全满:
//判断棋盘是否填满
bool is_full(char board[N][N],int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(board[i][j] == ' '){return false;}}}return true;
}
完整代码如下:
#include <iostream>
#include <time.h>
using namespace std;
const int N = 100;
char board[N][N];
void menu()
{cout << "*******************************" << endl;cout << "************menu***************" << endl;cout << "**(请输入对应的数字进行选择)***" << endl;cout << "*********1.玩家对弈************" << endl;cout << "*********2.电脑下棋************" << endl;cout << "*********3.结束游戏************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;}
void choose()
{cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "******请玩家输入棋盘大小*******" << endl;cout << "*********(注:6-100)************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;
}
void win_1()
{cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "********恭喜玩家1胜利**********" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;
}
void win_2()
{cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "********恭喜玩家2胜利**********" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;
}
void win_computer()
{cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "***********电脑胜利************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;
}
void choose_3()
{cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*************BYE***************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;
}
void end()
{cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******是否重新开始游戏********" << endl;cout << "*********1.continue************" << endl;cout << "***********2.end***************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;cout << "*******************************" << endl;
}
//初始化棋盘
void error_board(char board[N][N] , int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){board[i][j] = ' ';}}
}
//创建棋盘
void create_board(char board[N][N] , int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){cout << ' ' << board[i][j] << ' ';//" %c "if(j < n - 1)cout << '|';}cout << endl;if(i < n - 1){for(int j = 0;j < n;j++){cout << "---";if(j < n - 1)cout << '|';}}cout << endl;}
}//判断是否胜利
int dx[N] = { 1, 1, 0, 1 };
int dy[N] = { 0, 1, 1,-1 };
//判断直线是否能走
bool dfs(int x,int y,char a,int i,int res)
{if(board[x][y] != a)//五个子不全连return false;else if(res == 5) return true; //五个子全连return dfs(x + dx[i], y + dy[i],a,i,res+1);
}
//遍历四种途径
bool check(char board[N][N],int x,int y)
{ for(int i = 0;i <= 3;i++)//四种胜利的路径判断一遍{if(dfs(x,y,board[x][y],i,1) == true){return true;}}return false;
}
bool check_game(char board[N][N],int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(board[i][j] != ' ')if(check(board,i,j) == true)return true;}}return false;
}
//玩家下棋
bool play_game(char board[N][N] , int n)
{int x,y;cout << "请玩家1下棋->" << endl;while(1){cin >> x >> y;if(x >= 0 && x < n && y >= 0 && y < n){if(board[x][y] == ' '){board[x][y] = '*';return check_game(board,n);break;}elsecout << "该点已经下过,请您重新下谢谢" << endl;}else{cout << "坐标越界,请重新输入" << endl;} }
}
bool play_game_2(char board[N][N] , int n)
{int x,y;cout << "请玩家2下棋->" << endl;while(1){cin >> x >> y;if(x >= 0 && x < n && y >= 0 && y < n){if(board[x][y] == ' '){board[x][y] = '#';return check_game(board,n);break;}elsecout << "该点已经下过,请您重新下谢谢" << endl;}else{cout << "坐标越界,请重新输入" << endl;} }
}
//电脑下棋
bool computer_game(char board[N][N],int n)
{srand((unsigned int)time(NULL)); //设置随机生成的数字cout << "电脑1下棋->";int x,y;while(1){x = rand() % n;y = rand() % n;if(board[x][y] == ' '){board[x][y] = '#';cout << x << ',' << y << endl;return check_game(board,n);break;} }
}
//判断棋盘是否填满
bool is_full(char board[N][N],int n)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(board[i][j] == ' '){return false;}}}return true;
}
void game_1(char board[N][N] , int n)
{bool res = false;//初始化棋盘error_board(board,n);//初始化create_board(board,n);//打印棋盘//下棋while(1){res = play_game(board,n);//玩家下棋create_board(board,n);//打印棋盘if(res == true){create_board(board,n);win_1();break; } res = play_game_2(board,n);//电脑下棋create_board(board,n);//打印棋盘if(res == true){create_board(board,n);win_2();break;}else if(is_full(board,n)){cout << "棋盘已经被填满,本局平局" << endl;break;}}
}
//游戏流程循环
void game_2(char board[N][N] , int n)
{bool res = false;//初始化棋盘error_board(board,n);//初始化create_board(board,n);//打印棋盘//下棋while(1){cout << "请在0-n之间输入数据" << endl;res = play_game(board,n);//玩家下棋create_board(board,n);//打印棋盘if(res == true){create_board(board,n);win_1();break; } res = computer_game(board,n);//电脑下棋create_board(board,n);//打印棋盘if(res == true){create_board(board,n);win_computer();break;}else if(is_full(board,n)){cout << "棋盘已经被填满,本局平局" << endl;break;}}
}
int main()
{menu();while(1){int a;int res;cin >> a;//输入模式if(a == 1)//玩家对弈{while(1){choose();int n;cin >> n;if(n < 6 || n > 100){cout << "请重新输入棋盘大小" << endl;}else{game_1(board,n);end();int res;cin >> res;if(res == 2)break;} } if(res == 2){choose_3();break;}}else if(a == 2)//电脑对弈{while(1){choose();int n;cin >> n;if(n < 6 || n > 100){cout << "请重新输入棋盘大小" << endl;}else{game_2(board,n);end();cin >> res;if(res == 2)break; } } if(res == 2){choose_3();break;}}else if(a == 3)//退出{choose_3();break;}else {cout << "不满足,请重新输入" << endl;}}return 0;
}
- 运行结果



- 结果分析与结论
这套程序有很多不足的地方
- 棋盘的画法不够美观,可以利用Turbo c的图形库画图
- 电脑下棋不够难度,随机性强,可以通过DFS判断当连通性为3的情况进行补位
- 判断胜利不够高效,时间复杂度很高,n^2的递归暴搜非常慢
可以适当的利用graphics.h以及conio.h头文件画图并加入一些更为高效的算法优化判断
相关文章:
五子棋小游戏(sut实验报告)
实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏,显示游戏参数设置界面,用户输入参数后进入游戏界面,显示棋盘及双方博弈过程,游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏,可选择继续下…...
图像超分辨率算法ESRGAN原理及应用
前言 图像超分辨率算法是一种用于增加图像分辨率的算法,与传统的图像缩放算法不同的是,超分算法在放大图像的同时根据原图纹理生成更多细节,确保图像在放大后仍然有清晰的纹理细节。 一、模型简介 1、模型开源地址 GitHub - xinntao/ESRGAN: ECCV18 Workshops - Enhance…...
excel 动态列导出
excel动态列,只好用poi来写了,也并不复杂,一样就这个件事情抽像为几步,就是套路了,开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样,可以参考excel导出标准化 2 自定义SheetWriteHandler …...
Java零基础入门到精通_Day 1
01 Java 语言发展史 Java语言是美国Sun公司(StanfordUniversity Network)在1995年推出的 计算机语言Java之父:詹姆斯高斯林(ames Gosling) 重要的版本过度: 2004年 Java 5.0 2014年 Java 8.0 2018年 9月 Java 11.0 (目前所使用的) 02 J…...
Spring Cloud集成nacos配置中心
1.添加Nacos Config依赖 打开nacos-config-demo的pom.xml文件并添加以下两个依赖项 项目的配置文件中通常包括数据库连接配置项、日志输出配置项、Redis连接配置项、服务注册配置项等内容,如spring-cloud-alibaba-nacos-config-base-demo项目中就包含数据库连接配置…...
【AI视频教程】只需5步,AI作出鸡你太美视频
1.视频效果 2.准备工作 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境剪辑一段【鸡你太美】原版视频stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 这里还是建议大家用云平台部署stable diffusion&am…...
C# OpenCvSharp DNN FreeYOLO 密集行人检测
目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 密集行人检测 效果 模型信息 Inputs ------------------------- name:input tensor:Float[1, 3, 192, 320] --------------------------------------------------------------- …...
一次HW红初面试
一、描述外网打点的流程? 靶标确认、信息收集、漏洞探测、漏洞利用、权限获取。最终的目的是获取靶标的系统权限/关键数据。 在这个过程中,信息收集最为重要。掌握靶标情报越多,后续就会有更多的攻击方式去打点。比如:钓鱼邮件、…...
网络攻防中nginx安全配置,让木马上传后不能执行、让木马执行后看不到非网站目录文件、命令执行后权限不能过高
网络攻防中nginx安全配置,让木马上传后不能执行、让木马执行后看不到非网站目录文件、命令执行后权限不能过高。 0x01 Nginx介绍 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。nginx一般是把请求发…...
ctfshow web入门 php特性 web146-web150
1.web146 :被过滤了,三元运算符用不了,还可以用位运算符,逻辑运算符,等,逻辑运算符要注意或运算符的短路性 eval(return 1|phpinfo()|1) eval(return 1phpinfo()|1) payload: v11&v20&v3(~%8C%86%8C%8B%9A%92…...
Linux:kubernetes(k8s)prestop事件的使用(10)
他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据,用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…...
vue2【详解】生命周期(含父子组件的生命周期顺序)
1——beforeCreate:在内存中创建出vue实例,数据观测 (data observer) 和 event/watcher 事件配置还没调用(data 和 methods 属性还没初始化) 【执行数据观测 (data observer) 和 event/watcher 事件配置】 2——created…...
C++基础语法和概念
基本语法和数据类型 C 是一种高性能的编程语言,允许程序员对内存管理进行精细控制。了解 C 的基本语法和数据类型是学习这门语言的第一步。以下是一些基础概念的详细介绍: 基本语法 程序结构 一个基础的 C 程序通常包括一个或多个头文件引用、一个 m…...
Vue.js+SpringBoot开发海南旅游景点推荐系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统ÿ…...
mysql笔记:11. 性能优化
文章目录 概览查询速度优化1. 分析查询语句1.1 EXPLAIN1.2 DESCRIBE 2. 使用索引优化查询3. 优化子查询 数据库结构优化1. 分解表2. 建立中间表3. 增加冗余字段4. 优化插入速度4.1. MyISAM引擎表4.2. InnoDB引擎表 5. 分析表、检查表和优化表5.1. 分析表5.2. 检查表5.3. 优化表…...
基于Docker搭建Maven私服仓库(Linux)详细教程
文章目录 1. 下载镜像并启动容器2. 配置Nexus3. 配置本地Maven仓库 1. 下载镜像并启动容器 下载Nexus3镜像 docker pull sonatype/nexus3查看Nexus3镜像是否下载成功 docker images创建Nexus3的挂载文件夹 mkdir /usr/local/nexus-data && chown -R 200 /usr/local…...
IPSEC VPPN 实验
背景:FW1和FW2为双机热备 要求:在FW5和FW3之间建立一条IPSEC通道,保证10.0.2.0/24网段可以正常访问到192.168.1.0/24IPSEC VPPN实验配置 fw2配置 加密数据流 新建对应IKE...
基于单片机的视觉导航小车设计
目 录 摘 要 I Abstract II 引 言 1 1 总体方案设计 3 1.1 方案论证 3 1.2 项目总体设计 3 2 项目硬件设计 4 2.1 主控模块设计 4 2.1.1单片机选型 4 2.1.2 STM32F103RCT6芯片 4 2.2单片机最小系统电路 5 2.3电机驱动模块设计 7 2.4红外模块设计 8 2.5红外遥控模块设计 9 2.6超…...
Autosar教程-Mcal教程-GPT配置教程
3.3GPT配置、生成 3.3.1 GPT配置所需要的元素 GPT实际上就是硬件定时器,需要配置的元素有: 1)定时器时钟:定时器要工作需要使能它的时钟源 2)定时器分步:时钟源进到定时器后可以通过分频后再给到定时器 定时器模块选择:MCU有多个定时器模块,需要决定使用哪个定时器模块作…...
力扣--动态规划5.最长回文子串
class Solution { public:string longestPalindrome(string s) {// 获取输入字符串的长度int n s.size();// 如果字符串长度为1,直接返回原字符串,因为任何单个字符都是回文串if (n 1)return s;// 创建一个二维数组dp,用于记录子串是否为回…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
