PyQt实现人机对战五子棋
一、几个主要函数
- score()
对活2,活3,活4等进行打分
- evalBoard()
在位置(x,y)落子后,就评估这一点对整个棋盘局势的影响,即从这一点开始向四周8个方向,四条线上进行搜索,按形成的连2,连3,活3等进行估分
思路不难,就是实现比较复杂,代码较多
- isWin()函数:判断棋盘是否分出输赢
该函数和evalBoard()函数类似,都要当前落子位置向四面八方进行搜索
- computerStep()
预测一步,进行防守和进攻判断
防守估值:假设玩家下在这个位置,能获得多大的优势,取一个优势最大的位置,电脑来抢占这个位置,使玩家失去获得最大优势的机会,记为maxDefend
进攻估值:电脑去试探棋盘中所有空闲的位置,对每个位置进行估分,找出得分最高的位置,记为maxAttack
比较maxAttack和maxDefend,来决定下一步是进攻还是防守
#电脑落子 def computerStep(self): #1.电脑防守,假设玩家下这个位置,能获得很大优势,电脑就要抢占这个位置 maxD=0 stepPosD=[0,0] for i in range(self.lineNum): for j in range(self.lineNum): if self.chessBoard[i][j]: continue self.chessBoard[i][j]==self.man temp=self.evalBoard(i,j,self.man) if maxD < temp: maxD=temp stepPosD=[i,j] print "(%d,%d)=%d" %(i,j,temp) self.chessBoard[i][j]==0 #2.电脑进攻,电脑去试探每个步骤,看看优势 maxA=0 stepPosA=[0,0] for i in range(self.lineNum): for j in range(self.lineNum): if self.chessBoard[i][j]: continue self.chessBoard[i][j]==self.computer temp=self.evalBoard(i,j,self.computer) if maxA < temp: maxA=temp stepPosA=[i,j] print "(%d,%d)=%d" %(i,j,temp) self.chessBoard[i][j]==0 #3.判断电脑是进攻还是防守 if maxA > maxD: return stepPosA else: return stepPosD
二、两个事件
- paintEvent
在连连看中已有介绍,不再赘述
def paintEvent(self, event): print "this is an event" self.painter.begin(self) self.drawChessBoard() for i in range(self.lineNum): for j in range(self.lineNum): if self.chessBoard[i][j]!=0: self.drawChessMan(i, j, self.chessBoard[i][j]) self.painter.end()
- mousePressEvent
捕获鼠标左键信号,玩家落子
def mousePressEvent(self, event): clickPos = event.pos() x=self.y(clickPos) y=self.x(clickPos) #print "coord position(%d,%d)" %(x,y) if not self.gameOverFlag and event.button()==QtCore.Qt.LeftButton and not self.chessBoard[x][y]: print "left click" #玩家下 self.chessBoard[x][y] = self.man self.repaint() #判断玩家有没有赢 if self.isWin(x,y,self.man)==1: print "Man Win" self.gameOverFlag = 1 self.showGameOver(self.man) else: #print "continue" #电脑下 coord = self.computerStep() self.chessBoard[coord[0]][coord[1]]=self.computer self.repaint() #判断电脑有没有赢 if self.isWin(coord[0],coord[1],self.computer)==1: print "Computer Win" self.gameOverFlag = 1 self.showGameOver(self.computer)
三、不足
-
对AI不熟,没有使用博弈树,AI水平初级;
-
图形界面略丑,并且界面亮度有下棋时发生变化;
留下评论