Python实现人机五子棋
图片和代码资源已经上传到百度云,链接:https://pan.baidu.com/s/1g0OO-8k-GNO9I4ZbFt1AXw
图形界面引用PyQt5,还有socket通信。可以局域网对战,可以人机对战,应该存在一些小的bug,但是还没有找出来。希望读者可以找到,哈哈…
下面附几张运行的截图:
五子棋.py代码:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sysimport MyButton
import DoublePlayerGame
import SinglePlayerGame
from NetConfig import *
import NetPlayerGameclass Mainwindow(QWidget):def __init__(self,parent = None):super().__init__(parent)self.resize(760,650)self.setWindowTitle("我的五子棋")#设置窗口图标self.setWindowIcon(QIcon("source/icon.ico"))#设置背景图片p = QPalette(self.palette())#获得当前的调色板brush = QBrush(QImage("source/五子棋界面.png"))p.setBrush(QPalette.Background,brush)#设置调色版self.setPalette(p)#给窗口设置调色板self.singlePlayerBtn = MyButton.MyButton('source/人机对战_hover.png','source/人机对战_normal.png','source/人机对战_press.png',parent=self)self.singlePlayerBtn.move(300,300)self.dancelePlayerBtn = MyButton.MyButton('source/双人对战_hover.png','source/双人对战_normal.png','source/双人对战_press.png',parent=self)self.dancelePlayerBtn.move(300,400)#self.dancelePlayerBtn.clicked.connect(DoublePlayerGame)self.drawlePlayerBtn = MyButton.MyButton('source/联机对战_hover.png','source/联机对战_normal.png','source/联机对战_press.png',parent=self)self.drawlePlayerBtn.move(300,500)#绑定开始双人游戏信号和槽函数self.dancelePlayerBtn.clicked.connect(self.startDoubliGame)self.singlePlayerBtn.clicked.connect(self.startSingleGame)self.drawlePlayerBtn.clicked.connect(self.startNetGame)def startDoubliGame(self):print("in")#构建双人对战界面self.doublePlayerGame = DoublePlayerGame.DoublePlayGame()#绑定返回界面self.doublePlayerGame.backSignal.connect(self.showStartGame)self.doublePlayerGame.show()#显示游戏界面self.close()def startSingleGame(self):self.SingleGame = SinglePlayerGame.SinglePlayerGame()self.SingleGame.backSignal.connect(self.showStartGame2)self.SingleGame.show()self.close()def startNetGame(self):self.netConfig = NetConfigWidget()self.netConfig.exit_signal.connect(self.show)self.netConfig.show()self.netConfig.config_signal.connect(self.receiveNetConfig)self.close()def receiveNetConfig(self,nettype,name,ip,port):'''接收网络配置信息'''print("net config:",nettype,name,ip,port)if nettype == "client":net_object = NetClient(name,ip,port)elif nettype == "server":net_object = NetServer(name,ip,port)else:returnself.netPlayerGame = NetPlayerGame.NetPlayerGame(net_object=net_object)self.netPlayerGame.backSignal.connect(self.show)self.close()self.netPlayerGame.show()self.netConfig.hide()'''lbl = QLabel(self)pix = QPixmap("source/人机大战_norma.")'''#显示开始界面def showStartGame(self):self.show()self.doublePlayerGame.close()def showStartGame2(self):self.show()self.SingleGame.close()if __name__ == "__main__":import cgitbcgitb.enable("text")a = QApplication(sys.argv)m = Mainwindow()m.show()sys.exit(a.exec_())
doubleplayergame.py代码:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5 import *
import sysclass Chessman(QLabel):def __init__(self, color = "black",parent = None):super().__init__(parent)self.color = colorself.pic = Noneif self.color == "black":self.pic = QPixmap("source/黑子.png")else:self.pic = QPixmap("source/白子.png")self.setPixmap(self.pic)self.setFixedSize(self.pic.size())#设置棋子大小self.show()self.x = 0self.y = 0def move(self,a0:QtCore.QPoint):super().move(a0.x()-15,a0.y()-15)def setIndex(self,x,y):self.x = xself.y = yimport MyButtonclass DoublePlayGame(QWidget):backSignal = pyqtSignal()#返回信号def __init__(self,parent = None):super().__init__(parent=parent)#左上角chessboard[0][0]#右上角chessboard[0][18]#左下角chessboard[18][0]#右下角chessboard[18][18]#chessboard[行下标][列下标]self.chessboard = [[None for i in range(19)] for i in range(19)]#落子棋子颜色self.turnChessColor = "black"self.history = []self.history2 = []self.is_over = False#配置背景图p = QPalette(self.palette())#获得当前的调色板brush = QBrush(QImage("source/游戏界面.png"))p.setBrush(QPalette.Background,brush)#设置调色版self.setPalette(p)#给窗口设置调色板#设置标题#self.resize(760,650)self.setWindowTitle("双人联机")#设置窗口图标self.setWindowIcon(QIcon("source/icon.ico"))#设置窗口大小self.setFixedSize(QImage("source/游戏界面.png").size())self.backBtn = MyButton.MyButton('source/返回按钮_hover.png','source/返回按钮_normal.png','source/返回按钮_press.png',parent=self)self.backBtn.move(650,50)self.startBtn = MyButton.MyButton('source/开始按钮_hover.png','source/开始按钮_normal.png','source/开始按钮_press.png',parent=self)self.startBtn.move(650,300)self.returnBtn = MyButton.MyButton('source/悔棋按钮_hover.png','source/悔棋按钮_normal.png','source/悔棋按钮_press.png',parent=self)self.returnBtn.move(650,400)self.loseBtn = MyButton.MyButton('source/认输按钮_hover.png','source/认输按钮_normal.png','source/认输按钮_press.png',parent=self)self.loseBtn.move(650,500)#绑定返回按钮self.backBtn.clicked.connect(self.goBack)self.startBtn.clicked.connect(self.restar)self.loseBtn.clicked.connect(self.lose)self.returnBtn.clicked.connect(self.huiback)self.gameStatu = []self.focusPoint = QLabel(self)self.focusPoint.setPixmap(QPixmap("source/标识.png"))def goBack(self):self.backSignal.emit()self.close()def closeEvent(self, a0: QtGui.QCloseEvent):self.backSignal.emit()def mouseReleaseEvent(self, a0: QtGui.QMouseEvent):if self.gameStatu == False:return Noneprint(a0.pos())print("x:",a0.x())print("y:",a0.y())pos,chess_index = self.reversePos(a0)if pos is None:returnif self.chessboard[chess_index[1]][chess_index[0]] != None:returnself.chess = Chessman(color=self.turnChessColor,parent=self)self.chess.setIndex(chess_index[0], chess_index[1])self.chess.move(pos)self.chess.show()#显示棋子self.history.append(self.chess)self.history2.append(self.focusPoint)self.focusPoint.move(QPoint(pos.x()-15,pos.y()-15))self.focusPoint.show()self.focusPoint.raise_()print("棋盘交点位置:",chess_index)#放入棋盘self.chessboard[chess_index[1]][chess_index[0]] = self.chessif self.turnChessColor=="black":self.turnChessColor="white"else:self.turnChessColor="black"self.lbl = Noneresult = self.isWin(self.chess)if result != None:print(result + '赢了')self.showResult(result)#自动落子#self.autoDown()#坐标转换def reversePos(self, a0: QtCore.QPoint):if a0.x() <= 50 - 15 or a0.x() >= 590 +15 or a0.y() <= 50 - 15 or a0.y() >= 590+15 :return None, Noneself.x = (a0.x()-35)//30self.y = (a0.y()-35)//30x = 50+30*self.xy = 50+30*self.yreturn QPoint(x, y),(self.x, self.y)def isWin(self,chessman):print("in iswin,lastChessman:",chessman.color,chessman.x,chessman.y)#水平方向y相同,chessboard[chessman.y][i]count = 1#左边i = chessman.x - 1while i>=0:if self.chessboard[chessman.y][i] == None or self.chessboard[chessman.y][i].color != chessman.color:breakcount += 1i -= 1#右边i = chessman.x + 1while i<=18:if self.chessboard[chessman.y][i] == None or self.chessboard[chessman.y][i].color != chessman.color:breakcount += 1i += 1if count >=5:return chessman.colorcount = 1j = chessman.y - 1while j >= 0:if self.chessboard[j][chessman.x] == None or self.chessboard[j][chessman.x].color != chessman.color:breakcount += 1j -= 1j = chessman.y + 1while j <= 18:if self.chessboard[j][chessman.x] == None or self.chessboard[j][chessman.x].color != chessman.color:breakcount += 1j += 1if count >=5:return chessman.colorcount = 1j,i = chessman.y - 1,chessman.x + 1while j >= 0 and i <= 18:if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color:breakcount += 1j -= 1i += 1j,i = chessman.y + 1,chessman.x - 1while i >= 0 and j <= 18:if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color:breakcount += 1i -= 1j += 1if count >=5:return chessman.colorcount = 1j,i = chessman.y-1,chessman.x-1while j>=0 and i>=0:if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color:breakcount += 1j -= 1i -= 1j,i = chessman.y+1,chessman.x+1while j<=18 and i<=18:if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color:breakcount += 1j += 1i += 1if count >=5:return chessman.colorreturn Nonedef showResult(self,isWin = None):self.gameStatu = Falseif isWin == "white":self.lbl = QLabel(self)self.lbl.setPixmap(QPixmap("source/白棋胜利.png"))self.lbl.move(150,150)self.lbl.show()elif isWin == "black":self.lbl = QLabel(self)self.lbl.setPixmap(QPixmap("source/黑棋胜利.png"))self.lbl.move(150,150)self.lbl.show() else:returndef restar(self):for i in range(19):for j in range(19):if self.chessboard[i][j] != None:self.chessboard[i][j].close()self.chessboard[i][j] = Noneself.focusPoint.close()else:passif self.lbl != None:self.lbl.close() self.gameStatu = True def lose(self):if self.gameStatu == False:returnif self.turnChessColor == "black":self.lbl = QLabel(self)self.lbl.setPixmap(QPixmap("source/白棋胜利.png"))self.lbl.move(150,150)self.lbl.show()elif self.turnChessColor == "white":self.lbl = QLabel(self)self.lbl.setPixmap(QPixmap("source/黑棋胜利.png"))self.lbl.move(150,150)self.lbl.show()else:returndef huiback(self):if self.gameStatu == False:returnm = self.history.pop()a = self.history2.pop()self.chessboard[m.y][m.x] = Nonem.close() a.close() if self.turnChessColor=="black":self.turnChessColor="white"else:self.turnChessColor="black"if __name__ == "__main__":import cgitbcgitb.enable("text")a = QApplication(sys.argv)m = DoublePlayGame()m.show()sys.exit(a.exec_())pass
NetConfig.py代码:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import *
import socket
import threading
class NetConfigWidget(QWidget):config_signal = pyqtSignal([str,str,str,str])exit_signal = pyqtSignal()def __init__(self,parent = None):super().__init__(parent = parent)self.initUI()def initUI(self):self.setWindowTitle("网络配置")self.name_label = QLabel("姓名:",self)self.name_input = QLineEdit("玩家1",self)self.ip_label = QLabel("IP:",self)self.ip_input = QLineEdit("127.0.0.1",self)self.port_label = QLabel("Prot:",self)self.port_input = QLineEdit("10086",self)self.client_button = QPushButton("链接主机",self)self.server_button = QPushButton("我是主机",self)gridLayout = QGridLayout()gridLayout.addWidget(self.name_label,0,0)gridLayout.addWidget(self.name_input,0,1)gridLayout.addWidget(self.ip_label,1,0)gridLayout.addWidget(self.ip_input,1,1)gridLayout.addWidget(self.port_label,2,0)gridLayout.addWidget(self.port_input,2,1)gridLayout.addWidget(self.client_button,3,0)gridLayout.addWidget(self.server_button,3,1)self.setLayout(gridLayout)self.client_button.clicked.connect(self.client_btn_signal)self.server_button.clicked.connect(self.server_btn_signal)def server_btn_signal(self):self.config_signal.emit("server",self.name_input.text(),self.ip_input.text(),self.port_input.text())def client_btn_signal(self):self.config_signal.emit("client",self.name_input.text(),self.ip_input.text(),self.port_input.text())def closeEvent(self,a0:QtGui.QCloseEvent):self.close()self.exit_signal.emit()class NetClient(QObject):msg_signal = pyqtSignal([str])def __init__(self,name,ip,port):super().__init__()self.name = nameself.ip = ipself.port = portself.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)def buildConnect(self):'''建立链接'''self.socket.connect((self.ip,int(self.port)))threading.Thread(target=self.recv).start()passdef send(self,data):'''发送数据data(发送的数据)字符串类型'''self.socket.send(data.encode())passdef recv(self):'''接收数据'''while True:try:data = self.socket.recv(4096).decode()self.msg_signal.emit(data)except:passclass NetServer(QObject):msg_signal = pyqtSignal([str])def __init__(self,name,ip,port):super().__init__()self.name = nameself.ip = ipself.port = portself.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.cli_socket = Nonedef buildConnect(self):self.socket.bind(("",int(self.port)))self.socket.listen(1)threading.Thread(target=self.__acceptConnect).start()def __acceptConnect(self):try:self.cli_socket,cli_addr = self.socket.accept()except:passwhile True:try:data = self.cli_socket.recv(4096).decode()self.msg_signal.emit(data)except Exception as e:print(e)def send(self,data):if self.cli_socket == None:returnself.cli_socket.send(data.encode())if __name__ == "__main__":import sysimport cgitbcgitb.enable("text")a = QApplication(sys.argv)m = NetConfigWidget()m.show()sys.exit(a.exec_())pass
NetplayerGame.py代码:
from DoublePlayerGame import *
import json
from NetConfig import *
from PyQt5.QtMultimedia import QSoundclass NetPlayerGame(DoublePlayGame):def __init__(self,net_object, parent = None):super().__init__(parent = parent)self.net_object = net_objectself.net_object.buildConnect()#建立网络链接self.net_object.msg_signal.connect(self.parseData)self.m_color = None#玩家棋子颜色self.cuicuBtn = MyButton.MyButton('source/催促按钮_hover.png','source/催促按钮_normal.png','source/催促按钮_press.png',parent=self)self.cuicuBtn.move(650,600)self.cuicuBtn.clicked.connect(self.cuicu)def cuicu(self):QSound.play('source/cuicu.wav')msg = {}msg['msg_type'] = 'cuicu'self.net_object.send(json.dumps(msg))passdef goBack(self):self.backSignal.emit()self.close()self.net_object.socket.close()def downChessman(self,point,color):'''自动落子:return:'''#point = self.getPoint()# 注意:x,y坐标对应chess_index = (point.y(), point.x()) # 棋子在棋盘中的下标pos = QPoint(50+point.x()*30, 50+point.y()*30) # 棋子在棋盘中的坐标self.chessman = Chessman(color=color, parent=self)self.chessman.setIndex(chess_index[0], chess_index[1])self.chessman.move(pos)self.chessman.show() # 显示棋子# 显示标识self.focusPoint.move(QPoint(pos.x() - 15, pos.y() - 15))self.focusPoint.show()self.focusPoint.raise_()self.chessboard[chess_index[0]][chess_index[1]] = self.chessman# 历史记录self.history.append((chess_index[0], chess_index[1], self.chessman.color))# 改变落子颜色if self.turnChessColor == 'black':self.turnChessColor = 'white'else:self.turnChessColor = 'black'# 判断输赢result = self.isWin(self.chessman)if result != None:print(result + '赢了')self.showResult(result)pass'''{"msg_type":"positon","x":"10","y":"15","color":"black"}'''#解析网路数据def parseData(self,data):print("pardata:",data)try:msg = json.loads(data)except Exception as e:print(e)#msg = json.loads(data)print("msg:",msg)if msg["msg_type"] == "position":self.downChessman(QPoint(int(msg["x"]),int(msg["y"])),msg["color"])passelif msg["msg_type"] == "restart":result = QMessageBox.information(None,'五子棋_提示消息','请求开始游戏',QMessageBox.Yes |QMessageBox.No)if result == QMessageBox.Yes:self.restartGame()#白子self.m_color = 'white'msg = {}msg['msg_type'] = "response"msg['action_type'] = 'restart'msg['action_result'] = 'yes'self.net_object.send(json.dumps(msg))else:msg = {}msg['msg_type'] = "response"msg['action_type'] = 'restart'msg['action_result'] = 'no'self.net_object.send(json.dumps(msg))elif msg['msg_type'] == 'response':if msg['action_type'] == 'restart':if msg['action_result'] == 'yes':self.restartGame()self.m_color = 'balck'else:QMessageBox.information(self,'五子棋_提示消息','对方拒绝游戏')elif msg['action_type'] == 'huiqi':if msg['action_result'] == 'Yes':self.huiqigame()else:QMessageBox.information(self,'五子棋_提示消息','对方拒绝悔棋',QMessageBox.Yes |QMessageBox.No)elif msg['msg_type'] == 'huiqi':result = QMessageBox.information(self,'五子棋_提示消息','对方请求悔棋',QMessageBox.Yes |QMessageBox.No)if result == QMessageBox.Yes: msg = {}msg['msg_type'] = "response"msg['action_type'] = 'huiqi'msg['action_result'] = 'Yes'self.net_object.send(json.dumps(msg))self.huiqigame()else:msg = {}msg['msg_type'] = "response"msg['action_type'] = 'huiqi'msg['action_result'] = 'No'self.net_object.send(json.dumps(msg))elif msg['msg_type'] == 'lose':show.showResult(self.m_color)elif msg['msg_type'] == 'cuicu':QSound.play('source/cuicu.wav')QMessageBox.window(self,'0')def restartGame(self):for i in range(19):for j in range(19):if self.chessboard[i][j] != None:self.chessboard[i][j].close()self.chessboard[i][j] = Noneself.focusPoint.close()else:passself.lbl = Noneif self.lbl != None:self.lbl.close() self.gameStatu = True self.focusPoint.hide()self.turnChessColor="black"def mouseReleaseEvent(self, a0: QtGui.QMouseEvent):if self.m_color != self.turnChessColor:returnif self.gameStatu == False:return Nonepos,chess_index = self.reversePos(a0)if pos is None:returnif self.chessboard[chess_index[1]][chess_index[0]] != None:returnself.chess = Chessman(color=self.turnChessColor,parent=self)self.chess.setIndex(chess_index[1], chess_index[0])self.chess.move(pos)self.chess.show()#显示棋子self.history.append(self.chess)self.history2.append(self.focusPoint)self.focusPoint.move(QPoint(pos.x()-15,pos.y()-15))self.focusPoint.show()self.focusPoint.raise_()print("棋盘交点位置:",chess_index)#放入棋盘self.chessboard[chess_index[1]][chess_index[0]] = self.chess#发送落子信息msg = {}msg["msg_type"] = "position"msg["x"] = chess_index[1]msg["y"] = chess_index[0]msg["color"] = self.turnChessColorself.net_object.send(json.dumps(msg))if self.turnChessColor=="black":self.turnChessColor="white"else:self.turnChessColor="black"self.lbl = Noneresult = self.isWin(self.chess)if result != None:print(result + '赢了') self.showResult(result)def huiqi(self):if self.gameStatu == None:QMessageBox.warning(self,'五子棋提示','游戏没有开始,不能悔棋')if self.m_color != self.turnChessColor:QMessageBox.warning(self,'五子棋提示','不是你的回合')msg = {}msg['msg_type'] = 'huiqi'self.net_object.send(json.dumps(msg))def huiqigame(self):if self.gameStatu == False:returnm = self.history.pop()a = self.history2.pop()self.chessboard[m.y][m.x] = Nonem.close() a.close() if self.turnChessColor=="black":self.turnChessColor="white"else:self.turnChessColor="black"def restar(self):msg = {}msg["msg_type"] = "restart"self.net_object.send(json.dumps(msg))def lose(self):if self.gameStatu == False:QMessageBox.warning(None,'五子棋','游戏没有开始')if self.m_color == "black":self.lbl = QLabel(self)self.lbl.setPixmap(QPixmap("source/白棋胜利.png"))self.lbl.move(150,150)self.lbl.show()elif self.m_color == "white":self.lbl = QLabel(self)self.lbl.setPixmap(QPixmap("source/黑棋胜利.png"))self.lbl.move(150,150)self.lbl.show()else:returnmsg = {}msg['msg_type'] = "lose"#msg['action_type'] = 'restart'#msg['action_result'] = 'no'self.net_object.send(json.dumps(msg))if __name__ == '__main__':import cgitbcgitb.enable("text")a = QApplication(sys.argv)m = NetPlayerGame()m.show()sys.exit(a.exec_())pass
MyButton.py代码:
# -*- coding:utf-8 -*-
# @author: alex
# @time: 2018/12/27 16:29
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import *
from PyQt5 import *
from PyQt5.QtGui import *
import sysfrom PyQt5.QtCore import *class MyButton(QLabel):clicked = pyqtSignal()#自定义一个信号def __init__(self, *args, parent=None):super().__init__(parent)self.hoverPixmap = QPixmap(args[0])self.normalPixmap = QPixmap(args[1])self.pressPixmap = QPixmap(args[2])self.enterState = Falseself.setPixmap(self.normalPixmap)self.setFixedSize(self.normalPixmap.size())def mouseReleaseEvent(self, ev: QtGui.QMouseEvent):if self.enterState == False:self.setPixmap(self.normalPixmap)else:self.setPixmap(self.hoverPixmap)self.clicked.emit()#发射信号print("鼠标释放")passdef mousePressEvent(self, ev: QtGui.QMouseEvent):self.setPixmap(self.pressPixmap)print("鼠标按下")passdef enterEvent(self, a0: QtCore.QEvent):self.setPixmap(self.hoverPixmap)self.enterState = Trueprint("鼠标进入")passdef leaveEvent(self, a0: QtCore.QEvent):self.setPixmap(self.normalPixmap)self.enterState = Falseprint("鼠标离开")passif __name__ == '__main__':a = QApplication(sys.argv)mybtn = MyButton('source/人机对战_hover.png','source/人机对战_normal.png','source/人机对战_press.png')mybtn.show()sys.exit(a.exec_())
SingerPlayerGame.py代码:
from DoublePlayerGame import *class SinglePlayerGame(DoublePlayGame):def __init__(self, parent=None):super().__init__(parent=parent)self.setWindowTitle('五子棋-单机模式')def mouseReleaseEvent(self, a0: QtGui.QMouseEvent):if self.gameStatu == False:return Noneprint(a0.pos())print("x:",a0.x())print("y:",a0.y())pos,chess_index = self.reversePos(a0)if pos is None:returnif self.chessboard[chess_index[1]][chess_index[0]] != None:return# 玩家落子super().mouseReleaseEvent(a0)# 电脑落子self.autoDown()def getPointScore(self, x, y, color):'''返回每个点的得分y:行坐标x:列坐标color:棋子颜色:return:'''# 分别计算点周围5子以内,空白、和同色的分数blank_score = 0color_score = 0# 记录每个方向的棋子分数blank_score_plus = [0, 0, 0, 0] # 横向 纵向 正斜线 反斜线color_score_plus = [0, 0, 0, 0]# 横线# 右侧i = x # 横坐标j = y # 纵坐标while i < 19:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[0] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[0] += 1else:breakif i >= x + 4:breaki += 1# print('123123')# 左侧i = x # 横坐标j = y # 纵坐标while i >= 0:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[0] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[0] += 1else:breakif i <= x - 4:breaki -= 1# 竖线# 上方i = x # 横坐标j = y # 纵坐标while j >= 0:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[1] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[1] += 1else:breakif j <= y - 4:breakj -= 1# 竖线# 下方i = x # 横坐标j = y # 纵坐标while j < 19:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[1] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[1] += 1else:breakif j >= y + 4: # 最近五个点breakj += 1# 正斜线# 右上i = xj = ywhile i < 19 and j >= 0:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[2] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[2] += 1else:breakif i >= x + 4: # 最近五个点breaki += 1j -= 1# 左下i = xj = ywhile j < 19 and i >= 0:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[2] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[2] += 1else:breakif j >= y + 4: # 最近五个点breaki -= 1j += 1# 反斜线# 左上i = xj = ywhile i >= 0 and j >= 0:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[3] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[3] += 1else:breakif i <= x - 4:breaki -= 1j -= 1# 右上i = xj = ywhile i < 19 and j < 19:if self.chessboard[j][i] is None:blank_score += 1blank_score_plus[3] += 1breakelif self.chessboard[j][i].color == color:color_score += 1color_score_plus[3] += 1else:breakif i >= x + 4:breaki += 1j += 1for k in range(4):if color_score_plus[k] >= 5:return 100# color_score *= 5return max([x + y for x, y in zip(color_score_plus, blank_score_plus)])def getPoint(self):'''返回落子位置:return:'''# 简单实现:返回一个空白交点# for i in range(19):# for j in range(19):# if self.chessboard[i][j] == None:# return QPoint(j, i)## 没有找到合适的点white_score = [ [ 0 for i in range(19) ] for j in range(19)]black_score = [ [ 0 for i in range(19) ] for j in range(19)]for i in range(19):for j in range(19):if self.chessboard[i][j] != None:continue# 模拟落子self.chessboard[i][j] = Chessman(color='white',parent=self)white_score[i][j] = self.getPointScore(j, i, 'white')self.chessboard[i][j].close()self.chessboard[i][j] = Noneself.chessboard[i][j] = Chessman(color='black',parent=self)black_score[i][j] = self.getPointScore(j, i, 'black')self.chessboard[i][j].close()self.chessboard[i][j] = Noneprint('----------------')# 将二维坐标转换成以为进行计算r_white_score = []r_black_score = []for i in white_score:r_white_score.extend(i)for i in black_score:r_black_score.extend(i)# 找到分数最大值score = [ max(x,y) for x,y in zip(r_white_score,r_black_score) ]# 找到分数做大的下标chess_index = score.index(max(score))print(score,'\n',max(score))y = chess_index //19x = chess_index % 19return QPoint(x,y)def autoDown(self):'''自动落子:return:'''point = self.getPoint()# 注意:x,y坐标对应chess_index = (point.y(), point.x()) # 棋子在棋盘中的下标pos = QPoint(50+point.x()*30, 50+point.y()*30) # 棋子在棋盘中的坐标self.chessman = Chessman(color=self.turnChessColor, parent=self)self.chessman.setIndex(chess_index[1], chess_index[0])self.chessman.move(pos)self.chessman.show() # 显示棋子# 显示标识self.focusPoint.move(QPoint(pos.x() - 15, pos.y() - 15))self.focusPoint.show()self.focusPoint.raise_()self.chessboard[chess_index[0]][chess_index[1]] = self.chessman# 历史记录self.history.append((chess_index[0], chess_index[1], self.chessman.color))# 改变落子颜色if self.turnChessColor == 'black':self.turnChessColor = 'white'else:self.turnChessColor = 'black'# 判断输赢result = self.isWin(self.chessman)if result != None:print(result + '赢了')self.showResult(result)passif __name__ == '__main__':import cgitbcgitb.enable('text')a = QApplication(sys.argv)m = SinglePlayerGame()m.show()sys.exit(a.exec_())
Python实现人机五子棋相关推荐
- python写游戏棋牌游戏_使用python实现简单五子棋游戏
使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...
- 用python实现简单五子棋游戏的练习过程
用python实现五子棋简单人机模式的练习过程 第一次写博客,我尽力把它写好. 最近在初学python,今天就用自己的一些粗浅理解,来记录一下这几天的python简单人机五子棋游戏的练习,下面是实现过 ...
- Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝)
Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝) 一.问题描述 1.五子棋 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋的棋具与围棋通用,是一种传 ...
- 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)
1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...
- Python编写人机对战小游戏(抓狐狸)(2)
封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...
- python简单网格五子棋_python实现简单五子棋游戏
本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...
- 基于Python的人机博弈象棋游戏的设计与实现
源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 基于Python的人机博弈象棋游戏的设计与实现
- C语言实现人机五子棋
C语言实现人机五子棋 游戏效果预览: 百度云盘:链接:https://pan.baidu.com/s/1Ftun17GMOWwT2u0qk0TNdA 密码:3c1p 接触C语言刚好一年了,也步入了大二 ...
- 使用java swing制作人机五子棋
使用java swing制作人机五子棋 背景 算法原理 棋盘分值更新范围 更新分值方法 判断分值方法 局势分数权重 设计模式 战局类Battle AI类 Integration UI设计 窗口类UIi ...
最新文章
- Java8读文件仅需一行代码
- 你知道你的模型可以为公司赚多少钱吗
- 把阿里巴巴的核心系统搬到云上,架构上的挑战与演进是什么?
- 爱奇艺android投屏,手机爱奇艺APP怎么将视频投屏上笔记本电脑?
- python基础教程:ord()和chr()
- 赛事丨出道题就能赢万元奖金?华录杯大赛告诉你,是真的
- hadoop 2.4.1 集群安装一
- 扒一扒那些年我们遇到的奇葩代码
- qt布局嵌套_QDockWidget嵌套布局详解-实现Visual Studio布局
- 输出流_关于输出字符流你真的懂了吗?
- 从文件扩展名获取MIME类型
- aqua data studio 连接db2
- java画图工具_java画图板工具
- 巨量创意signature
- ubuntu16.04电信拨号宽带连接网络
- 企业公众号运营见效难,如何突围?
- android GPS 定位
- 在滴滴数据分析岗实习的8个月
- 网络拓扑测绘之城域网拓扑
- 利用自动机识别c 语言单词,第03章 词法分析与有穷自动机(2).ppt