在前文AI人机对战的五子棋程序的基础上,我们加入了AI对战AI的功能。动态图中黑白棋子都是程序通过内置的逻辑控制落子,实现AI与AI之间的对战。这一版程序的AI逻辑在上一版本的基础上加入了些微的随机属性,当遇到多个相同的最优落子点时,通过随机的方式进行选择,这里用到了random.choice。 由于并没有对两个下棋的AI引入多少差异,所以黑白双方棋力不相上下攻守交替,并没有出现一方压倒一方的情形。后期在初版AI的基础上,对逻辑的权值进行一定规则的随机生成,扩充AI的数量,便可以产生出一些棋力更高的逻辑块。目前程序棋力中等,存在一些逻辑陷阱,没有学习能力,上文引入随机属性,也是为了使逻辑块能够自行跳出这些逻辑陷阱。
部分代码如下:
代码语言:javascript复制 def aivsai(self,event):
unit = self.unit
mydc = wx.ClientDC(self.panel)
mydc.SetBrush(wx.Brush(self.actColor))
x = 210
y = 210
piecePo = (x, y)
piecePoCol = (x, y, self.actColor)
mydc.DrawCircle(x, y, self.unit / 2.5)
self.piecePos.append(piecePo)
self.piecePosCols.append(piecePoCol)
self.pieceNum = self.pieceNum 1
self.tip.SetValue('%s,%s' % (x, y))
self.actColor = self.wht
self.timer.Start(1200)
def onTimer(self,event):
self.play()
if self.pieceNum >= ROW_NODE_NUM * ROW_NODE_NUM-50:
self.timer.Stop()
dlg = wx.MessageDialog(None, u"对局结束", u"平局",
wx.YES_NO | wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_YES:
dlg.Destroy()
self.Destroy()