五子棋小游戏(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;
			}
			else
			    cout << "该点已经下过,请您重新下谢谢" << 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;
			}
			else
			    cout << "该点已经下过,请您重新下谢谢" << 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;
			}
			else
			    cout << "该点已经下过,请您重新下谢谢" << 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;
			}
			else
			    cout << "该点已经下过,请您重新下谢谢" << 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;	
}

 

  • 运行结果

 

  • 结果分析与结论

这套程序有很多不足的地方

  1. 棋盘的画法不够美观,可以利用Turbo c的图形库画图
  2. 电脑下棋不够难度,随机性强,可以通过DFS判断当连通性为3的情况进行补位
  3. 判断胜利不够高效,时间复杂度很高,n^2的递归暴搜非常慢

可以适当的利用graphics.h以及conio.h头文件画图并加入一些更为高效的算法优化判断

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt/QML编程之路:基于QWidget编程及各种2D/3D/PIC绘制的示例(45)

关于使用GWidget,这里有一个示例,看了之后很多图形绘制,控件使用,及最基本的QWidget编程都比较清楚了。ui的绘制: 运行后的界面如 工程中有非常丰富的关于各种图形的绘制,比如上图中circle,还有image。有下面一段readme的说明: # EasyQPainter Various operation pra…

容量治理三板斧:扩容、限流与降级

前言 随着现代软件系统日益复杂和用户规模的不断增长&#xff0c;分布式架构成为了保持系统高可用性与高性能的标准解决方案。然而&#xff0c;随之而来的是对系统容量治理的新挑战。在这样的背景下&#xff0c;容量治理成为了分布式系统设计和运维中不可或缺的一环。要确保系…

Java毕业设计 基于SpringBoot vue学科竞赛项目管理系统

Java毕业设计 基于SpringBoot vue学科竞赛项目管理系统 SpringBoot vue 学科竞赛项目管理系统 功能介绍 学生&#xff1a;登录 验证码 首页推广 图片轮播 竞赛通知 我的比赛队伍 组队招募 获奖通告 系统公告 统计分析 修改密码 修改个人信息 投诉建议 教师&#xff1a;登录 …

腾讯云和阿里云4核8G云服务器多少钱一年和1个月费用对比

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

以某厂商方案为例,讲一下如何手工配置传统网络到SD-WAN网络的改造实施

正文共&#xff1a;1024 字 8 图&#xff0c;预估阅读时间&#xff1a;3 分钟 假设有这样一张网络&#xff0c;其中RTA和PCA表示某公司的A分支&#xff0c;通过中国电信CT路由器接入互联网ISP&#xff1b;RTB和PCB表示某公司的B分支&#xff0c;通过中国联通CU路由器接入互联网…

【webrtc】m122:PacingController 源码阅读

PacingController 关系与BitrateProber 关系更为密切PacingController 内置BitrateProber G:\CDN\signalapp_webrtc\modules\pacing\pacing_controller.hPacingControllerBitrateProber prober_;PacingController 关系与BitrateProber 关系更为密切,在整个系统中的地位也更重要…

ssm+vue的高校课程评价系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的高校课程评价系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

大语言模型系列-GPT-2

文章目录 前言一、GPT-2做的改进二、GPT-2的表现总结 前言 《Language Models are Unsupervised Multitask Learners&#xff0c;2019》 前文提到&#xff0c;GPT-1利用不同的模型结构微调初步解决了多任务学习的问题&#xff0c;但是仍然是预训练微调的形式&#xff0c;GPT-…

防御保护--IPSec VPN实验

防御保护--IPsec VPN实验 一、实验需求二、配置IP地址三、配置IPSec通道四、配置NAT策略4.1 配置NAT策略4.2 配置服务器映射 五、配置安全策略5.1 查看IKE协商是否建立&#xff1a; 六、配置静态路由七、测试 一、实验需求 基础配置和实验步骤可参考&#xff1a; 防御保护–防…

设计模式前置了解uml图

在开发前&#xff0c;会进行系统的设计&#xff0c;而数据模型的设计大多通过 UML 类图实现。为了在 UML 类图中清晰地表达类之间的关系&#xff0c;需要对类之间的关系有一定的认识&#xff0c;并且了解相关的表达符号。 类之间的关系有以下几种&#xff1a; 组合 聚合 关联…

202012青少年软件编程(图形化) 等级考试试卷(一级)

青少年软件编程(图形化) 等级考试试卷(一级)2020年12月 第1题:【 单选题】 下面哪个区域是“舞台区” ?( ) A:A B:B C:C D:D 【正确答案】: B 【试题解析】 : 第2题:【 单选题】 下图为小猫的初始方向, 哪个积木可以让小猫面向正右方?( ) A: B: C:…

【Linux基础(三)】信号

学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal &#xff08;无参信号&#xff09;示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…

云服务器2核4G配置,阿里云和腾讯云哪个便宜?性能更好?

租用2核4G服务器费用多少&#xff1f;2核4G云服务器多少钱一年&#xff1f;1个月费用多少&#xff1f;阿里云2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年&#xff1b;腾讯云轻量2核4G服务器5M带宽165元一年、252元15个月、540元三…

【Stable Diffusion】入门:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

蓝桥杯2019年第十届省赛真题-修改数组

查重类题目&#xff0c;想到用标记数组记录是否出现过 但是最坏情况下可能会从头找到小尾巴&#xff0c;时间复杂度O(n2)&#xff0c;数据范围106显然超时 再细看下题目&#xff0c;我们重复进行了寻找是否出现过&#xff0c;干脆把每个元素出现过的次数k记录下来&#xff0c;直…

C++:2024/3/11

作业1&#xff1a;编程 要求&#xff1a;提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 代码&#xff1a; #include <iostream>using namespace std;int main() {//定义一个字符串string str;//提示输入字符串…

【计算机网络】1.5 分组交换网中的时延、丢包和吞吐量

A.分组交换网中的时延 当分组从一个节点沿着路径到后一节点时&#xff0c;该分组在沿途的各个节点经受了几种不同类型的时延。 时延的类型 处理时延 - d n o d a l d_{nodal} dnodal​ 处理时延包括以下部分—— a. 检查分组首部 b. 决定分组导向 排队时延 - d p r o c d_{…

华为OD机试 - 垃圾信息拦截(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

选择短信群发平台要小心陷阱

你知道短信群发平台也有陷阱吗&#xff1f;选择短信群发平台很重要&#xff0c;今天小编就为您介绍短信群发平台有哪些陷阱&#xff1f; 这几点你要注意了&#xff1a; 1、扣量&#xff0c;有些不靠谱的短信群发平台开始以低价诱惑“客户”&#xff0c;但是发送过程中就暗中扣…

【前端寻宝之路】学习和使用CSS的所有选择器

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-blSAMs8NTfBKaPl8 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…