五子棋(人机)-粗暴版AI
根据五子棋黑白子的摆法,大致分为下列几种情况:
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相关推荐
- C语言 AI智能,五子棋 人机对战,人人对战
C语言五子棋,人机对战,人人对战 chunli@Linux:~$ cat main.c # include<stdio.h> # include<string.h> # inc ...
- 五子棋输赢算法php,js实现AI五子棋人机大战
本文实例为大家分享了js实现AI五子棋人机大战的具体代码,供大家参考,具体内容如下 实现原理就是计算五子棋所有赢的种类,利用canvas实现五子棋排版落子. 五子棋 #canvas{ display: ...
- java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc
基于Android平台五子棋游戏最终版 毕业设计(论文)任务书 毕业设计(论文)题目: 基于android平台的五子棋游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.综述国内基于and ...
- JAVAFX基于α-β剪枝树的五子棋人机博弈
Main主类: 背景图片和音乐就不传了 package application;import java.util.Optional; import javafx.application.Applica ...
- C#实现五子棋人机对战的思路与源码分享
前言 业余闲暇时,基于.netframework使用C#语言开发了一个五子棋人机对战的游戏,在此做些整理和分享,先上图. winform版 UI虽然很简洁,却花了些功夫,图形元素全动态生成,毕竟不是美 ...
- android五子棋赢法数组,安卓欢乐五子棋人机大战报告.doc
安卓欢乐五子棋人机大战报告 实 验 报 告 课程名称实验名称安卓五子棋人机大战实验时间2016年 月 (系)专 业 一.实验目的 在棋盘上任意落下一颗子,计算机调用AI算法,能判断出最佳的落子位置并落 ...
- 最简洁粗暴版的虚拟用户配置FTP
最简洁粗暴版的虚拟用户配置FTP yum安装FTP: yum install vsftpd pam* db4* -y 设置为系统服务:chkconfig –level 35 vsftpd on 2.v ...
- 飞行计算机人机工程,人机工程学版
<人机工程学版>由会员分享,可在线阅读,更多相关<人机工程学版(18页珍藏版)>请在人人文库网上搜索. 1.人机工程学版,人体工程应用与实训宜家考察总结,2011级景观一班,人 ...
- java五子棋人机对战_实现简单的人机对战五子棋(实践)
五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1. 基本概念 像素,坐标 2. 组件自定义绘图原理 3. Graphic ...
最新文章
- map集合遍历_集合框架的部分内容
- 前端性能优化-HTTP添加Expires头和Cache-Control
- 正则表达式发明者_正则表达式 – 简介
- 如何做SEO项目管理?
- 下班到点想走,但老员工都没动,怎么办?
- java 取对象的类_Java中通过Class类获取Class对象的方法详解
- UE4 编译虚幻引擎
- netty支持哪些协议_从零学习netty网络IO通讯开发框架
- C++中sizeof详解
- python plot 增加标记线_Python可视化| matplotlib04-掌握标记和线型的使用,一文,marker,linestyle...
- 廖雪峰python教程-廖雪峰Python教程的配套视频教程,全套完整版!
- oracle 查看表空间及用户,oracle 表空间及查看所有用户的表空间
- 软件工程uml画图期末考试(新闻发布系统)
- HTML5中 audio标签的样式修改
- Correct the classpath of your application so that it contains a single, compatible version oforg.spr
- vue flv.js实时播放监控视频 .flv 格式
- ReactOS实践(一) ReactOS 源代码编译以及VMWare下运行
- 清华大学计算机崔勇,崔勇 简历 - 名人简历
- 手写Vue个人组件库——fl-Lazyimg 图片懒加载
- Ubuntu 安装sogo输入法
热门文章
- 数据库底层原理-------数据结构
- Unity官方中文版(有生之年终于等到了)
- UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
- 《RAFT-Stereo:Multilevel Recurrent Field Transforms for Stereo Matching》论文笔记
- PTA 7-94 奇偶数判断
- 基于yacto构建am5728 SDK
- git踩坑——中途才使用.gitignore文件
- (编程题)相邻数字相乘为偶数
- android 高性能框架,高性能架构
- 基于java springboot和vue的酒店管理系统