13 c++版本的五子棋

这篇具有很好参考价值的文章主要介绍了13 c++版本的五子棋。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

呵呵 这大概是 大学里面的 c++ 五子棋了吧 

有一些 面向对象的理解, 但是不多 

这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 

然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 

 文章来源地址https://www.toymoban.com/news/detail-859385.html

 

五子棋

#include<Windows.h>
#include<iostream>
#include<ctime>
using namespace std;
#define N 15
void setCursor(int x,int y);

class FIR
{
private:
	int tot;
	int a[N][N];	//状态矩阵
	int attacklevel[N][N];	//攻击优先级
	int defenselevel[N][N];	//防御优先级
	int max;	//攻击优先级+防御优先级的最大值
	int maxattack;	//最大攻击优先级
	int maxdefense;	//最大防御优先级
	int have41,have42,have32;	//人方是否有下一子成五子;电脑方是否有下一子成五子;电脑方是否有下一子成四子;
	int r,c,su,sd;	//横竖斜捺连续的子数
	int power4(int );	//4的N次方(计算优先级)
  	int spacerow(int ,int ,int );	//横向优先级
	int spacecolumn(int ,int ,int );	//竖向优先级
	int spaceslopeup(int ,int ,int ); 	//斜向优先级
	int spaceslopedown(int ,int ,int );	//捺向优先级

public:
	int steps;	//定位光标的”步数“
	int x,y;	//走子的坐标
	FIR()
	{
		memset(a,0,sizeof(a));
		memset(attacklevel,0,sizeof(attacklevel));
		memset(defenselevel,0,sizeof(defenselevel));
		steps=0;tot=-1;maxattack=0;maxdefense=0;x=0;y=0;
		have41=0;have42=0;have32=0;
		r=0;c=0;su=0;sd=0;max=0;
	}
	void setmap();	//打印棋桌
	int play(int ,int ,int );	//下子
	int check(int ,int ,int );	//检查
	void analysis(int );	//分析,优先级,最大功防……
	void compute(int );	//计算走子
	void print();	//打印状态矩阵

};

int main()
{
	FIR fir;
	int x,y;
	int flag=0,flag2=0;
	fir.setmap();
	while(true)
	{
		do{
		setCursor(40,fir.steps);
		cout<<"player1 :please input x AND y:";
		cin>>x>>y;
		flag=fir.play(x-1,y-1,1);
		if(flag)
		{
		if(fir.check(x-1,y-1,1))
		{	flag2=1;
			setCursor(32,fir.steps);
			cout<<"congratuations you win !"<<endl;
			break;
		}
		}
		}while(flag==0);
		if(flag2)	break;


		
		setCursor(40,fir.steps);
		cout<<"computer :";
		fir.analysis(2);
		fir.compute(2);
		fir.play(fir.x,fir.y,2);
		if(fir.check(fir.x,fir.y,2))
		{
			flag2=1;
			setCursor(32,fir.steps);
			cout<<"you lost please practice."<<endl;
			break;
		}




		/*
		do{
		setCursor(0,20+fir.steps);
		cout<<"player2 :please input x AND y:";
		cin>>x>>y;
		flag=fir.play(x,y,2);
		if(flag)
		{
		if(fir.check(x-1,y-1))
		{	flag2=1;
			setCursor(0,21+fir.steps);
			cout<<"congratuations. you win !"<<endl;
			break;
		}
		}
	}while(flag==0);
  */

		if(flag2)	break;
	}
setCursor(40,1+fir.steps);
fir.print();
	return 0;
}

void setCursor(int x,int y)	//定位光标
{
	HANDLE handle;
	handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD location;
	location.X=x;
	location.Y=y;
	SetConsoleCursorPosition(handle,location);
}

