13 c++版本的五子棋

前言

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

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

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

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

 

 

五子棋

#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 上面执行 貌似 渲染是存在问题的, 需要调整 

1c9d19f2273d41ad9f35c83b156e227c.png

 

 

正常执行

9580ed69246744348b4c0d08a18379f6.png

 

 

 

 

 

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

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

相关文章

安规电容定义和应用

安规电容 定义 失效后&#xff0c;不会导致电击&#xff0c;不危及人身安全的电容器&#xff0c;称之为安规电容 分类 分为X电容和Y电容 X电容–跨接在电力线&#xff08;L-N&#xff09;之间的电容&#xff0c;一般选用金属薄膜电容&#xff0c;X电容有多种颜色&#xff…

VUE3----Swiper滑动切换图片

Swiper滑动切换图片 可以切换焦点图&#xff0c;兼容小程序 <template><view class"cc-swiper-container" v-if"imageList.length > 0"><swiper class"swiper":class"swiperClassName" :circular"circular&q…

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

C语言 | Leetcode C语言题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1));for (int j 0; j < n; j) board[i][…

Spring Cloud学习笔记(Feigh):简介,实战简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、Netflix Feign简介2、Open Feign的简单样例2.1、dependency2.2、代码样例 1、Netflix Feign简介 Netfilx Feign是用来帮助发送远程服务的&#xff0c;它让开发者觉得调用远程服务就像是调用本地方法一样&…

服务器数据恢复—ESXi无法识别数据存储和VMFS文件系统如何恢复数据?

服务器数据恢复环境&#xff1a; 一台某品牌服务器&#xff0c;通过FreeNAS来做iSCSI&#xff0c;然后使用两台同品牌服务器做ESXi虚拟化系统。 FreeNAS层为UFS2文件系统&#xff0c;使用整个存储建一个稀疏模式的文件&#xff0c;挂载到ESXi虚拟化系统。ESXi虚拟化系统中有3台…

怎样通过HTTP协议实现远程控制两路开关

怎样通过HTTP协议实现远程控制两路开关呢&#xff1f; 本文描述了使用HTTP协议调用HTTP接口&#xff0c;实现控制两路开关&#xff0c;两路开关可控制两路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能Wi…

flutter开发实战-build apk名称及指令abiFilters常用gradle设置

flutter开发实战-build apk名称及指令abiFilters常用gradle设置 最近通过打包flutter build apk lib/main.dart --release&#xff0c;发现apk命名规则需要在build.gradle设置。这里记录一下。 一、apk命名规则 在android/app/build.gradle中需要设置 android.applicationVa…

OpenWrt上的docker容器无法访问外网解决

容器里能ping通OpenWrt的管理地址和wan口地址&#xff0c;但ping外网别的ip或域名就无法访问 简单修改设置就可以&#xff1a; Luci>网络>防火墙>转发&#xff1a;接受 ->保存应用

俩招解决vs code中文编译乱码现象

如下图所示 输出会出现乱码,引起这个情况的原因是什么呢? 本页面的编码形式可能不是 utf-8 的形式。 解决方法一 可以尝试使用命令 system("chcp 65001"); system("chcp 65001"); system("chcp 65001"); 这条命令在C程序中用于解决中文乱码问…

银行押款车远程监控系统的实际需求与特点

随着金融行业的快速发展&#xff0c;银行押款车的安全性问题日益受到重视。传统的押款车监控方式已经无法满足现代安全管理的需求&#xff0c;因此&#xff0c;一种结合先进技术的远程监控系统应运而生。本文旨在探讨在运钞车上安装车载摄像机和集成有GPS、无线4G网络传输模块的…

四数之和 ---- 双指针

题目链接 题目: 分析: 我们已经知道三数之和如何求取, 并去重了 三数之和 那么四数之和同理, 需要固定两个数a和b 然后用"双指针算法" , 只要两指针之和等于target-a-b即可同样对于四个数都要进行去重 代码: class Solution {public List<List<Integer>…

LM2576D2TR4-5G 3.0安15伏降压开关稳压器 PDF中文资料_参数_引脚图

LM2576D2TR4-5G 规格信息&#xff1a; 制造商:ON Semiconductor 产品种类:开关稳压器 RoHS:是 装置风格:SMD/SMT 封装 / 箱体:TO-263-5 输出电压:5 V 输出电流:3 A 输出端数量:1 Output 最大输入电压:45 V 拓扑结构:Buck 最小输入电压:7 V 开关频率:52 kHz 最小工作…

新书推荐机器学习大数据平台的构建、任务实现与数据治理

在大数据与机器学习日新月异的今天&#xff0c;构建稳定、安全、可扩展的数据平台已成为企业和研究机构的迫切需求。这本书应运而生&#xff0c;提供了详尽且实用的指南&#xff0c;帮助读者在云计算环境中构建、优化和治理大数据平台。 作者以清晰明了的写作风格&#xff0c;…

最小费用流相位解包裹

% test_cunwrap.m % % Matlab script to test Costantinis unwrapping % Author: Bruno Luong <brunoluong@yahoo.com> % History: % Orginal: 27-Aug-2009clear all; close all; clc; I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.public_files\博士阶段\小…

与Apollo共创生态:我和Apollo七周年大会的心路历程

一、写在前面 前几天观看了Apollo七周年大会&#xff0c;给我带来了超多的惊喜&#xff0c;博主想将这份惊喜分享给大家&#xff01; 二、Apollo开放平台 Apollo开放平台秉承其核心理念——开放能力、共享资源、加速创新、持续共赢&#xff0c;致力于推动自动驾驶技术的革新…

MySQL recursive 递归

MySQL 从最内的select开始执行&#xff0c;但是同一个select clause可以在查询的结果上继续查询。 SELECT menu_id,parent_id,(SELECT m1.parent_id FROM sys_menu AS m1 WHERE m1.menu_idm.parent_id) FROM sys_menu AS m WHERE m.menu_id 89 方案1.通过recursive递归 使用…

R基本的数据管理

一&#xff0c;创建变量 创建一个数据框 > myData<-data.frame(x1c(1,2,3,4,5,6),x2c(6,5,67,8,9,0)) > myDatax1 x2 1 1 6 2 2 5 3 3 67 4 4 8 5 5 9 6 6 0增加一列为两者的和 > myData$sum<-myData$x1myData$x2 > myDatax1 x2 sum 1 1 6 …

创建electron,解决包清理的问题,解决镜像源卡住下载时间长

我的电脑用户名是Anyphasy,我的node.js安装在D:\developp\nodejss18.18.0 使用npm config get prefix查看node.js安装路径 npm config get prefix 创建electron 创建package.json文件,它里面记载了你的electron版本,项目描述,以及启动命令等信息 npm init -y 先查看你自己的…

OpenCV直方图计算

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现直方图均衡 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::split 将图像划分…
最新文章