根据五子棋黑白子的摆法,大致分为下列几种情况:

A为黑(白)子,X为空格

成五:AAAAA
活四:XAAAAX
死四:XAAAA或AAAAX
活三:XAAAX
死三:XAAA或AAAX
活二:XAAX
死二:XAA或AAX
活一:A
死一:XA或AX

--------------------------------------------------------------------我是分隔线-------------------------------------------------------------------------------

假设电脑执【白子】,玩家执【黑子】。轮到电脑落子的时候,电脑将对每一个空子计算一个评估值(这个评估值越大,这个空子就越有价值让电脑的白子下在这儿),取出评估值最大的一个空子,作为电脑将要落子的位置。

评估函数:评估每个棋盘上的空子,被评估的空子将被填【白子】(因为是电脑落子么),填了白子后,需要评估【1】多少白子练成线(因为越多白子练成线,对电脑越有利)【2】多少将要练成线的黑子,被这个白子打断了(还要考虑填了这个子后,电脑对人所落的子的破坏力)。这两个评估值相加所得的和越大,对电脑越有利。

粗暴版AI返回的是:遇到的第一个评估值最高的空子。

由上面可以得出:这版的AI只顾眼前这一步的最好情况,他并不考虑后几步将会出现的情况。

-----------------------------------------------------------------------------我是分隔线---------------------------------------------------------------------------

计分表如下:

白子连成五子 +10000 阻碍黑子连成五子 +1000
白子连成活四 +200 阻碍黑子连成活四 +100
白子连成死四 +50 阻碍黑子连成死四 +20
白子连成活三 +30 阻碍黑子连成活三 +10
白子连成死三 +8 阻碍黑子连成死三 +5
白子成成活二 +2 阻碍黑子连成活二 +1
白子连成死二 +2 阻碍黑子连成死二 +1
白子连成活一 +1 阻碍黑子连成活一 +0
白子连成活二 +1 阻碍黑子连成死一 +0

-----------------------------------------------------------------------------我是分隔线---------------------------------------------------------------------------

棋盘为16*16,电脑执白子(为2),玩家执黑子(为1)评估函数+选择函数如下:对空子的横、竖、正斜、反斜进行评估,这里为了代码简短,四条线上重复计算了两遍

void evaluate_naive()    //每个空子的评估函数。需要对人落子和电脑已落子进行评价。人落子电脑要堵,电脑自己落子要做成5子
{        memset(score,0,sizeof(score));int number1,number2,empty;for(int x=0;x<16;++x)for(int y=0;y<16;++y)if(pos[x][y]==0)//评估每个空子for(int i=-1;i<=1;++i) for(int j=-1;j<=1;++j)if(!(i==0&&j==0))//0,0不动不用算 {number1=0,number2=0,empty=0;//对人落子评分(要对人所下的子进行围堵,玩家在这儿落子后的估分越高,电脑就越有必要下在这儿,来打破玩家的意图) for(int k=1;k<=5;++k)if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==1)  ++number1;else if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==0) {++empty;break;}else  break;for(int k=-1;k>=-5;--k)if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==1)    ++number1;else if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==0) {++empty;break;}else  break;if(number1==1)  score[x][y]+=1;   //人若下该空子,就两子了,那么不管死活都是+1else if(number1==2) {if(empty==1)    score[x][y]+=5;   //三子,死,+5else if(empty==2) score[x][y]+=10;//三子,活,+10  }else if(number1==3){if(empty==1)  score[x][y]+=20;//四子,死,+20else if(empty==2)  score[x][y]+=100;//四子,活,+100 }else if(number1==4) score[x][y]+=1000;//五子,+1000//对电脑落子评分(我自己下了这个空子,会怎样)empty=0;for(int k=1;k<=5;++k)if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==2) ++number2;else if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==0) {++empty;break;}else  break;for(int k=-1;k>=-5;--k)if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==2)    ++number2;else if(x+i*k>=0&&x+i*k<=15&&y+j*k>=0&&y+j*k<=15&&pos[x+i*k][y+j*k]==0) {++empty;break;}else  break;if(number2==0)  score[x][y]+=1;   //电脑若下了该空子,就一子了,那么不管死活都是+1 else if(number2==1) score[x][y]+=2;   //两子,+2 else if(number2==2) {if(empty==1)   score[x][y]+=8;   //三子,死,+8else if(empty==2) score[x][y]+=30;//三子,活,+30 }    else if(number2==3){if(empty==1)   score[x][y]+=50;//四子,死,+50 else if(empty==2) score[x][y]+=200;//四子,活,+200 }else if(number2==4) score[x][y]+=10000;  //五子,+10000 }
}
void Chess::chess_ai_naive(int &x,int &y)//使用暴力法获取得分最高的空子
{//搜的是当前的第一个最优解 evaluate_naive();int maxpos=0;for(int i=0;i<16;++i)for(int j=0;j<16;++j)   if(score[i][j]>maxpos){maxpos=score[i][j];x=i;y=j;}
}

