博舍

Python做人工智能让电脑自己学会玩游戏,实战带你入门机器学习 人工智能小游戏编写教程

Python做人工智能让电脑自己学会玩游戏,实战带你入门机器学习

前言

之前本号就有一篇文章是关于用Python编写一个"拿石子"游戏,一个能让你与电脑对弈的小游戏,但其中电脑玩家的选择是随机的,意味着你是与一个智障电脑在玩游戏。

今天我们更进一步,编写程序让这个智障电脑可以自己与自己不断玩这个"拿石子"游戏,最终学会如何赢得这个游戏。不仅如此,我们还可以通过这个训练后的电脑玩家得知这个游戏的必胜秘诀(文末处)。下面看看示意动图。

高能预警,本文与之前的文章不一样,需要自己实现一个强化学习中的一个小算法,但这个算法不难,而且可以广泛应用到其他同类型的博弈问题中,可以让你做出有趣的东西出来。我们开始吧。

"拿石子"游戏规则

拿石子游戏规则很简单,开始有一定数量的石子(假如是10),然后两人轮流从石子堆中取走一定范围的数量(例如是1到3),以此类推,最后拿走剩余的所有石子的人就输了。

本文需要的库

numpypandasretrying

[Java五子棋小游戏

五子棋智能下棋怎么实现的?来揭晓吧

源码连接:Java五子棋小游戏(控制台纯Ai算法)

基本权重计算

现在说说五子棋胜算是怎样判定的这里就说到权重如果你下棋的位置的权重是4那么你就能获得游戏的胜利

这里说位置1>2>3>4>O的权重O的最大权重是4如果他在这个位置下棋了那么他就能获得游戏的胜利

这里的O代表着下棋的位置

有的人怪说了如果下棋的位置位于中间呢正好集齐5个棋子这里也要说明一下

反向计算权重

像这种情况其实可以反向查询权重然后把它加起来例如图中1>5>O的方向假如后面还有两个棋子那么下O的位置就会获得游戏胜利我们可以反向取权重前面权重是2后面权重是2加起来正好是4所以获得游戏胜利

稍后在高级算法详解

权重实现代码

这里我自己把之前发的java代码扣过来了

/*x和y代表坐标*xx:x方向需要增加的值*yy:y方向需要增加的值**例如xx=-1yy=-1*代表需要获取(x-1,y-1)的棋子**xx=1yy=1*代表需要获取(x+1,y+1)的棋子***//***计算权重*@paramxx坐标*@paramyy坐标*@paramxxx方向*@paramyyy方向*@paramsize缓存变量如果当前检测是棋子是你的棋子*那么就会保存这个变量继续递归获取下一个位置的权重*@paramc自己的棋子颜色*@return返回计算后的权重*/privateintishas(intx,inty,intxx,intyy,intsize,charc){//边缘检测防止超出棋盘位置if((x==0&&xx==-1)||(x==15&&xx==1)||(y==0&&yy==-1)||(y==15&&yy==1))returnsize;//如果if(table[x+xx][y+yy]==c){returnishas(x+xx,y+yy,xx,yy,size+1,c);}returnsize;}计算权重伪代码–如果看着上面的费劲看这个chartable[16][16];//棋盘/**x和y代表坐标*xx:x方向需要增加的值*yy:y方向需要增加的值**例如xx=-1yy=-1*代表需要获取(x-1,y-1)的棋子**xx=1yy=1*代表需要获取(x+1,y+1)的棋子**/计算权重(x,y,xx,yy,初始权重简称->权重,你棋子的颜色简称->颜色){//边缘检测防止超出棋盘位置if((x==0&&xx==-1)||(x==15&&xx==1)||(y==0&&yy==-1)||(y==15&&yy==1))return权重;//不能计算墙以外的所以直接返回权重/*上面这句话的意思是就拿第一个(x==0&&xx==-1)来说:如果他的横坐标为x那么就不能再进行x-1操作了因为棋盘就这么大*///这里假设xx和yy=1//如果棋盘里的指定的格子(x+1,y+1)的颜色和你的棋子颜色一样那么就对那个棋子在进行一次计算权重if(table[x+xx][y+yy]==颜色){return计算权重(x+xx,y+yy,xx,yy,权重+1,颜色);//递归//x坐标y坐标下一个棋子方向本次计算权重+1颜色不变}//如果不等直接把权重的值返回return权重;}游戏运算伪代码

这里用伪代码写吧

chartable[16][16];//棋盘Playerp1=newPlayer("P1","黑");//这里就不弄类了懂啥意思就行Player.下棋(){//里面定义的方法控制台输入Playerp=获取下棋玩家(轮到谁返回谁);p.下棋()打印棋盘();}

一个十分简陋的程序就写出来了,这就是游戏运行过程单拿这个代码创建两个玩家,可以人对人下棋

Ai是怎么下棋的

人与人的PK方法已经知道了下面就来说说Ai下棋算法思路还是拿权重的图

初级算法发现对我有威胁的格子我要赶紧补坑对我威胁不大的我走我自己的伪代码实现chartable[16][16];//棋盘List棋子列表;//Ai玩家也是玩家所以他有玩家的功能只不过下棋方式是自己定义的classAiPlayerextendsPlayer{@重写下棋(){//里面定义的方法控制台输入if(当前格子颜色==空){//两个都要计算并且把计算结果保存到棋子类计算权重(x,y,对手)-->两个方向计算权重计算权重(x,y,自己)-->两个方向计算权重//如果权重一样那么对手权重-1让自己先来谁的权重大-->棋子列表.加入棋子(new棋子(x,y,权重))}}//遍历完毕棋子列表.按权重排序()返回棋子=棋子列表.get(0);return(返回棋子);}}下一篇[Java五子棋小游戏-Ai算法精讲以及实现]-02-高级算法初步

源码连接:Java五子棋小游戏(控制台纯Ai算法)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