图片和代码资源已经上传到百度云,链接: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实现人机五子棋相关推荐

  1. python写游戏棋牌游戏_使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...

  2. 用python实现简单五子棋游戏的练习过程

    用python实现五子棋简单人机模式的练习过程 第一次写博客,我尽力把它写好. 最近在初学python,今天就用自己的一些粗浅理解,来记录一下这几天的python简单人机五子棋游戏的练习,下面是实现过 ...

  3. Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝)

    Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝) 一.问题描述 1.五子棋 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋的棋具与围棋通用,是一种传 ...

  4. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  5. Python编写人机对战小游戏(抓狐狸)(2)

    封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...

  6. python简单网格五子棋_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  7. 基于Python的人机博弈象棋游戏的设计与实现

    源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 基于Python的人机博弈象棋游戏的设计与实现

  8. C语言实现人机五子棋

    C语言实现人机五子棋 游戏效果预览: 百度云盘:链接:https://pan.baidu.com/s/1Ftun17GMOWwT2u0qk0TNdA 密码:3c1p 接触C语言刚好一年了,也步入了大二 ...

  9. 使用java swing制作人机五子棋

    使用java swing制作人机五子棋 背景 算法原理 棋盘分值更新范围 更新分值方法 判断分值方法 局势分数权重 设计模式 战局类Battle AI类 Integration UI设计 窗口类UIi ...

最新文章

  1. Java8读文件仅需一行代码
  2. 你知道你的模型可以为公司赚多少钱吗
  3. 把阿里巴巴的核心系统搬到云上,架构上的挑战与演进是什么?
  4. 爱奇艺android投屏,手机爱奇艺APP怎么将视频投屏上笔记本电脑?
  5. python基础教程:ord()和chr()
  6. 赛事丨出道题就能赢万元奖金?华录杯大赛告诉你,是真的
  7. hadoop 2.4.1 集群安装一
  8. 扒一扒那些年我们遇到的奇葩代码
  9. qt布局嵌套_QDockWidget嵌套布局详解-实现Visual Studio布局
  10. 输出流_关于输出字符流你真的懂了吗?
  11. 从文件扩展名获取MIME类型
  12. aqua data studio 连接db2
  13. java画图工具_java画图板工具
  14. 巨量创意signature
  15. ubuntu16.04电信拨号宽带连接网络
  16. 企业公众号运营见效难,如何突围?
  17. android GPS 定位
  18. 在滴滴数据分析岗实习的8个月
  19. 网络拓扑测绘之城域网拓扑
  20. 利用自动机识别c 语言单词,第03章 词法分析与有穷自动机(2).ppt

热门文章

  1. 如何用UE5渲染一个可爱的茶壶屋?
  2. Win10桌面图标显示不正常变成了白色方框怎么办
  3. c语言砍树,砍树你砍哪一颗
  4. ALOS 全国12.5米DEM
  5. DEP和ASLR的原理与破解介绍
  6. ubuntu 图片文字识别
  7. 电磁波实验之理想介质中的均匀平面波
  8. C#获取本机MAC地址
  9. 【DL笔记】LeNet5神经网络简介及TensorFlow实现
  10. Tachyon---基于内存的分布式存储系统