五子棋(人机)-粗暴版AI相关推荐

  1. C语言 AI智能,五子棋 人机对战,人人对战

    C语言五子棋,人机对战,人人对战 chunli@Linux:~$ cat main.c # include<stdio.h> # include<string.h> # inc ...

  2. 五子棋输赢算法php,js实现AI五子棋人机大战

    本文实例为大家分享了js实现AI五子棋人机大战的具体代码,供大家参考,具体内容如下 实现原理就是计算五子棋所有赢的种类,利用canvas实现五子棋排版落子. 五子棋 #canvas{ display: ...

  3. java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc

    基于Android平台五子棋游戏最终版 毕业设计(论文)任务书 毕业设计(论文)题目: 基于android平台的五子棋游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.综述国内基于and ...

  4. JAVAFX基于α-β剪枝树的五子棋人机博弈

    Main主类: 背景图片和音乐就不传了 package application;import java.util.Optional; import javafx.application.Applica ...

  5. C#实现五子棋人机对战的思路与源码分享

    前言 业余闲暇时,基于.netframework使用C#语言开发了一个五子棋人机对战的游戏,在此做些整理和分享,先上图. winform版 UI虽然很简洁,却花了些功夫,图形元素全动态生成,毕竟不是美 ...

  6. android五子棋赢法数组,安卓欢乐五子棋人机大战报告.doc

    安卓欢乐五子棋人机大战报告 实 验 报 告 课程名称实验名称安卓五子棋人机大战实验时间2016年 月 (系)专 业 一.实验目的 在棋盘上任意落下一颗子,计算机调用AI算法,能判断出最佳的落子位置并落 ...

  7. 最简洁粗暴版的虚拟用户配置FTP

    最简洁粗暴版的虚拟用户配置FTP yum安装FTP: yum install vsftpd pam* db4* -y 设置为系统服务:chkconfig –level 35 vsftpd on 2.v ...

  8. 飞行计算机人机工程,人机工程学版

    <人机工程学版>由会员分享,可在线阅读,更多相关<人机工程学版(18页珍藏版)>请在人人文库网上搜索. 1.人机工程学版,人体工程应用与实训宜家考察总结,2011级景观一班,人 ...

  9. java五子棋人机对战_实现简单的人机对战五子棋(实践)

    五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1.   基本概念 像素,坐标 2.   组件自定义绘图原理 3.   Graphic ...

最新文章

  1. map集合遍历_集合框架的部分内容
  2. 前端性能优化-HTTP添加Expires头和Cache-Control
  3. 正则表达式发明者_正则表达式 – 简介
  4. 如何做SEO项目管理?
  5. 下班到点想走,但老员工都没动,怎么办?
  6. java 取对象的类_Java中通过Class类获取Class对象的方法详解
  7. UE4 编译虚幻引擎
  8. netty支持哪些协议_从零学习netty网络IO通讯开发框架
  9. C++中sizeof详解
  10. python plot 增加标记线_Python可视化| matplotlib04-掌握标记和线型的使用,一文,marker,linestyle...
  11. 廖雪峰python教程-廖雪峰Python教程的配套视频教程,全套完整版!
  12. oracle 查看表空间及用户,oracle 表空间及查看所有用户的表空间
  13. 软件工程uml画图期末考试(新闻发布系统)
  14. HTML5中 audio标签的样式修改
  15. Correct the classpath of your application so that it contains a single, compatible version oforg.spr
  16. vue flv.js实时播放监控视频 .flv 格式
  17. ReactOS实践(一) ReactOS 源代码编译以及VMWare下运行
  18. 清华大学计算机崔勇,崔勇 简历 - 名人简历
  19. 手写Vue个人组件库——fl-Lazyimg 图片懒加载
  20. Ubuntu 安装sogo输入法

热门文章

  1. 数据库底层原理-------数据结构
  2. Unity官方中文版(有生之年终于等到了)
  3. UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
  4. 《RAFT-Stereo:Multilevel Recurrent Field Transforms for Stereo Matching》论文笔记
  5. PTA 7-94 奇偶数判断
  6. 基于yacto构建am5728 SDK
  7. git踩坑——中途才使用.gitignore文件
  8. (编程题)相邻数字相乘为偶数
  9. android 高性能框架,高性能架构
  10. 基于java springboot和vue的酒店管理系统