//┏  ┓  ┗  ┛ ┣  ┫  ┳  ┻  ╋  ⊙  ●
void FIR::setmap()		//画出“棋盘”
{
	cout<<endl<<"  FIVE IN A ROW ";
	int i,j;
	setCursor(2,5);
	cout<<"┏";
	for(i=1;i<=N-2;i++)
		cout<<"┳";
	cout<<"┓";
	
	for(i=1;i<=N-2;i++)
	{setCursor(2,i+5);
		cout<<"┣";
		for(j=0;j<N-2;j++)
			cout<<"╋";
		cout<<"┫"<<endl;
	}
	cout<<"  ┗";
		for(i=0;i<N-2;i++)
			cout<<"┻";
		cout<<"┛";


	for(i=1;i<=N;i++)
	{
		setCursor(0,i+4);
		cout<<i;
		setCursor(i*2,3);
		if(i>=10)	cout<<i/10;
		else cout<<i;
		setCursor(i*2,4);
		if(i>=10)	cout<<i%10;
	}
}

int FIR::play(int x,int y,int k)	//落子
{
	if(x<0 || y<0 || x>=N || y>=N || a[x][y]!=0)
	{
		setCursor(35,1+steps);
		cout<<"your input is error, please input int again."<<endl;
		steps=steps+2;
		return 0;
	}
	else
	{
		setCursor(2*(y+1),x+5);
		if(k==1)
		{a[x][y]=1;
		cout<<"⊙";
		}
		else if(k==2)
		{a[x][y]=2;
		cout<<"●";
		}
		else cout<<"k is error."<<endl;
		steps++;
		return 1;
	}
}

int FIR::check(int x,int y,int k)		//检查是否有五子
{
	spacerow(x,y,k);spacecolumn(x,y,k);spaceslopeup(x,y,k);spaceslopedown(x,y,k);
	if(r>4||c>4||su>4||sd>4)
		return 1;
	else return 0;
}

int FIR::power4(int n)
{
	int sum=4;
	if(n==0)
		sum=1;
	else
	for(int i=1;i<n;i++)
		sum*=4;
	return sum;
}

int FIR::spacerow(int x,int y,int k)	//行的优先级
{
	tot=1;
	int _x=x,_y=y-1,_y2;
	while(_y>=0 && a[_x][_y]==k )
	{
		tot++;
		_y--;
	}
	_y2=_y;
	_x=x;_y=y+1;
	while(_y<N && a[_x][_y]==k)
	{
		tot++;
		_y++;
	}
	r=tot;
	if(_y2>=0 && _y<N)
	{
	if(a[_x][_y2]==2/k && a[_x][_y]==2/k)
		tot=0;
	else if(a[_x][_y2]==0 && a[_x][_y]==0)
		tot=power4(tot);
	else tot=power4(tot-1);
	}
	else tot=power4(tot-1);

	return tot;	
}

int FIR::spacecolumn(int x,int y,int k)		//列的优先级
{
	tot=1;
	int _x=x-1,_y=y,_x2;
	while(_x>=0 && a[_x][_y]==k )
	{
		tot++;
		_x--;
	}
	_x2=_x;
	_x=x+1;_y=y;
	while(_x<N && a[_x][_y]==k)
	{
		tot++;
		_x++;
	}
	c=tot;
	if(_x2>=0 && _x<N)
	{
	if(a[_x2][_y]==2/k && a[_x][_y]==2/k)
		tot=0;
	else if(a[_x2][_y]==0 && a[_x][_y]==0)
		tot=power4(tot);
	else tot=power4(tot-1);
	}
	else tot=power4(tot-1);

	return tot;	
}

int FIR::spaceslopeup(int x,int y,int k)	//斜上的优先级
{
	tot=1;
	int _x=x+1,_y=y-1,_x2,_y2;
	while(_x<N && _y>=0 && a[_x][_y]==k )
	{
		tot++;
		_x++;
		_y--;
	}
	_x2=_x;_y2=y;
	_x=x-1;_y=y+1;
	while(_x>=0 && _y<N && a[_x][_y]==k)
	{
		tot++;
		_x--;
		_y++;
	}
	su=tot;
	if(_x2<N && _y2>=0 && _x>=0 &&_y<N)
	{
	if(a[_x2][_y2]==2/k && a[_x][_y]==2/k)
		tot=0;
	else if(a[_x2][_y2]==0 && a[_x][_y]==0)		
		tot=power4(tot);
	else tot=power4(tot-1);
	}
	else tot=power4(tot-1);

	return tot;	
}

