电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python實現人機五子棋

瀏覽:3日期:2022-08-01 10:09:43

本文實例為大家分享了python實現人機五子棋的具體代碼,供大家參考,具體內容如下

圖形界面引用PyQt5,還有socket通信。可以局域網對戰,可以人機對戰,應該存在一些小的bug,但是還沒有找出來。希望讀者可以找到

下面附幾張運行的截圖:

python實現人機五子棋

python實現人機五子棋

python實現人機五子棋

五子棋.py代碼:

from PyQt5.QtWidgets import *from PyQt5.QtGui import *import sysimport MyButtonimport DoublePlayerGameimport SinglePlayerGamefrom 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: return self.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 cgitb cgitb.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 = color self.pic = None if 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 = 0 self.y = 0 def move(self,a0:QtCore.QPoint): super().move(a0.x()-15,a0.y()-15) def setIndex(self,x,y): self.x = x self.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 None print(a0.pos()) print('x:',a0.x()) print('y:',a0.y()) pos,chess_index = self.reversePos(a0) if pos is None: return if self.chessboard[chess_index[1]][chess_index[0]] != None: return self.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.chess if self.turnChessColor=='black': self.turnChessColor='white' else: self.turnChessColor='black' self.lbl = None result = 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, None self.x = (a0.x()-35)//30 self.y = (a0.y()-35)//30 x = 50+30*self.x y = 50+30*self.y return 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 - 1 while i>=0: if self.chessboard[chessman.y][i] == None or self.chessboard[chessman.y][i].color != chessman.color: break count += 1 i -= 1 #右邊 i = chessman.x + 1 while i<=18: if self.chessboard[chessman.y][i] == None or self.chessboard[chessman.y][i].color != chessman.color: break count += 1 i += 1 if count >=5: return chessman.color count = 1 j = chessman.y - 1 while j >= 0: if self.chessboard[j][chessman.x] == None or self.chessboard[j][chessman.x].color != chessman.color: break count += 1 j -= 1 j = chessman.y + 1 while j <= 18: if self.chessboard[j][chessman.x] == None or self.chessboard[j][chessman.x].color != chessman.color: break count += 1 j += 1 if count >=5: return chessman.color count = 1 j,i = chessman.y - 1,chessman.x + 1 while j >= 0 and i <= 18: if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color: break count += 1 j -= 1 i += 1 j,i = chessman.y + 1,chessman.x - 1 while i >= 0 and j <= 18: if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color: break count += 1 i -= 1 j += 1 if count >=5: return chessman.color count = 1 j,i = chessman.y-1,chessman.x-1 while j>=0 and i>=0: if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color: break count += 1 j -= 1 i -= 1 j,i = chessman.y+1,chessman.x+1 while j<=18 and i<=18: if self.chessboard[j][i] == None or self.chessboard[j][i].color != chessman.color: break count += 1 j += 1 i += 1 if count >=5: return chessman.color return None def showResult(self,isWin = None): self.gameStatu = False if 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: return def 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] = None self.focusPoint.close() else: pass if self.lbl != None: self.lbl.close() self.gameStatu = True def lose(self): if self.gameStatu == False: return if 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: return def huiback(self): if self.gameStatu == False: return m = self.history.pop() a = self.history2.pop() self.chessboard[m.y][m.x] = None m.close() a.close() if self.turnChessColor=='black': self.turnChessColor='white' else: self.turnChessColor='black' if __name__ == '__main__': import cgitb cgitb.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 socketimport threadingclass 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 = name self.ip = ip self.port = port self.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() pass def send(self,data): ’’’發送數據 data(發送的數據)字符串類型’’’ self.socket.send(data.encode()) pass def 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 = name self.ip = ip self.port = port self.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.cli_socket = None def 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: pass while 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: return self.cli_socket.send(data.encode())if __name__ == '__main__': import sys import cgitb cgitb.enable('text') a = QApplication(sys.argv) m = NetConfigWidget() m.show() sys.exit(a.exec_()) pass

NetplayerGame.py代碼:

