零基础学Python之—AI五子棋(1)

零基础学Python之—AI五子棋(1)

今天是小编学习Python的第二天,有点小激动,因为我 昨天试了下水,做了一个Python的小弹球游戏,代码copy一路畅通,效果也还不错,而且,我居然还得了60个赞,很高兴,因为这是我第一次写技术博客超过十个赞的,于是乎,我快马加鞭,赶紧推出了我的Python学习第二部!

在这里小编建议大家先去看一下我的上一篇博客

Python,30分钟零基础到弹球小游戏(分享自知乎网)zhuanlan.zhihu.com/p/28

关于Python怎么画图在上一篇博客中有讲述哦

另外小编也是才接触Python,博客是为了分享自己的学习方法,学习过程

另外有学的Python想法的小伙伴们一定要开始学哦,当然,跟着我的节奏一起学也不错啊嘿嘿

我觉得我这里重在讲两个观点: 敢干!当你遇见一个不知道的问题或者没听过的概念的时候,你要有一个这就其实是一个概率一个问题的思维!而不是,握草,没听过啊,好牛逼的样子,我不会啊...

会解决问题,会for help,会百度,然后,当你敢于解决问题,并学会解决问题的时候,不知不觉中,你就是大神,大神就是你了!


这一次我将为大家带来我的第二个小作品—AI五子棋(基于博弈树算法),其实在上一篇博客的基础上,再去做个五子棋的难度并不大,按照上一次所说,这一次写五子棋也按步骤,一步一步来!


第一步:绘制棋盘

无非就是几根竖线几根横线,首先创建一个窗体,然后给窗体加上画布,再画线,就可以绘制出棋盘了,代码如下:

for num in range(1,17):
canvas.create_line(num*30,30,num*30,480,width=2)
for num in range(1,17):
canvas.create_line(30,num*30,480,num*30,width=2)

当然,for循环的方法也是我百度的,但是绘制棋盘的时候遇到了一个问题

画布左边的线 canvas.create_line(0,0,0,450)显示不出来,于是我将线加粗,于是得到


只有一条细细的线,大概是最左边那里可能会遮挡吧,于是乎我就将画布增大,将棋盘移到中间,就这样,香喷喷的棋盘就这样出炉了!


第二步:给画布加鼠标监听,画棋子

给画布加监听是为了让我们点击一下鼠标,就在click的那个点画一个棋子,从而实现下棋功能。

好!心中默念一声,百度大法好 !

duang~


监听方法找到了,这监听起来可比Java简单多了,好,一波复制粘贴下来,走一波



摁一下,画一下圆,感觉不太对劲,监听的应该不是点击事件,继续百度,鼠标点击监听


将<B1-Motion> 改成<Button-1>,走一波,完美,点哪儿画哪儿,美滋滋

然后,我们可以发现,鼠标点击的点很可能不会下在棋盘的点上,因此,就需要我们处理一下画圆的数据,如果点击的点离哪边儿近,那我就画在哪,我这儿棋盘的宽度设置的是30。所以当点击的除以30剩下的值大于15就画在右边的棋盘点,反之则画在左边,上下亦然。

再我用了这个方法后,结果棋子还是没有落在棋盘点上,输出一下处理后的点,发现并不是整数。不用想,肯定是语法问题了,百度走一波


Python 里面的 / 并不像c/Java里面那样,是正真的除法,没有经过处理的,所以,这里应该用//

所以我现在印象很深刻 "//"等于Java里面的"/",以及,Python没有++i和i++这种运算符

也许,像这样子错一下,也许比直接看书,更加让人记忆深刻吧 !


第三步:黑白轮回,用二维数组表示棋子

黑棋白棋轮流下很简单,设置一个全局变量color_number=0,每点击一次鼠标,color_number+=1,不能用color_number++,当color_number%2==0时,在相应的点画黑棋,反之,画白棋。

在这里又遇到一个问题,在color_number+=1的时候会报错,看看报错原因,与全局变量与局部变量有关,好吧,继续百度

新知识点get,但是还是想查他个水落石出~,这里就不一一贴上来了

好了,能黑白轮流下了,但是在黑棋上点一下,就会变成白棋,再点一下,又变成黑棋了,这个问题好解决,创建一个二维数组,用0表示改点为空,1表示黑棋,2表示白棋。只有当改点为0的时候,在可以下棋。

啥,二维数组不会?二维数组不对劲?好吧,继续百度: python二维数组



能百度就百度,不要说不会,让一切问题都扼杀在百度的摇篮里吧!(有点像百度水军的感觉哈哈)


第五步,判断输赢

之前见过有人判断输赢遍历整个棋盘寻找有没有五子连珠,其实没必要这样做,你只要在当前下的点往四个方向搜一下,判断四个方向有没有五子连珠就OK了,这里因为我语法不太会,我直接全部写在一起了,下面贴代码

def isgameover( xx , yy):
count =0
#向左搜索
for i in range (xx+1 ,17 ):
if array[i][yy] == array[xx][yy] :
count += 1
else:
break
#向右搜索
for i in range ( xx ,0,-1 ) :
if array[i][yy] == array[xx][yy]:
count += 1
else :
break
if count == 5 :
tkinter.messagebox.showinfo("","Game over")
count =0
#向下搜索
for i in range (yy+1 ,17 ):
if array[xx][i] == array[xx][yy] :
count+=1
else:
break
#向上搜索
for i in range ( yy ,0,-1 ) :
if array[xx][i] == array[xx][yy]:
count += 1
else :
break
if count == 5 :
tkinter.messagebox.showinfo("","Game over")
count =0
#向右下搜索
for i,j in zip( range(xx+1,17),range (yy+1,17)):
if array[i][j] == array[xx][yy] :
count+=1
else:
break
#向左上搜索
for i,j in zip(range(xx,0,-1),range ( yy ,0,-1 ) ):
if array[i][j] == array[xx][yy]:
count += 1
else :
break
if count == 5 :
tkinter.messagebox.showinfo("","Game over")
count =0
#向左下搜索
for i, j in zip(range(xx -1, 0,-1), range(yy + 1, 17)):
if array[i][j] == array[xx][yy]:
count += 1
else:
break
#向右上搜索
for i, j in zip(range(xx, 17), range(yy, 0, -1)):
if array[i][j] == array[xx][yy]:
count += 1
else:
break
if count == 5:
tkinter.messagebox.showinfo("","Game over")
count = 0


第六步:悔棋


第七步:加AI

六七步下次再给大家补上,在这里小编还是想说一句:有问题,不要说我不会,因为一旦你这样说,很多情况下,大概率我们是不会去解决这个不会的问题的。个人觉的,在网上资源这么丰富的情况下,只要你敢干,不怂,肯百度,肯学习,什么东西都会变得很简单的。

小编也是才学计算机不久,如果有什么问题,欢迎大家指出来

不小心把第二篇删除了。。。。怎么办

编辑于 2018-11-26