int FIR::spaceslopedown(int x,int y,int k)	//斜下的优先级
{
	tot=1;
	int _x=x-1,_y=y-1,_x2,_y2;
	while(_x<N && _y>=0 && a[_x][_y]==k )
	{
		tot++;
		_x--;
		_y--;
	}
	_x2=_x;_y2=y;
	_x=x+1;_y=y+1;
	while(_x>=0 && _y<N && a[_x][_y]==k)
	{
		tot++;
		_x++;
		_y++;
	}
	sd=tot;
	if(_x2>=0 && _y2>=0 && _x<N &&_y<N)
	{
	if(a[_x2][_y2]==2/k && a[_x][_y]==2/k)
		tot=0;
	else if(a[_x2][_y2]==0 && a[_x][_y]==0)
		tot=power4(tot);
	else tot=power4(tot-1);
	}
	else tot=power4(tot-1);

	return tot;	
}


void FIR::analysis(int k)		//分析每个空格的优先级(横,竖,正斜,反斜 优先级之和),并计算最高的优先级
{
	maxattack=0;maxdefense=0;
	int att[4],def[4];
	for(int i=0;i<N;i++)
	{	
		for(int j=0;j<N ;j++)
		{
			if(a[i][j]==0)
			{
			attacklevel[i][j]=spacerow(i,j,k)+spacecolumn(i,j,k)+spaceslopeup(i,j,k)+spaceslopedown(i,j,k);
			att[0]=r;att[1]=c;att[2]=su;att[3]=sd;
			if(att[0]==5 || att[1]==5 || att[2]==5 || att[3]==5)	have42=1;
			if(att[0]==4 || att[1]==4 || att[2]==4 || att[3]==4)	have32=1;
			if(maxattack<attacklevel[i][j])		maxattack=attacklevel[i][j];
			defenselevel[i][j]=spacerow(i,j,2/k)+spacecolumn(i,j,2/k)+spaceslopeup(i,j,2/k)+spaceslopedown(i,j,2/k);
			def[0]=r;def[1]=c;def[2]=su;def[3]=sd;
			if(maxdefense<defenselevel[i][j])		maxdefense=defenselevel[i][j];	
			if(def[0]==5 || def[1]==5 || def[2]==5 || def[3]==5)	have41=1;
			}
		}cout<<endl;
	}		
}

