diff --git a/.vscode/launch.json b/.vscode/launch.json index a42fab7..a85618c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,7 @@ "type": "python", "request": "launch", "program": "${workspaceFolder}/network/server.py", - "cwd": "${fileDirname}", + "cwd": "${workspaceFolder}/network/", "console": "integratedTerminal", "justMyCode": true }, diff --git a/SafariChess_Gamev1.0.py b/SafariChess_Gamev1.0.py index 98043ae..8ea1d08 100644 --- a/SafariChess_Gamev1.0.py +++ b/SafariChess_Gamev1.0.py @@ -34,21 +34,12 @@ SIZE = 64 IMAGES = {} bias_top = 100 #棋盘的上边距 bias_left = 100 #棋盘的左边距 -#multithreading? -def startNewThread(target): - thread = Thread(target=target) - thread.daemon = True - thread.start() + #网络版更新需要注意多线程的问题? #尝试写一个函数分配一个新线程供监听 #等待敌人移动 -def updateForEnemy(network: backend.Network,game_state: backend.GameState): - print("waiting for the other player to move...") - otherMove = game_state.dnldmv_server() - if otherMove is not None: - game_state.makeMove(otherMove) - + def loadImages():#加载图片,a,b双方分别有象狮豹狼狐鹰鼠七个角色 pieces = ["r7", "r6", "r5", "r4", "r3", "r2", "r1", "b7", "b6", "b5", "b4", "b3", "b2", "b1", @@ -251,7 +242,8 @@ def main(mode,p1,p2,network = None): NewPlayerMessage = '' #来自对手的信息 if mode == 2: network=backend.Network() - player1 = input("Enter your name: ") + #p1 = input("Enter your name: ") + p1 = 'player1' myPlayerData = { 'type': 0, # game state type ? 'msg': { @@ -262,7 +254,7 @@ def main(mode,p1,p2,network = None): print("Waiting for other player...") NewPlayerMessage = network.receive() print() - player2 = NewPlayerMessage['counterpart_name'] + p2 = NewPlayerMessage['counterpart_name'] pg.init() screen = pg.display.set_mode((BOARD_WIDTH + MOVE_LOG_PANEL_WIDTH, BOARD_HEIGHT)) pg.display.set_caption("Safafi Chess Game") @@ -361,18 +353,19 @@ def main(mode,p1,p2,network = None): #设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能 pass + #* 网络对战局面更新 + #? 考虑将多线程状态更新指令写在backend中。 + #? 但是考虑到ui刷新问题,故仍尝试在main中写 + #ShowGameState(screen,game_state,valid_moves,square_selected) if mademove: - valid_moves = game_state.getAllMoves() - #mademove = False - #* 网络对战局面更新 - if network is not None: - startNewThread(updateForEnemy(network,game_state)) - ShowGameState(screen,game_state,valid_moves,square_selected) - + mademove = False + game_state.updateEnemy()#思路变成:定时对敌方进行扫描,若收到更新相关包则进行局面更新。 + ShowGameState(screen,game_state,valid_moves,square_selected) if game_state.conquer(): showGameOverText(screen,"player "+game_state.win_person+" wins") game_over = True clock.tick(60) + pg.display.flip() if __name__ == '__main__': diff --git a/SafariChess_backend.py b/SafariChess_backend.py index 4a652f5..33e2394 100644 --- a/SafariChess_backend.py +++ b/SafariChess_backend.py @@ -1,7 +1,15 @@ -import socket +import socket +import this import requests import sys import json +from threading import Thread +#multithreading? +def startNewThread(target): + thread = Thread(target=target) + thread.daemon = True + thread.start() + class Network: def __init__(self): self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -28,6 +36,7 @@ class Network: packet = packet.encode('utf-8') #return self.client.recv(2048).encode() self.client.send(packet) + print("send complete") except socket.error as e: print(e) @@ -38,8 +47,9 @@ class Network: def receive(self): try: - msg = json.loads(self.client.recv(2048)) - print(msg) + recvMsg = self.client.recv(2048).decode('utf-8') + msg = json.loads(recvMsg) + print('receiver got: ', msg) return msg except socket.error as e: print(e) @@ -100,6 +110,7 @@ class GameState: self.isNet = isNet self.game_id = game_id self.red_to_move=MySide + self.MySide = MySide self.client = client self.conquered=False self.win_person='' @@ -107,6 +118,8 @@ class GameState: def color(self): return 'r' if self.red_to_move else 'b' + def exchange(self): + self.red_to_move = not self.red_to_move #网络版相关组件 def upldmv_server(self,move): thisMove = { @@ -126,11 +139,19 @@ class GameState: } } self.client.send(thisMove) - def dnldmv_server(self): + def __updateOther__(self):#! 注意:考虑使用多线程执行该函数。 + #print('waiting 4 other player 2 act...') thisMovejson = self.client.receive() - thisMove = Move([thisMovejson['src']['x'],thisMovejson['src']['y']],[thisMovejson['dst']['x'],thisMovejson['dst']['y']],self.board) - return thisMove + if not thisMovejson or thisMovejson['side'] == int(self.MySide): + return + print('passing checkpoint') + if 'chessman' in thisMovejson.keys(): #正常移动过程 + thisMove = Move([thisMovejson['src']['x'],thisMovejson['src']['y']],[thisMovejson['dst']['x'],thisMovejson['dst']['y']],self.board) + self.makeMove(thisMove,toUpload=False) + self.exchange() + def updateEnemy(self): + startNewThread(self.__updateOther__)#测试多线程更新…… # 判断特殊位置 def inHome(self,row,col,color): if color=="b": @@ -326,8 +347,9 @@ class GameState: return self.conquered #移动操作 - def makeMove(self,move):#cur是当前位置,nxt是下一个位置,参数传入为元组 + def makeMove(self,move,toUpload = True):#cur是当前位置,nxt是下一个位置,参数传入为元组 # makeMove假设这个move一定是合法的 + # 为什么添加toUpload?防止使用makeMove更新己方棋盘时,把敌方棋盘错误上传,导致“棋子消失”。 if self.board[move.end_row][move.end_col] != '00': nxt_piece = self.board[move.end_row][move.end_col] if nxt_piece[0] == 'r': @@ -336,9 +358,10 @@ class GameState: self.blue_pieces.remove(int(nxt_piece[1])) self.board[move.end_row][move.end_col] = self.board[move.start_row][move.start_col] self.board[move.start_row][move.start_col] = '00' - if not self.isNet: self.red_to_move = not self.red_to_move - else: - #直接在这里完成两步实现看起来不可行…… - #因为界面更新在main中 + self.red_to_move = not self.red_to_move + #由于使用多线程,考虑让另一个线程去更新red_to_move + if self.isNet and toUpload: + #因为界面更新在main中,考虑在main中执行相关指令。 self.upldmv_server(move) + diff --git a/__pycache__/SafariChess_backend.cpython-39.pyc b/__pycache__/SafariChess_backend.cpython-39.pyc index d0a2d26..699ae39 100644 Binary files a/__pycache__/SafariChess_backend.cpython-39.pyc and b/__pycache__/SafariChess_backend.cpython-39.pyc differ