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;elsefor(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.mzph.cn/web/3947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍 1、简介 SHT30是一种数字湿度和温度传感器&#xff0c;由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器&#xff0c;具有高精度和长期稳定性。SHT30采用I2C数字接口&#xff0c;可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点…

树莓派4-通过IIC实现图片循环播放

一、环境 1、树莓派4&#xff1b; 2、串口连接电脑&#xff1b; 3、树莓派由杜邦线连接0.96寸OLED1306协议 4、树莓派能够联网&#xff0c;便于安装环境。离线情况也可以安装&#xff0c;相对麻烦&#xff1b; 二、目标 1、树莓派可以开启IIC并识别已连接的IIC&#xff1b; …

Web3解密:理解去中心化应用的核心原理

引言 在当前数字化时代&#xff0c;去中心化技术和应用正在逐渐引起人们的关注和兴趣。Web3技术作为去中心化应用&#xff08;DApps&#xff09;的基础&#xff0c;为我们提供了一个全新的互联网体验。但是&#xff0c;对于许多人来说&#xff0c;这个复杂的概念仍然充满了神秘…

MongoDB基础操作

文章目录 一、什么是MongoDB二、MongoDB 与关系型数据库对比三、数据类型四、部署MongoDB1、下载二进制包2、下载安装包并解压3、创建用于存放数据和日志的目录&#xff0c;并修改权限4、启动MongoDB4.1前台启动4.2后台启动4.3、配置文件启动服务4.4、配置systemd服务4.5、syst…

RabbitMQ发布确认和消息回退(6)

概念 发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker就会发送一个确认给生产者(包含消…

qt实现方框调整

效果 在四周调整 代码 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QWidget>class MainWindow : public QWidget {Q_OBJECT public:explicit MainWindow(QWidget *parent 0);~MainWindow();void paintEvent(QPaintEvent *event);void updateRect();void re…

Restful API 具体设计规范(概述)

协议 https 域名 https://www.baidu.com/api 版本 https://www.baidu.com/v1 路径 https://www.baidu.com/v1/blogs 方法 数据过滤 状态码返回结果 返回的数据格式 尽量使用 JSON&#xff0c;避免使用 XML。 总结&#xff1a; 看 url 就知道要什么看 http method 就知道干…

Linux进阶篇:CentOS7搭建NFS文件共享服务

CentOS7搭建NFS文件共享服务 一、NFS介绍 NFS(Network File System)意为网络文件系统&#xff0c;它最大的功能就是可以通过网络&#xff0c;让不同的机器不同的操作系统可以共享彼此的文件。简单的讲就是可以挂载远程主机的共享目录到本地&#xff0c;就像操作本地磁盘一样&…

Docker——数据管理和网络通信

目录 一、Docker的数据管理 1.数据卷 2.数据卷容器 3.容器互联 二、Docker镜像的创建 1.基于现有镜像创建 2.基于本地模板创建 3.基于Dockerfile 创建 3.1联合文件系统&#xff08;UnionFS&#xff09; 3.2镜像加载原理 3.3为什么Docker里的Centos大小才200M 4.Dcok…

9【PS作图】像素画Tips

放大缩小 “窗口”-排列-为…画布新建窗口&#xff0c;就可以新建一个窗口&#xff0c;实时看作图效果 如果要保持放大或缩小的像素画仍然保持硬边缘&#xff0c;需要设置两个东西 将 编辑 > 首选项 > 常规 中的 插值方式 改为 “邻近&#xff08;靠近硬边缘&#xff09…

HTML网页自动播放背景音乐和全屏背景图代码

HTML网页自动播放背景音乐的代码 背景音乐代码及分析代码的应用背景图代码及分析下期更新预报 背景音乐代码及分析 能使网站上自动循环的背景音乐代码如下&#xff1a; <audio src"music.mid" autostart"true" loop"true" hidden"true…

【小梦C嘎嘎——启航篇】C++四大类型转换

&#x1f60e; 前言&#x1f64c;C四大类型转换什么是类型转换C语言中的类型转换为什么C要嫌弃C语言的类型转换&#xff1f;自行搞一套呢&#xff1f;C强制类型转换1、static_cast2、reinterpret_cast3、const_cast4、dynamic_cast为什么要支持向下转呢&#xff1f; RTTI 总结撒…

RabbitMQ工作模式(4) - 路由模式

概念 路由模式&#xff08;Routing&#xff09;是 RabbitMQ 中的一种消息传递模式&#xff0c;也称为直连模式。它允许生产者将消息发送到一个交换机&#xff0c;并指定一个或多个路由键&#xff08;routing key&#xff09;&#xff0c;交换机根据路由键将消息路由到与之匹配的…

实验7:路由冗余协议HSRP配置管理(课内实验以及解答)

实验目的及要求&#xff1a; 理解首跳冗余协议&#xff08;FHRP&#xff09;的工作原理&#xff0c;掌握热备份路由器协议 (HSRP)&#xff08;思科私有协议&#xff09;原理和配置。能够实现网络终端设备虚拟网关的配置和网络故障的灵活切换&#xff0c;完成相应网络的联通性测…

多模态大语言模型综述

去年以来&#xff0c;我们见证了以 GPT-4V 为代表的多模态大语言模型(Multimodal Large Language Model&#xff0c;MLLM)的飞速发展。为此我们对综述进行了重大升级&#xff0c;帮助大家全面了解该领域的发展现状以及潜在的发展方向。 MLLM 发展脉络图 MLLM 脱胎于近年来广受…

【Redis 开发】缓存雪崩和缓存击穿

缓存问题 缓存雪崩解决方案 缓存击穿互斥锁逻辑时间基于互斥锁解决缓存击穿问题基于逻辑过期方式解决缓存击穿问题 缓存雪崩 缓存雪崩是指在同一时间段&#xff0c;大量的缓存key同时失效或者Redis服务器宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力 解决…

Qt | QAbstractButton 抽象类

QAbstractButton 类中的属性 ①、autoExclusive:bool 访问函数:bool autoExclusive() const; void setAutoExclusive(bool); 描述了按钮的自动排他性,若启用了该属性,则属于同一父部件的可选中按钮的行为, 就好像是在同一排他性组中的按钮一样。除了单选按钮,默认为关…

【网络编程】TCP流套接字编程 | Socket类 | ServerSocket类 | 文件资源泄露 | TCP回显服务器 | 网络编程

文章目录 TCP流套接字编程1.ServerSocket类2.Socket类3.文件资源泄露4.**TCP回显服务器** TCP流套接字编程 ​ ServerSocket类和Socket类这两个类都是用来表示socket文件&#xff08;抽象了网卡这样的硬件设备&#xff09;。 TCP是面向字节流的&#xff0c;传输的基本单位是b…

Facebook的未知力量:数字世界的新引擎

在数字化的时代&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力远远超出了我们的想象。但是&#xff0c;Facebook背后隐藏的力量和影响远不止于此&#xff0c;它正逐渐成为数字世界的新引擎&#xff0…

python 使用flask_httpauth和pyjwt实现登录权限控制

最近需要用到&#xff0c;学习了一下记录 首先安装依赖 pip install Flask-HTTPAuth pyjwt passlib Welcome to Flask-HTTPAuth’s documentation! — Flask-HTTPAuth documentation Welcome to PyJWT — PyJWT 2.8.0 documentation Passlib 1.7.4 documentation — Passl…