111,博客开通有一段时间了,因为太low所以一直没敢写博客,今天再次鼓足勇气把几个月前的五子棋Ai与大家分享一下,讲得不好请见谅(0v0)。

首先,我们要知道五子棋是两个人之间的博弈,双方轮流下子,肯定每次要将子下到最有用处的地方才是最有利于自己的(感觉说了堆废话。。)。我们将五子棋棋盘看成一个矩阵,用二维数组表示。然后我们可以在人落子后对场上所有空点进行评分,然后将电脑的棋子下在分最高的空点上。这就是五子棋Ai,,简单吧。。

但是,怎样对空点进行评分呢?这才是关键所在,不同的评分规则会制造出性能不同的Ai,就像百万跑车与几万的面包车一样,可能别人写的Ai会完爆你的Ai(感觉又说了堆废话。。)。评分规则因人而异,我来讲将我的方法吧。

对每个空点分别搜4个方向(为什么不是8个?因为左上与右下在同一直线上,最好合并算)。对于每个方向,我们可以根据自己平时玩五子棋的经验,来对这行(只需看这行上以这个空点为中心的临近几点即可)可能的每种局势给个分值(当然这局势依然有太多种,为了偷懒我们可以将局势差不多的当成一种来看 ),然后将4个方向上的评分加起来就是这个空点的总分了。是不是越来越糊涂了?可能代码比较直接。codeblocks可以运行,运行不了的将头文件该下就可以了。

(还有那种比较正宗的极大极小值博弈算法,本人能力有限,感兴趣的自行找度娘0.0.....)

