专栏首页用户4381798的专栏10.带人机对战的五子棋程序

10.带人机对战的五子棋程序

今天我们带来一个带人机对战功能的五子棋程序。程序基于前面文章中的框架搭建,新增人机对战的策略。程序基于规则进行决策,不考虑禁手,玩家执黑子先行。棋盘规模采用15乘15,棋盘规模容易扩展,程序棋力中等,可以用来放松陪玩。

image.png

程序每一步都会搜索棋盘所有可以落子的位置,然后识别出最值得落子的位置,实现进攻和围堵。目前评估值为人为设置,所以程序棋力只能与编者相当,勉强算作中等棋力,后期若引入遗传算法或者强化学习,通过养蛊之法,可以养出更高棋力的程序。部分代码如下(简书中插入代码还是比较方便的:-):

#带AI的五子棋程序
import wx
UNIT=30
ROW_NODE_NUM=15
BOARD = []
for i in range(UNIT, UNIT * ROW_NODE_NUM + UNIT, UNIT):
    for j in range(UNIT, UNIT * ROW_NODE_NUM + UNIT, UNIT):
        BOARD.append((j, i))
print(BOARD)
class myFrame(wx.Frame):
    def __init__(self):
        self.unit = UNIT
        self.pointNum = ROW_NODE_NUM#每行落棋点数
        self.pieceNum=0
        self.bkCol=(220, 210, 0)
        self.wht=(255,255,255)
        self.blk=(0,0,0)
        self.actColor=self.blk
        self.piecePos =[]
        self.piecePosCols =[]
        # 元组列表记录落棋位置和落棋颜色
        super().__init__\
            (parent=None,pos=[800,100],
             size=[self.unit*self.pointNum
                   +self.unit+20,
                   self.unit*self.pointNum
                   +self.unit+30+20],
             title="商贾三国")
        self.SetIcon(wx.Icon("WeatherBundle.ico"))
        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour(self.bkCol)
        self.tip = \
            wx.TextCtrl(self.panel, -1, "",
                        pos=(self.unit*self.pointNum
                             +self.unit-80, 0),
                        size=(80,25))
        self.tip.SetBackgroundColour(self.bkCol)
        self.panel.Bind(wx.EVT_PAINT,self.draw)
        self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)
        self.Show()
    def draw(self,event):
        mydc=wx.PaintDC(self.panel)
        unit=self.unit
        pointNum=self.pointNum
        x=unit
        y=unit
        for i in range(1,pointNum+1):
            mydc.DrawLine(x,y,x,unit*pointNum)
            x=x+unit
        x=unit
        for i in range(1,pointNum+1):
            mydc.DrawLine(x, y, unit*pointNum, y)
            y=y+unit
        for i in range(0,len(self.piecePos)):
            mydc.SetBrush(wx.Brush(self.piecePosCols[i][2]))
            mydc.DrawCircle(self.piecePos[i][0],
                            self.piecePos[i][1], self.unit / 2.5)
    def OnClick(self,event):
        unit=self.unit
        pos = event.GetPosition()
        mydc=wx.ClientDC(self.panel)
        mydc.SetBrush(wx.Brush(self.actColor))
        x = round(pos.x / unit) * unit
        y = round(pos.y / unit) * unit
        piecePo = (x, y)
        if piecePo in BOARD:
            if piecePo not in self.piecePos:
                if self.actColor == self.blk:
                    piecePoCol=(x,y,self.actColor)
                    if piecePo not in self.piecePos:
                        mydc.DrawCircle(x,y,self.unit/2.5)
                        self.piecePos.append(piecePo)
                        self.piecePosCols.append(piecePoCol)
                        self.fiveChk(piecePo)
                        self.pieceNum = self.pieceNum+1
                        print(self.pieceNum)
                        self.tip.SetValue('%s,%s' % (x,y))
                        self.actColor = self.wht
                if self.actColor == self.wht:
                    self.board()
                    print(self.result)
                    mydc.SetBrush(wx.Brush(self.actColor))
                    x = self.result[0]
                    y = self.result[1]
                    piecePo = (x, y)
                    piecePoCol = (x, y, self.actColor)
                    if piecePo not in self.piecePos:
                        mydc.DrawCircle(x, y, self.unit / 2.5)
                        self.piecePos.append(piecePo)
                        self.piecePosCols.append(piecePoCol)
                        self.fiveChk(piecePo)
                        self.pieceNum = self.pieceNum + 1
                        print(self.pieceNum)
                        self.tip.SetValue('%s,%s' % (x, y))
                        self.actColor = self.blk

总体代码比较多,限于篇幅,获取完整源码可以移步公众号:哈哈哈利,回复五子棋人机对战,可以获取决策部分代码。

五子棋程序已经打包为exe,可以脱离Python环境,程序获取路径如下:链接:https://pan.baidu.com/s/19U9AZa0Msoyt6xs-OpuDNA 提取码:q940 感兴趣可以用来放松娱乐。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 6.wxPython防止窗体重画棋子消失的机制

    可以画图的类中wx.ClientDC不必依赖窗体绘画事件,可以随时实例化,随时画图。但是窗体最小化之后再恢复,重画的窗体上通过wx.ClientDC绘制的棋子会...

    用户4381798
  • 7.wxPython制作一个桌面精灵

    今天我们通过窗体的SetShape()函数来制作一个桌面精灵。我们制作的桌面精灵本质上还是一个窗体,只不过是一个特殊格式的窗体。我们创建一个style=wx.F...

    用户4381798
  • 11.实现AI对战AI的五子棋程序

    在前文AI人机对战的五子棋程序的基础上,我们加入了AI对战AI的功能。动态图中黑白棋子都是程序通过内置的逻辑控制落子,实现AI与AI之间的对战。这一版程序的AI...

    用户4381798
  • PyQt5 非模态对话框(live 型)

    本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动...

    用户6021899
  • 理解unittest测试框架(四)——执行模块

    前文讨论了很多关于用例组织相关的内容,这里看看unittest的执行模块。执行模块的内容不多,这里我们带着生成测试报告的HTMLTestRunner.py的逻辑...

    点点寒彬
  • python项目练习十:DIY街机游戏

    终于来到了最后一个项目,看看前面的那些练习,也算是熟悉了python的基本操作,也知道python能干哪些事情,最后一个项目相比于以前的稍微复杂些,但是任何一个...

    the5fire
  • vn.py源码解读(一、环境配置与回测初试)

            近来忙于毕业找工作,也不知道能不能继续在量化界混了。周末比较闲,抽空研究了一下vn.py。有人说,为什么学那么多的回测平台呀。其实我个人觉得,做...

    钱塘小甲子
  • vn.py源码解读(四、主引擎代码分析----初始化函数)

            vnpy有一个叫做主引擎的东西,在三里面也说过,个人觉得这个应该是一个运行框架的东西,不应该叫做引擎,不过没关系,名字而已嘛。这一篇呢主要就是分...

    钱塘小甲子
  • vn.py源码解读(七、回测代码解析)

            原本想开始讲策略类的编写,后来觉得,结合回测代码其实能够更好的理解,所以先解读一下vnpy回测的代码吧,后续自己也想把vnpy回测的部分优化一下...

    钱塘小甲子
  • DIY 雪花特效(一)

    首先我们需要雪花的图片,比如下面这张(其实这张有点不太真实,不过无妨,我只是拿它来做演示)。

    用户6021899

扫码关注云+社区

领取腾讯云代金券