void FIR::compute(int k)		//计算……,有多个优先级最高且相同的随机取一个
{
	int i,j,block=256;
	srand((int)time(NULL));
	setCursor(50,steps);

	if(maxdefense>=block)
	{
		if(have42==1)
		{
			for(i=0;i<N;i++)
				for(j=0;j<N;j++)
					if(attacklevel[i][j]==maxattack)
					{
						cout<<i+1<<" "<<j+1<<endl;
						x=i;y=j;
						memset(attacklevel,0,sizeof(attacklevel));
						memset(defenselevel,0,sizeof(defenselevel));
						return ;
					}

		}
		
		else if(have41==1)
		{
		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
				if(defenselevel[i][j]>=block)
					if(attacklevel[i][j]+defenselevel[i][j]>max)
						max=attacklevel[i][j]+defenselevel[i][j];

		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
			{	if(defenselevel[i][j]>=block)
				if(attacklevel[i][j]+defenselevel[i][j]==max)
				{
						cout<<i+1<<" "<<j+1<<endl;
						x=i;y=j;
						max=0;
						memset(attacklevel,0,sizeof(attacklevel));
						memset(defenselevel,0,sizeof(defenselevel));
						return ;
				}
			}
		}
		/*
		else if(have31==1)
		{
		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
				//if(attacklevel[i][j]>=block)
					if(attacklevel[i][j]+defenselevel[i][j]>max)
						max=attacklevel[i][j]+defenselevel[i][j];

		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
			{	//if(attacklevel[i][j]>=block)
				if(attacklevel[i][j]+defenselevel[i][j]==max)
				{
						cout<<i+1<<" "<<j+1<<endl;
						x=i;y=j;
						max=0;
						memset(attacklevel,0,sizeof(attacklevel));
						memset(defenselevel,0,sizeof(defenselevel));
						return ;
				}
			}
		}
*/
		else
		{
		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
				if(defenselevel[i][j]>=block)
					if(attacklevel[i][j]+defenselevel[i][j]>max)
						max=attacklevel[i][j]+defenselevel[i][j];

		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
			{	if(defenselevel[i][j]>=block)
				if(attacklevel[i][j]+defenselevel[i][j]==max)
				{
						cout<<i+1<<" "<<j+1<<endl;
						x=i;y=j;
						max=0;
						memset(attacklevel,0,sizeof(attacklevel));
						memset(defenselevel,0,sizeof(defenselevel));
						return ;
				}
			}
		}
}

		
	else if(maxattack>maxdefense)
	{
		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
				if(attacklevel[i][j]==maxattack)
					if(attacklevel[i][j]+defenselevel[i][j]>max)
						max=attacklevel[i][j]+defenselevel[i][j];

		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
			{	if(attacklevel[i][j]==maxattack)
				if(attacklevel[i][j]+defenselevel[i][j]==max)
				{
						cout<<i+1<<" "<<j+1<<endl;
						x=i;y=j;
						max=0;
						memset(attacklevel,0,sizeof(attacklevel));
						memset(defenselevel,0,sizeof(defenselevel));
						return ;
				}
			}
	}
	else
	{
		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
				if(defenselevel[i][j]==maxdefense)
					if(attacklevel[i][j]+defenselevel[i][j]>max)
						max=attacklevel[i][j]+defenselevel[i][j];

		for(i=0;i<N;i++)
			for(j=0;j<N;j++)
			{	if(defenselevel[i][j]==maxdefense)
				if(attacklevel[i][j]+defenselevel[i][j]==max)
				{
						cout<<i+1<<" "<<j+1<<endl;
						x=i;y=j;
						max=0;
						memset(attacklevel,0,sizeof(attacklevel));
						memset(defenselevel,0,sizeof(defenselevel));
						return ;
				}
			}
	}
}

void FIR::print()	//打印最后的数字结果
{
		for(int i=0;i<N;i++)
		{
		setCursor(40,1+steps+i);
			for(int j=0;j<N;j++)
				cout<<a[i][j]<<" ";
			cout<<endl;
		}
}



/*
	int row(int ,int ,int );
	int column(int ,int ,int );
	int slopeup(int ,int ,int );
	int slopedown(int ,int ,int );



int FIR::row(int x,int y,int k)	//判断行
{
	tot=1;
	int _x=x,_y=y-1;
	while(_y>=0 && a[_x][_y]==k)
	{
		tot++;
		_y--;
	}
	_x=x,_y=y+1;
	while(_y<N && a[_x][_y]==k)
	{
		tot++;
		_y++;
	}
	return tot;
}

int FIR::column(int x,int y,int k)	//判断列
{
	tot=1;
	int _x=x-1,_y=y;
	while(_x>=0 && a[_x][_y]==k)
	{
		tot++;
		_x--;
	}
	_x=x+1,_y=y;
	while(_x<N && a[_x][_y]==k)
	{
		tot++;
		_x++;
	}
	return tot;
}

int FIR::slopeup(int x,int y,int k)	//判断正斜
{
	tot=1;
	int _x=x-1,_y=y+1;
	while( _x>=0 && _y<N && a[_x][_y]==k)
	{
		tot++;
		_x--;
		_y++;
	}
	_x=x+1,_y=y-1;
	while(_x<N && _y>=0  && a[_x][_y]==k)
	{
		tot++;
		_x++;
		_y--;
	}
	return tot;
}

int FIR::slopedown(int x,int y,int k)		//判断反斜
{
	tot=1;
	int _x=x-1,_y=y-1;
	while(_x>=0 && _y>=0 && a[_x][_y]==k)
	{
		tot++;
		_x--;
		_y--;
	}
	_x=x+1,_y=y+1;
	while(_x<N  && _y<N && a[_x][_y]==k)
	{
		tot++;
		_x++;
		_y++;
	}
	return tot;
}
*/







 

 

程序截图