#include<bits/stdc++.h>
using namespace std;int ch[20][20],Score[20][20];
int fang_a[4]={-1,-1,-1,0};
int fang_b[4]={-1,0,1,-1};struct Sdian
{int a,b;Sdian(int a=0,int b=0):a(a),b(b){}
};Sdian buzhou[301];
int sign_buzhou_num;
Sdian dian[301];void ChessScore()
{int x, y, i, j, k;int number1 = 0, number2 = 0;int empty = 0;memset(Score, 0, sizeof(Score));for (x = 0; x<15; x++)for (y = 0; y<15; y++)if (ch[x][y] == 0)for(int i=0;i<4;i++)  ///4个方向撇竖捺横{int a[3]={0},sign_a=1;int b[4]={0},sign_b=2;a[1]=1;int sign_qian=5,sign_hou=-5;///对玩家落点评分for (k = 1; k <= 4; k++){int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )if(ch[sign_x][sign_y] == 2)a[sign_a]++;     ///自己else if (ch[sign_x][sign_y] == 0){++sign_a;b[sign_b++]=0;if(sign_b==4)break;}   ///空位else {b[sign_b]=2;sign_qian=k;break;}     ///敌方else {b[sign_b]=2;sign_qian=k;break;}        ///越界}sign_a=1;sign_b=1;for (k = -1; k >= -4; k--){int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )if(ch[sign_x][sign_y] == 2)a[sign_a]++;     ///自己else if (ch[sign_x][sign_y] == 0){--sign_a;b[sign_b--]=0;if(sign_b==-1)break;}   ///空位else {b[sign_b]=2;sign_hou=k;break;}     ///敌方else {b[sign_b]=2;sign_hou=k;break;}        ///越界}if(sign_qian-sign_hou>5){if(a[1]>=5)Score[x][y]+=100000;else if(a[1]==4){if(b[1]==2||b[2]==2)Score[x][y]+=1100;else if(b[0]==2||b[3]==2)Score[x][y]+=5000;else Score[x][y]+=10000;}else if(a[1]==3){if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;else if(b[1]==2||b[2]==2)Score[x][y]+=100;else if(b[0]==2||b[3]==2)Score[x][y]+=500;else Score[x][y]+=1000;}else if(a[1]==2){if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=800;else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=80;else if(b[1]==2||b[2]==2)Score[x][y]+=10;else if(b[0]==2||b[3]==2)Score[x][y]+=50;else Score[x][y]+=100;}else{if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=800;else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=80;else if((a[0]+a[1]==2&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==2&&b[1]!=2&&b[4]!=2))Score[x][y]+=80;else if(a[0]+a[1]==2||a[1]+a[2]==2)Score[x][y]+=8;else if(b[1]==2||b[2]==2)Score[x][y]+=1;else if(b[0]==2||b[3]==2)Score[x][y]+=5;else Score[x][y]+=10;}}///对电脑落点评分a[0]=a[1]=a[2]=0;sign_a=1;b[0]=b[1]=b[2]=b[3]=0;sign_b=2;a[1]=1;sign_qian=5,sign_hou=-5;for (k = 1; k <= 4; k++){int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )if(ch[sign_x][sign_y] == 1)a[sign_a]++;     ///自己else if (ch[sign_x][sign_y] == 0){++sign_a;b[sign_b++]=0;if(sign_b==4)break;}   ///空位else {b[sign_b]=2;sign_qian=k;break;}     ///敌方else {b[sign_b]=2;sign_qian=k;break;}        ///越界}sign_a=1;sign_b=1;for (k = -1; k >= -4; k--){int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )if(ch[sign_x][sign_y] == 1)a[sign_a]++;     ///自己else if (ch[sign_x][sign_y] == 0){--sign_a;b[sign_b--]=0;if(sign_b==-1)break;}   ///空位else {b[sign_b]=2;sign_hou=k;break;}     ///敌方else {b[sign_b]=2;sign_hou=k;break;}        ///越界}if(sign_qian-sign_hou>5){if(a[1]>=5)Score[x][y]+=1000000;else if(a[1]==4){if(b[1]==2||b[2]==2)Score[x][y]+=1200;else if(b[0]==2||b[3]==2)Score[x][y]+=5000;else Score[x][y]+=50001;}else if(a[1]==3){if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;else if(b[1]==2||b[2]==2)Score[x][y]+=100;else if(b[0]==2||b[3]==2)Score[x][y]+=500;else Score[x][y]+=1001;}else if(a[1]==2){if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1160;else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=900;else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=90;else if(b[1]==2||b[2]==2)Score[x][y]+=10;else if(b[0]==2||b[3]==2)Score[x][y]+=50;else Score[x][y]+=101;}else{if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1196;else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=900;else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=90;else if((a[0]+a[1]==2&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==2&&b[1]!=2&&b[4]!=2))Score[x][y]+=90;else if(a[0]+a[1]==2||a[1]+a[2]==2)Score[x][y]+=9;else if(b[1]==2||b[2]==2)Score[x][y]+=1;else if(b[0]==2||b[3]==2)Score[x][y]+=5;else Score[x][y]+=11;}}}}void print()
{system("cls");printf("  ");for(int i=0;i<=14;i++)printf("%2d",i);cout<<endl;for(int i=0;i<=14;i++){printf("%2d",i);for(int j=0;j<=14;j++)printf(" %c",ch[i][j]==0?'.':(ch[i][j]==1?'O':'X'));putchar('\n');}
}void kaiju(int a,int b,int &aa,int &bb)
{if((a==6&&b==6)||(a==6&&b==7)){ch[5][6]=1;buzhou[++sign_buzhou_num]=Sdian(5,6);aa=5;bb=6;}else if((a==6&&b==8)||(a==7&&b==8)){ch[6][9]=1;buzhou[++sign_buzhou_num]=Sdian(6,9);aa=6;bb=9;}else if((a==8&&b==8)||(a==8&&b==7)){ch[9][8]=1;buzhou[++sign_buzhou_num]=Sdian(9,8);aa=9;bb=8;}else if((a==8&&b==6)||(a==7&&b==6)){ch[8][5]=1;buzhou[++sign_buzhou_num]=Sdian(8,5);aa=8;bb=5;}else{ChessScore();srand(time(NULL));int sign_max=Score[0][0],sign_num=0;for(int i=0;i<15;i++)for(int j=0;j<15;j++)sign_max=max(sign_max,Score[i][j]);for(int i=0;i<15;i++)for(int j=0;j<15;j++){if(Score[i][j]==sign_max){dian[sign_num++]=Sdian(i,j);/*cout<<"###"<<endl;int aaa;cin>>aaa;*/}}Sdian sign_rand=dian[rand()%sign_num];aa=sign_rand.a;bb=sign_rand.b;ch[aa][bb]=1;buzhou[++sign_buzhou_num]=Sdian(aa,bb);}
}int panduan(int a,int b)
{for(int i=0;i<4;i++){int num=1;for(int k=1;k<=4;k++){int sign=ch[a+k*fang_a[i]][b+k*fang_b[i]];if(sign==ch[a][b])num++;else break;}for(int k=-1;k>=-4;k--){int sign=ch[a+k*fang_a[i]][b+k*fang_b[i]];if(sign==ch[a][b])num++;else break;}if(num>=5)return ch[a][b];}return -1;
}int main()
{int sign_start=1;while(sign_start==1){sign_buzhou_num=-1;memset(ch,0,sizeof(ch));ch[7][7]=1;buzhou[++sign_buzhou_num]=Sdian(7,7);int a,b,sheng,sign_bushu=1;print();cout<<"电脑下子的位置:"<<7<<","<<7<<endl;while(1){if(sign_bushu%2==1)while(1){if(sign_buzhou_num==0)cout<<"请输入您下子的位置:"<<endl;else cout<<"请输入您下子的位置(悔棋请输入-1 -1):"<<endl;cin>>a>>b;if(a!=-1||b!=-1)if(a>=0&&a<=14&&b>=0&&b<=14)if(ch[a][b]!=0) cout<<"该地方已经有子,请重新下子"<<endl;else {ch[a][b]=2;buzhou[++sign_buzhou_num]=Sdian(a,b);break;}else cout<<"该地方已越界,请重新下子"<<endl;elseif(sign_buzhou_num==0)cout<<"悔棋失败"<<endl;else{Sdian dian1=buzhou[sign_buzhou_num--];Sdian dian2=buzhou[sign_buzhou_num--];Sdian dian3=buzhou[sign_buzhou_num];ch[dian1.a][dian1.b]=ch[dian2.a][dian2.b]=0;print();cout<<"电脑下子的位置:"<<dian3.a<<","<<dian3.b<<endl;sign_bushu-=2;}}else{if(sign_bushu!=2){ChessScore();srand(time(NULL));int sign_max=Score[0][0],sign_num=0;for(int i=0;i<15;i++)for(int j=0;j<15;j++)sign_max=max(sign_max,Score[i][j]);for(int i=0;i<15;i++)for(int j=0;j<15;j++){if(Score[i][j]==sign_max){dian[sign_num++]=Sdian(i,j);/*cout<<"###"<<endl;int aaa;cin>>aaa;*/}}Sdian sign_rand=dian[rand()%sign_num];a=sign_rand.a;b=sign_rand.b;ch[a][b]=1;buzhou[++sign_buzhou_num]=Sdian(a,b);///Sleep(2000);}else kaiju(buzhou[sign_buzhou_num].a,buzhou[sign_buzhou_num].b,a,b);}print();if(sign_bushu%2==0)cout<<"电脑下子的位置:"<<a<<","<<b<<endl;int jieguo=panduan(a,b);if(jieguo!=-1){sheng=jieguo;break;}sign_bushu+=1;}if(sheng==2)cout<<"恭喜您战胜了电脑!"<<endl;else cout<<"很遗憾您被电脑击败了,再接再厉!"<<endl;cout<<"输入1重新开始游戏,输入2退出:"<<endl;cin>>sign_start;}return 0;
}

C++五子棋算法Ai 简单的电脑智能博弈相关推荐

  1. php 五子棋算法,AI智能五子棋算法——假如我是计算机

    1.前言 记得读大学时,有段时间特别喜欢和室友们下五子棋,由于脑子不是特别灵光,再加上室友确实经验丰富,自己自然是屡屡战败.时光荏苒,一眨眼好多年过去了,很是怀念那时惬意的时光!大学毕业后,室友们都从 ...

  2. 五子棋游戏AI智能算法设计

    五子棋游戏C语言AI智能算法设计 近来发现编制五子棋游戏很有趣,尤其是AI智能算法很烧脑.网上介绍有什么贪心算法,剪枝算法,博弈树算法等等,不一而足. 对于人机对战的电脑智能应子算法,参阅很多五子棋书 ...

  3. 简单五子棋算法——初级篇

    简单五子棋算法--初级篇 前言 设计思路 算法实现 后言 进阶设计 前言 五子是中国古老的棋类之一,是老少咸宜的娱乐项目.也是人机博弈中最简单的一类,相较于围棋.象棋变化更少,算法实现起来就相对比较简 ...

  4. python五子棋算法_BetaMeow----利用机器学习做五子棋AI

    BetaMeow的起源 前段时间AlphaGo和李世石广受关注,作为人工智能的脑残粉,看完比赛后激动不已,因为有一定的机器学习的基础,便打算撸一个棋类的AI,但我还算有点自知之明,围棋AI,甚至goo ...

  5. 【人工智能】基于蒙特卡洛树搜索和策略价值网络的AI五子棋算法设计

    基于蒙特卡洛树搜索和策略价值网络的AI五子棋算法设计 摘要 蒙特卡洛树搜索算法 五子棋博弈的状态价值函数 附1:详细论文说明下载: 附2:实现代码下载(2022.10更新后代码): 摘要 随着人工智能 ...

  6. AI开发者大会之计算机视觉技术实践与应用:2020年7月3日《RPA+AI助力政企实现智能时代的人机协同》、《5G风口到来,边缘计算引领数据中心变革》、《数字化时代金融市场与AI算法如何结合?》

    AI开发者大会之计算机视觉技术实践与应用:2020年7月3日<RPA+AI助力政企实现智能时代的人机协同>.<5G风口到来,边缘计算引领数据中心变革>.<数字化时代金融市 ...

  7. ASIC加速:如何优化AI算法,让芯片更加智能?

    作者:禅与计算机程序设计艺术 ASIC加速:如何优化AI算法,让芯片更加智能? 引言 1.1. 背景介绍 随着人工智能(AI)算法在各个领域的广泛应用,其对计算需求也越来越高.传统的中央处理器(CPU ...

  8. c语言五子棋最简单的ai,C++简单五子棋的AI设计实现

    本文实例为大家分享了C++五子棋的AI设计实现代码,供大家参考,具体内容如下 设计思路:通过接口获取信息来确定颜色,通过set_chess函数来确定落点. 对每个点位给出两种颜色棋子的打分,分别存在两 ...

  9. AI机器学习实战の电磁智能车篇

    简 介: 本文在这里向大家介绍我们在RT106x的小车上部署实施AI的方法,以及一个base line的电磁导引神经网络模型,希望能抛砖引玉,激发同学们开动脑筋,将AI在电磁智能车上的应用发扬光大. ...

最新文章

  1. 使用Windows远程登录Ubuntu
  2. 68款大规模机器学习数据集,涵盖CV、语音、NLP | 十年资源集
  3. shell、javascript、python、tcl 等常用脚本语言
  4. 7-20(排序) 奥运排行榜(25 分)
  5. 工作之本地存储RAID5一硬盘离线恢复简要说明
  6. 【BZOJ2819】Nim 树状数组+LCA
  7. Sublime Text 3 快捷键总结
  8. 区块链和比特币以及挖矿
  9. Android|Qt笔记-某App注册机思路总结
  10. 图解 Android 广播机制
  11. 了解华为HCIP认证
  12. linux 端口映射
  13. 机器码、序列号、认证码、注册码的生成算法(四)
  14. php中拼音转汉字,php 汉字拼音如何转换
  15. Android APK脱壳--腾讯乐固、360加固一键脱壳
  16. Python使用正则表达式提取文本中ABAC和AABB形式的成语
  17. Linux gzip压缩/解压 *.gz文件详解
  18. js xlsx自定义样式导出
  19. 善于进步的人善于让步
  20. C# 使用Vlc播放视频或者监控

热门文章

  1. 第三单元 :资本成本笔记
  2. 组合数学$1排列组合
  3. 基于评论的推荐系统综述
  4. 如何解决运行Spark-shell,出现报错Unable to load native-hadoop library for your platform的问题
  5. opencv 数学形态学(2) 膨胀运算:dilate
  6. Unity3d 动态字体
  7. 【APPInventor\腾讯云】使用APPInventor开发连接腾讯云的安卓物联网遥控APP
  8. 最好用的jpg转pdf软件
  9. 中国程序员独闯硅谷,逆袭成美国最佳 CEO,公司市值 160 亿美元!
  10. Docker service命令详解