C++五子棋人机对战(已修复已知问题)

C++五子棋人机对战(含注释)-CSDN博客

C++五子棋人机对战-CSDN博客

这两篇博客中有个bug,就是没加srand(time(0));这个语句(放在主函数的最开头)

改正代码

#include<bits/stdc++.h>//万能头 
#define ll long long
using namespace std;
ll n,a[1000][1000],x,y,b[1000][1000]; 
int xd[10]={1,-1,0};
int yd[10]={1,-1,0};
void init(){//初始化 for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) a[i][j]=2;
}
bool find(){//判断黑子连珠 //竖着 ll sum=1,i,j;i=x,j=y;b[i][j]=3;while(1){if(a[i+1][j]==1){i++;sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i-1][j]==1){i--;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;//横着 sum=1;i=x,j=y;while(1){if(a[i][j+1]==1){j++;sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i][j-1]==1){j--;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;//斜着 1 sum=1;i=x,j=y;while(1){if(a[i-1][j-1]==1){i--;j--;sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i+1][j+1]==1){i++;j++;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;//斜着 2 sum=1;i=x,j=y;while(1){if(a[i-1][j+1]==1){i--;j++; sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i+1][j-1]==1){i++;j--;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;return false;
}
bool find2(){//判断白子连珠 //竖着 ll sum=1,i,j;i=x,j=y;b[i][j]=3;while(1){if(a[i+1][j]==0){i++;sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i-1][j]==0){i--;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;//横着 sum=1;i=x,j=y;while(1){if(a[i][j+1]==0){j++;sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i][j-1]==0){j--;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;//斜着 1 sum=1;i=x,j=y;while(1){if(a[i-1][j-1]==0){i--;j--;sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i+1][j+1]==0){i++;j++;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;//斜着 2 sum=1;i=x,j=y;while(1){if(a[i-1][j+1]==0){i--;j++; sum++;b[i][j]=3;}else break;}i=x,j=y;while(1){if(a[i+1][j-1]==0){i++;j--;sum++;b[i][j]=3;}else break;}if(sum>=5) return true;return false;
}
bool find4(int t,int tt){//AI判断对方是否有连珠 //竖着 ll sum=1,i,j,ii,jj;i=x,j=y;while(1){if(a[i+1][j]==tt){i++;sum++;}else break;}ii=x,jj=y;while(1){if(a[ii-1][jj]==2&&sum==t){x=ii-1;y=jj;return true;}if(a[ii-1][jj]==tt){ii--;sum++;}else break;}if(sum==t){if(a[i+1][j]==2&&sum==t){x=i+1;y=j;return true;}}//横着 sum=1;i=x,j=y;while(1){if(a[i][j+1]==tt){j++;sum++;}else break;}ii=x,jj=y;while(1){if(a[ii][jj-1]==2&&sum==t){x=ii;y=jj-1; return true;}if(a[ii][jj-1]==tt){jj--;sum++;}else break;}if(sum==t){if(a[i][j+1]==2&&sum==t){x=i;y=j+1;return true;}}//斜着 1 sum=1;i=x,j=y;while(1){if(a[i-1][j-1]==tt){i--;j--;sum++;}else break;}ii=x,jj=y;while(1){if(a[ii+1][jj+1]==2&&sum==t){x=ii+1;y=jj+1;return true;}if(a[ii+1][jj+1]==tt){ii++;jj++;sum++;}else break;}if(sum==t){if(a[i-1][j-1]==2&&sum==t){x=i-1;y=j-1;return true;}}//斜着 2 sum=1;i=x,j=y;while(1){if(a[i-1][j+1]==tt){i--;j++; sum++;}else break;}ii=x,jj=y;while(1){if(a[ii+1][jj-1]==2&&sum==t){x=ii+1;y=jj-1;return true;}if(a[ii+1][jj-1]==tt){ii++;jj--;sum++;}else break;}if(sum==t){if(a[i-1][j+1]==2&&sum==t){x=i-1;y=j+1;return true;}}return false;
}
bool find3(){//平局 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]==2) return false;return true;
}
int getRand(int min,int max){//随机种子函数 return (rand()%(max-min+1))+min;
}
int main(){srand(time(0));init();cout<<"AI再聪明也有失误的时候\n";cout<<"棋盘大小:";cin>>n;cout<<"1.黑子\n";cout<<"2.白子\n";int d;cin>>d;if(d==1){cout<<"白子为0,黑子为1,2为空棋位\n下棋时请输入棋的坐标(格式:x y  坐标范围是从1,1到n,n)\n如果一方赢了那他赢得那一行棋都会变成3\n"; while(1){cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}if(find3()){cout<<"平局,游戏结束";break; } //黑子 cout<<"该你了\n";cin>>x>>y;while((a[x][y]!=2)||(x>n||y>n||x<1||y<1)){if(a[x][y]!=2)cout<<"此坐标已有棋子\n"; else if(x>n||y>n||x<1||y<1) cout<<"此坐标不正确\n";cout<<"该你了\n";cin>>x>>y;}a[x][y]=1;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=a[i][j];if(find()){cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}cout<<"你赢了,游戏结束";break; }cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}if(find3()){cout<<"平局,游戏结束";break; } //白子cout<<"AI思考中...\n";if(find4(4,1));else if(find4(3,1));else if(find4(2,1));/*else if(find4(4,0));else if(find4(3,0));else if(find4(2,0));*/else{while((a[x][y]!=2)||(x>n||y>n||x<1||y<1)){x=x+xd[getRand(0,3)];y=y+yd[getRand(0,3)];}}cout<<"x:"<<x<<" y:"<<y<<"\n";a[x][y]=0;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=a[i][j];if(find2()){cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}cout<<"AI赢了,游戏结束";break; }}cout<<"\n   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",b[i][j]);cout<<"\n";}}else if(d==2){int ff=1;cout<<"白子为0,黑子为1,2为空棋位\n下棋时请输入棋的坐标(格式:x y  坐标范围是从1,1到n,n)\n如果一方赢了那他赢得那一行棋都会变成3\n"; while(1){cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}if(find3()){cout<<"平局,游戏结束";break; } //黑子cout<<"AI思考中...\n";if(ff){ff=0;x=n/2;y=n/2;}else{if(find4(4,0));else if(find4(3,0));else if(find4(2,0));/*else if(find4(4,1));else if(find4(3,1));else if(find4(2,1));*/else{while((a[x][y]!=2)||(x>n||y>n||x<1||y<1)){x=x+xd[getRand(0,3)];y=y+yd[getRand(0,3)];}}}cout<<"x:"<<x<<" y:"<<y<<"\n";a[x][y]=1;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=a[i][j];if(find()){cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}cout<<"AI赢了,游戏结束";break; } cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}if(find3()){cout<<"平局,游戏结束";break; } //白子cout<<"该你了\n";cin>>x>>y;while((a[x][y]!=2)||(x>n||y>n||x<1||y<1)){if(a[x][y]!=2)cout<<"此坐标已有棋子\n"; else if(x>n||y>n||x<1||y<1) cout<<"此坐标不正确\n";cout<<"该你了\n";cin>>x>>y;}a[x][y]=0;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=a[i][j];if(find2()){cout<<"   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",a[i][j]);cout<<"\n";}cout<<"你赢了,游戏结束";break; }}cout<<"\n   ";for(int i=1;i<=n;i++) printf("%3d",i);cout<<"\n\n";for(int i=1;i<=n;i++){printf("%3d",i);for(int j=1;j<=n;j++) printf("%3d",b[i][j]);cout<<"\n";}}else cout<<"无效输入"; return 0;
}

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

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

相关文章

架构设计系列9,10

架构设计系列9&#xff1a;前端架构和后端架构的区别 前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 定位和职责 ● 前端架构主要…

【Wechat_MiniProgram_JS】拓展运算符——`...`JavaScript运算符?

拓展运算符... **… 运算符&#xff0c;是 ES6 里一个新引入的运算符&#xff0c;也叫展开运算符&#xff0c;**我们每天都要和它打交道。 简而言之就是&#xff0c;… 运算符可以展开一个可迭代对象中的所有项。 可迭代的对象一般是指可以被循环的&#xff0c;包括&#xff1a…

一文解释Linux的内存分页管理

内存是计算机的主存储器。内存为进程开辟出进程空间&#xff0c;让进程在其中保存数据。我将从内存的物理特性出发&#xff0c;深入到内存管理的细节&#xff0c;特别是了解虚拟内存和内存分页的概念。 内存 简单地说&#xff0c;内存就是一个数据货架。内存有一个最小的存储…

书客、孩视宝、明基护眼台灯好不好用?护眼灯测评对比!

现在一些家长对自家孩子的健康也是特别的重视&#xff0c;从小时开始的儿童枕&#xff1b;再到保护眼睛的护眼台灯、OK眼镜&#xff1b;再到青少年时期的生长激素...可以说是穷出不尽&#xff0c;但是关于孩子使用的东西又不能马虎&#xff0c;每次要帮孩子选东西的时候可是一阵…

四川思维跳动商务信息咨询有限公司电商服务怎么样

随着电商行业的迅猛发展&#xff0c;越来越多的企业开始寻求专业的电商服务以提升自身竞争力。四川思维跳动商务信息咨询有限公司作为一家专注于电商服务的公司&#xff0c;凭借其卓越的服务品质和创新能力&#xff0c;已经在业内树立了良好的口碑。本文将为您详细解析四川思维…

办公宝典:兼具多功能的4大办公软件app推荐!

现在&#xff0c;随着全球化和互联网的发展&#xff0c;团队协作成为企业成功的关键所在。在这个环境中&#xff0c;协同办公软件成为无法离开的工具。 在市面上&#xff0c;有很多种协同办公软件可供选择。这里介绍4款与协同办公密切相关的软件&#xff0c;它们提供了许多功能…

Pendulum详解2——Pendulum高级应用 - 精通时间的玩法

目录 写在开头1.简单回顾2. 时间周期和区间2.1 处理时间周期2.2 时间区间的处理2.3 实际场景案例2.4 复杂周期的处理2.5 区间计算中的时区考虑3. 时间格式本地化3.1 解释多地区的本地化支持3.2 演示国际化灵活性3.3 处理不同语言和习惯4. 时间迭代4.1 Pendulum的时间迭代方法4.…

C#基础:字段的初始化、继承

一、字段的初始化 class Test {static int Main(string[] args){var list new List<Calculate>();//1.Calculate中加入abvar calculate new Calculate { a 2, b 3 };//2.Calculate中加入Value列表calculate.Values.Add(new Value { id 1, value 6 });calculate.Va…

【操作系统】输入输出系统

6.1 I/O系统的功能、模型和接口 I/O系统管理的主要对象是I/O设备和相应的设备控制器。其最主要的任务是&#xff0c;完成用户提出的I/O请求&#xff0c;提高I/O速率&#xff0c;以及提高设备的利用率&#xff0c;并能为更高层的进程方便地使用这些设备提供手段。 6.1.1 I/O系…

Ubuntu 22.04/20.04 安装 SSH

OpenSSH 是安全远程通信的重要工具&#xff0c;提供了一种安全的方式来访问和管理服务器。对于那些计划在 Ubuntu 22.04 Jammy Jellyfish 或其较旧的稳定版本的 Ubuntu 20.04 Focal Fossa 上安装 SSH 并启用它的人来说&#xff0c;了解其功能和优势至关重要。 OpenSSH的主要特…

vLLM部署推理及相关重要参数

部署示例代码 from vllm import LLM, SamplingParamsprompts ["Hello, my name is","The president of the United States is","The capital of France is","The future of AI is", ] sampling_params SamplingParams(temperature0…

技术学习|CDA level I 描述性统计分析(数据的描述性统计分析)

技术学习|CDA level I 描述性统计分析&#xff08;数据的描述性统计分析&#xff09; 数据的描述性统计分析常从数据的集中趋势、离散程度和分布形态3个方面进行。 一、集中趋势 集中趋势是指数据向其中心值靠拢的趋势。测量数据的集中趋势&#xff0c;主要是寻找其中心值。…

python延迟绑定是什么?

延迟绑定是什么&#xff1f; Python中的延迟绑定是指在嵌套函数中&#xff0c;内部函数在被调用时才会绑定外部函数的变量&#xff0c;而不是在定义内部函数时就绑定。这种绑定方式可以导致一些出乎意料的行为&#xff0c;因为变量的值是在函数调用时决定的&#xff0c;而不是…

修改选择框el-select样式,显示及下拉样式

修改选择框el-select样式,显示及下拉样式 .el-input__inner {background: rgba(25, 126, 195, 0.2);border: none;color: #fff; }.el-select-dropdown {background: rgba(19, 73, 104, 0.79);border: 2px solid #48e3ff;border-radius: 0; }.el-popper .popper__arrow {display…

了解JavaScript中的语句

前言 前面我们学习了JavaScript中的变量、操作符等&#xff0c;本篇内容讲解JavaScript中的语句&#xff0c;只有了解了语句的使用&#xff0c;才能正式开发出一个完整的功能。 一、if语句 if语句是实际开发中使用最多的语句之一&#xff0c;具体语法如下 if(条件) 语句1 el…

VUE局部组件

实现局部组件的注册功能&#xff0c;样例如下 代码如下 <html><head><meta charset"utf-8"><title></title></head><body><div id"app"><hello-word></hello-word><hello-tom></he…

通信及信号处理领域期刊影响因子、分区及期刊推荐-2024版

期刊名IF(202401)中科院分区(20231227)备注IEEE Journal on Selected Areas in Communications16.4计算机科学1区Top通信顶刊IEEE Transactions on Signal Processing5.4工程技术2区Top信号处理顶刊IEEE Transactions on Information Theory2.5计算机科学3区信息论顶刊IEEE Tra…

多个微信的朋友圈如何高效管理?

大家都知道&#xff0c;在当今社交媒体盛行的时代&#xff0c;微信朋友圈已成为了我们交流和分享生活的重要平台。但是&#xff0c;对于那些同时管理多个微信号的人来说&#xff0c;如何高效省时地管理这些账号的朋友圈就成了一项挑战。 今天我将分享一个神奇的微信管理工具&a…

vue项目获取 iframe 中的DOM元素

注意&#xff0c;由于跨域的安全限制&#xff0c;只能访问同源的 iframe 内容。如果 iframe 的源与父组件的源不同&#xff0c;那么在访问其内容时可能会遇到跨域错误。 <template><div><iframe ref"myIframe" src"https://example.com" lo…

内存的基础知识-第四十天

目录 什么是内存&#xff1f;内存的作用 常用的数量单位 指令的工作原理 思考 三种装入方式 绝对装入 可重定位装入&#xff08;静态重定位&#xff09; 动态运行时装入&#xff08;动态重定位&#xff09; 写程序到程序运行 编译和链接 链接的三种方式 本节思维导…