from DoublePlayerGame import *import jsonfrom NetConfig import *from PyQt5.QtMultimedia import QSoundclass NetPlayerGame(DoublePlayGame): def __init__(self,net_object, parent = None): super().__init__(parent = parent) self.net_object = net_object self.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)) pass def 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']) pass elif 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] = None self.focusPoint.close() else: pass self.lbl = None if 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: return if self.gameStatu == False: return None pos,chess_index = self.reversePos(a0) if pos is None: return if self.chessboard[chess_index[1]][chess_index[0]] != None: return self.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.turnChessColor self.net_object.send(json.dumps(msg)) if self.turnChessColor=='black': self.turnChessColor='white' else: self.turnChessColor='black' self.lbl = None result = 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: return m = self.history.pop() a = self.history2.pop() self.chessboard[m.y][m.x] = None m.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: return msg = {} msg[’msg_type’] = 'lose' #msg[’action_type’] = ’restart’ #msg[’action_result’] = ’no’ self.net_object.send(json.dumps(msg)) if __name__ == ’__main__’: import cgitb cgitb.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:29from PyQt5 import QtGui, QtCorefrom 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 = False self.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('鼠標釋放') pass def mousePressEvent(self, ev: QtGui.QMouseEvent): self.setPixmap(self.pressPixmap) print('鼠標按下') pass def enterEvent(self, a0: QtCore.QEvent): self.setPixmap(self.hoverPixmap) self.enterState = True print('鼠標進入') pass def leaveEvent(self, a0: QtCore.QEvent): self.setPixmap(self.normalPixmap) self.enterState = False print('鼠標離開') 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 None print(a0.pos()) print('x:',a0.x()) print('y:',a0.y()) pos,chess_index = self.reversePos(a0) if pos is None: return if 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 = 0 color_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 += 1 blank_score_plus[0] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[0] += 1 else: break if i >= x + 4: break i += 1 # print(’123123’) # 左側 i = x # 橫坐標 j = y # 縱坐標 while i >= 0: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[0] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[0] += 1 else: break if i <= x - 4: break i -= 1 # 豎線 # 上方 i = x # 橫坐標 j = y # 縱坐標 while j >= 0: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[1] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[1] += 1 else: break if j <= y - 4: break j -= 1 # 豎線 # 下方 i = x # 橫坐標 j = y # 縱坐標 while j < 19: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[1] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[1] += 1 else: break if j >= y + 4: # 最近五個點 break j += 1 # 正斜線 # 右上 i = x j = y while i < 19 and j >= 0: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[2] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[2] += 1 else: break if i >= x + 4: # 最近五個點 break i += 1 j -= 1 # 左下 i = x j = y while j < 19 and i >= 0: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[2] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[2] += 1 else: break if j >= y + 4: # 最近五個點 break i -= 1 j += 1 # 反斜線 # 左上 i = x j = y while i >= 0 and j >= 0: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[3] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[3] += 1 else: break if i <= x - 4: break i -= 1 j -= 1 # 右上 i = x j = y while i < 19 and j < 19: if self.chessboard[j][i] is None: blank_score += 1 blank_score_plus[3] += 1 break elif self.chessboard[j][i].color == color: color_score += 1 color_score_plus[3] += 1 else: break if i >= x + 4: break i += 1 j += 1 for k in range(4): if color_score_plus[k] >= 5: return 100 # color_score *= 5 return 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] = None self.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] = None print(’----------------’) # 將二維坐標轉換成以為進行計算 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 //19 x = chess_index % 19 return 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 cgitb cgitb.enable(’text’) a = QApplication(sys.argv) m = SinglePlayerGame() m.show() sys.exit(a.exec_())

更多關于python游戲的精彩文章請點擊查看以下專題:

python俄羅斯方塊游戲集合

python經典小游戲匯總

python微信跳一跳游戲集合

源碼下載:五子棋游戲人機版

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 旋转滴界面张力仪(张力测定仪器)-百科| 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 慈溪麦田广告公司,提供慈溪广告设计。 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 昊宇水工|河北昊宇水工机械工程有限公司 | 回转支承-转盘轴承-回转驱动生产厂家-洛阳隆达轴承有限公司 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 煤矿人员精确定位系统_矿用无线通信系统_煤矿广播系统 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 上海诺狮景观规划设计有限公司| 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 |