这个在 win10 上面执行 貌似 渲染是存在问题的, 需要调整 

13 c++版本的五子棋,01 游戏,c++,game,five

 

 

正常执行

13 c++版本的五子棋,01 游戏,c++,game,five

 

 

 

 

 

到了这里,关于13 c++版本的五子棋的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python小游戏:五子棋

    今天主要介绍一下python实现五子棋小游戏,使用pygame模块编写一个五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 然后呢上面代码的运行结果如下: 背景是白色的,当然我们常见的棋盘应该是棕黄色的,于是我们查找颜

    2024年02月09日
    浏览(48)
  • 五子棋AI算法和开局定式(直指13式)破解

    五子棋AI算法和开局定式( 直指13式 )破解 先前发了几篇五子棋游戏程序设计的博文,设计了游戏程序,也设计了AI智能奕棋的算法,运行程序检测算法的可行性,完成人机模式游戏功能的设置。这还不够,还要提高算法的实战水平。 对于人机对战的电脑智能应子算法,参阅

    2024年02月20日
    浏览(40)
  • 前端技术搭建五子棋游戏(内含源码)

    上周我们实通过前端基础实现了拼图游戏,今天还是继续按照我们原定的节奏来带领大家完成一个五子棋游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是

    2024年02月12日
    浏览(60)
  • 五子棋游戏AI智能算法设计

    五子棋游戏C语言AI智能算法设计  近来发现编制五子棋游戏很有趣,尤其是AI智能算法很烧脑。网上介绍有什么贪心算法,剪枝算法,博弈树算法等等,不一而足。 对于人机对战的电脑智能应子算法,参阅很多五子棋书籍棋谱和五子棋竞赛的对抗棋谱。我感到白棋的后手防御

    2024年02月06日
    浏览(48)
  • Python写一个创意五子棋游戏

    前言 在本教程中,我们将使用Python写一个创意五子棋游戏     个人推荐python学习系列: ☄️爬虫 JS逆向 系列专栏  - 爬虫逆向教学 ☄️python系列专栏  - 从零开始学python 首先 GomokuGame 类的构造函数 __init__ 初始化游戏。 board_size 参数默认为 15,表示棋盘大小。 board 是一个

    2024年02月12日
    浏览(49)
  • JavaScript应用:五子棋游戏实战开发

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:100个JavaScript的小应用。 🎉欢迎 👍点赞✍评论⭐收藏 五子棋是一

    2024年02月13日
    浏览(46)
  • 基于FPGA的五子棋游戏设计

    基于FPGA的五子棋游戏设计 本文基于FPGA设计五子棋游戏,使用按键输入,使用VGA接口输出。五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为10×10,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的

    2024年02月05日
    浏览(47)
  • 基于C#的五子棋游戏设计

    目 录 一、 毕业设计内容 3 二、 毕业设计目的 3 三、 工具/准备工作 3 四、 设计步骤和方法 3 (一) 总体设计 3 1. 总体设计思路及设计图 3 2. 界面设计 4 3. 全局变量设计 4 (二) 详细设计 5 1. 刷新棋盘 5 2. 绘制棋盘 5 3. 分步计时 5 4. 显示光标 6 5. 判断胜负 8 6.

    2024年02月04日
    浏览(56)
  • 五子棋游戏禁手算法的改进

    五子棋游戏禁手算法的改进 五子棋最新的禁手规则: 1.黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”(包括“四三三”)、“四四”(包括“四四三”)和“长连”。黑棋只能以“四三”取胜。 2.黑方五连与禁手同时形成,判黑方胜。 3.黑方禁手形成时,白方应立即

    2024年02月10日
    浏览(34)
  • 用Java写一个简易五子棋游戏

     一. 程序基本思路: 1.写窗口、棋盘面板、控制面板; 2.绘制棋盘; 3.绘制棋子; 4.添加组件功能; 5.判断输赢; 6.悔棋; 7.复盘。 二.实际操作 1.创建窗口、添加面板 效果图:  2.绘制棋盘   为了棋盘线在窗体刷新后仍能保存,我们直接重写chesspanel的paint方法,将棋盘绘

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包