如何用python做一个简单的象棋AI

Python042

如何用python做一个简单的象棋AI,第1张

首先:Python语言在学术上非常受欢迎,不是计算机专业的人,很多都在学习Python。因为这个语言的前景是不可限量的,而且他的语法非常的简单易懂,这就让很多一些提及编程就恐慌的人减去了担心,现在已经是一人应该掌握一门编程语言的时代,很多不是程序员的人们,利用自己写的简单的小程序,让自己生活变得精彩起来,不管是因为兴趣,还是其他,生活好像变得美好起来,有了一些追求。

发展前景一:Linux运维

Linux运维是必须而且一定要掌握Python语言,Python是一门非常NB的编程语言,它可以满足Linux运维工程师的工作需求提升效率,总而提升自己的能力,运维工程师需要自己独立开发一个完整的自动化系统时,这个时候才是真正价值的体现,才能证明自身的能力,让老板重视。

发展前景二:Python Web网站工程师

我们都知道Web一直都是不可忽视的存在,我们离不开网络,离不开Web,利用Python的框架可以做网站,而且都是一些精美的前端界面,还有我们需要掌握一些数据的应用。

发展前景三:Python自动化测试

大家都知道,就是Python语言对测试的帮助是非常大的,自动化测试中Python语言的用途很广,可以说Python太强大,掌握和熟悉自动化的流程,方法和我们总使用的各个模板,到现在为止,我了解的Python使用最多的应该是自动化测试。

发展前景四:数据分析

我们都知道现在来临了大数据的时代,数据可以说明一切问题的原因,现在很多做数据分析的不是原来那么简单,Python语言成为了做数据分析师的第一首选,它同时可以给工作带来很大的效率。

发展前景五:人工智能

我们都知道谷歌制作出了的机器人战胜了一个围棋大师,这个就是目前刚出头的人工智能,当然我们的人工智能时代还没有到来,如果这天来了,生活和世界将会发生翻天覆地的变化,而且现在发展这么快,人工智能的时代不会太远。

以上就是目前比较好的几个Python的发展规划和前景,Python没有非常强势的问题,但是它简单的语言结构应用非常广泛,总的来说学习Python是不错的选择。

国际象棋可以说是最棒的棋盘游戏之一,它是战略战术和纯技术的完美融合。每位玩家开局时各有 16 枚棋子:一王、一后、两车、两马、两象和八兵,各具不同功能与走法。真人对弈可以凭借玩家的经验,步步为营。那么,对于一个机器——计算机,你该如何教会它下棋?近日,有人在 medium 上发表了一篇文章,详细解释了如何教计算机玩国际象棋。

本文将从 5 个方面进行介绍:

Board 表示;

Board 评估;

移动选择;

测试 AI;

接口测试。

在开始之前,你只需要提前安装 Python3。

Board 表示

首先,你需要对棋子背后的逻辑进行编码,即为每个棋子分配每一次可能的合法移动。

python-chess 库为我们提供了棋子的移动生成和验证,简化了工作,安装方式如下:

!pip install python-chess

python-chess 库安装好后,导入 chess 模块并进行初始化:

importchessboard = chess.Board()board

在 notebook 中的输出如下所示:

board 对象是一个完整的 board 表示,该对象为我们提供了一些重要的函数,例如,board.is_checkmate() 函数检查是否存在将杀(checkmate),board.push() 函数附加一个移动,board.pop() 函数撤销最后一次移动等。阅读完整的文档请参阅:https://python-chess.readthedocs.io/en/latest/

Board 评估

为了对 board 进行初步评估,必须考虑一位大师在各自比赛中的想法。

我们应该想到的一些要点是:

避免用一个小棋子换三个兵;

象总是成对出现;

避免用两个小棋子换一辆车和一个兵。

将上述要点以方程形式进行表达:

象 >3 个兵 &马 >3 个兵;

象 >马;

象 + 马 >车 + 兵。

通过化简上述方程,可以得到:象 >马 >3 个兵。同样,第三个方程可以改写成:象 + 马 = 车 + 1.5 个兵,因为两个小棋子相当于一个车和两个兵。

使用 piece square table 来评估棋子,在 8x8 的矩阵中设置值,例如在国际象棋中,在有利的位置设置较高的值,在不利的位置设置较低的值。

例如,白色国王越过中线的概率将小于 20%,因此我们将在该矩阵中将数值设置为负值。

再举一个例子,假设皇后希望自己被放在中间位置,因为这样可以控制更多的位置,因此我们将在中心设置更高的值,其他棋子也一样,因为国际象棋都是为了保卫国王和控制中心。

理论就讲这些,现在我们来初始化 piece square table:

pawntable=[0,0,0,0,0,0,0,0,5,10,10,-20,-20,10,10,5,5,-5,-10,0,0,-10,-5,5,0,0,0,20,20,0,0,0,5,5,10,25,25,10,5,5,10,10,20,30,30,20,10,10,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0]knightstable=[-50,-40,-30,-30,-30,-30,-40,-50,-40,-20,0,5,5,0,-20,-40,-30,5,10,15,15,10,5,-30,-30,0,15,20,20,15,0,-30,-30,5,15,20,20,15,5,-30,-30,0,10,15,15,10,0,-30,-40,-20,0,0,0,0,-20,-40,-50,-40,-30,-30,-30,-30,-40,-50]bishopstable=[-20,-10,-10,-10,-10,-10,-10,-20,-10,5,0,0,0,0,5,-10,-10,10,10,10,10,10,10,-10,-10,0,10,10,10,10,0,-10,-10,5,5,10,10,5,5,-10,-10,0,5,10,10,5,0,-10,-10,0,0,0,0,0,0,-10,-20,-10,-10,-10,-10,-10,-10,-20]rookstable=[0,0,0,5,5,0,0,0,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,-5,0,0,0,0,0,0,-5,5,10,10,10,10,10,10,5,0,0,0,0,0,0,0,0]queenstable=[-20,-10,-10,-5,-5,-10,-10,-20,-10,0,0,0,0,0,0,-10,-10,5,5,5,5,5,0,-10,0,0,5,5,5,5,0,-5,-5,0,5,5,5,5,0,-5,-10,0,5,5,5,5,0,-10,-10,0,0,0,0,0,0,-10,-20,-10,-10,-5,-5,-10,-10,-20]kingstable=[20,30,10,0,0,10,30,20,20,20,0,0,0,0,20,20,-10,-20,-20,-20,-20,-20,-20,-10,-20,-30,-30,-40,-40,-30,-30,-20,-30,-40,-40,-50,-50,-40,-40,-30,-30,-40,-40,-50,-50,-40,-40,-30,-30,-40,-40,-50,-50,-40,-40,-30,-30,-40,-40,-50,-50,-40,-40,-30]

#绘制棋盘,每个格子50

import turtle

t=turtle.Pen()

bs=50

#画直线

def line(x,y,z):

    t.penup()

    t.goto(x,y)

    t.pendown()

    t.fd(z)

#两点直线

def any(a,b,c,d):

    t.penup()

    t.goto(a,b)

    t.pendown()

    t.goto(c,d)

#画L型

def typeL(x,y):

    t.penup()

    t.goto(x-bs*0.25, y+bs*0.075)

    t.pendown()

    t.goto(x-bs*0.075, y+bs*0.075)

    t.goto(x - bs*0.075, y + bs*0.25)

    t.penup()

    t.goto(x - bs*0.25, y - bs*0.075)

    t.pendown()

    t.goto(x - bs*0.075, y - bs*0.075)

    t.goto(x - bs*0.075, y - bs*0.25)

    t.penup()

    t.goto(x+bs*0.25, y+bs*0.075)

    t.pendown()

    t.goto(x+bs*0.075, y+bs*0.075)

    t.goto(x + bs*0.075, y + bs*0.25)

    t.penup()

    t.goto(x + bs*0.25, y - bs*0.075)

    t.pendown()

    t.goto(x + bs*0.075, y - bs*0.075)

    t.goto(x + bs*0.075, y - bs*0.25)

#画半L型

def typehL(x,y,z):

    if(z=='l'):

        t.penup()

        t.goto(x-bs*0.25, y+bs*0.075)

        t.pendown()

        t.goto(x-bs*0.075, y+bs*0.075)

        t.goto(x - bs*0.075, y + bs*0.25)

        t.penup()

        t.goto(x - bs*0.25, y - bs*0.075)

        t.pendown()

        t.goto(x - bs*0.075, y - bs*0.075)

        t.goto(x - bs*0.075, y - bs*0.25)

    if(z=='r'):

        t.penup()

        t.goto(x + bs*0.25, y + bs*0.075)

        t.pendown()

        t.goto(x + bs*0.075, y + bs*0.075)

        t.goto(x + bs*0.075, y + bs*0.25)

        t.penup()

        t.goto(x + bs*0.25, y - bs*0.075)

        t.pendown()

        t.goto(x + bs*0.075, y - bs*0.075)

        t.goto(x + bs*0.075, y - bs*0.25)

#画横线

p=bs*4.5

while(p>=-bs*4.5):

    line(-bs*4,p,bs*8)

    p=p-bs

any(bs*4,bs*4.5,bs*4,-bs*4.5)

any(-bs*4,bs*4.5,-bs*4,-bs*4.5)

t.right(90)

q=-bs*3

while(q<bs*4):

    line(q,bs*4.5,bs*4)

    q=q+bs

q=-bs*3

while(q<bs*4):

    line(q,-bs*0.5,bs*4)

    q=q+bs

#画斜线

any(-bs,-bs*4.5,bs,-bs*2.5)

any(bs,-bs*4.5,-bs,-bs*2.5)

any(-bs,bs*4.5,bs,bs*2.5)

any(bs,bs*4.5,-bs,bs*2.5)

#画L型

typeL(-bs*2,-bs*1.5)

typeL(0,-bs*1.5)

typeL(bs*2,-bs*1.5)

typeL(-bs*2,bs*1.5)

typeL(0,bs*1.5)

typeL(bs*2,bs*1.5)

typeL(-bs*3,-bs*2.5)

typeL(bs*3,-bs*2.5)

typeL(-bs*3,bs*2.5)

typeL(bs*3,bs*2.5)

typehL(-bs*4,-bs*1.5,'r')

typehL(bs*4,-bs*1.5,'l')

typehL(-bs*4,bs*1.5,'r')

typehL(bs*4,bs*1.5,'l')

turtle.done()