From 17234132a0b2fb218792b208639bdce8d01b655e Mon Sep 17 00:00:00 2001 From: DoubleQ <1243026909@qq.com> Date: Tue, 20 Sep 2022 14:49:37 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SafariChess_Gamev1.0.py | 90 +++++++-- SafariChess_backend.py | 177 +++++++++--------- .../SafariChess_Classes.cpython-39.pyc | Bin 795 -> 836 bytes .../SafariChess_backend.cpython-39.pyc | Bin 12416 -> 9523 bytes 4 files changed, 162 insertions(+), 105 deletions(-) diff --git a/SafariChess_Gamev1.0.py b/SafariChess_Gamev1.0.py index 2a20cd4..77f4ee6 100644 --- a/SafariChess_Gamev1.0.py +++ b/SafariChess_Gamev1.0.py @@ -43,6 +43,7 @@ port = None addr = None connection = None #网络版更新需要注意多线程的问题? +server_died_message = 'fucking server died and quit' #尝试写一个函数分配一个新线程供监听 def startNewThread(target): @@ -53,12 +54,16 @@ def listenFromServer(): global networkMsg try: while True: - recvMsg = client.recvfrom(1024).decode('utf-8') + recvMsg = client.recv(1024).decode('utf-8') if len(recvMsg) != 0: networkMsg = json.loads(recvMsg) + print('receive thread catch: ',networkMsg) except socket.error as e: print(e) return e + except OSError: + networkMsg = server_died_message + return None def startNetworkServices(): global client,server,port,addr,connection client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -284,11 +289,15 @@ def main(mode): #* cancelled args: MySide=True if not isOnline else bool(NewPlayerMessage['side']),game_id=NewPlayerMessage['game_id'] valid_moves=game_state.getAllMoves() running = True - other_joined = False + other_joined = False #network element + other_stage = False #network element + game_id = None #network element + MySide = None #network element mademove = False game_over = False square_selected = () #刚开始没有选择任何一个棋子 click_queue = [] #点击队列,记录第一次点击和第二次点击位置,方便移动棋子 + pg.display.update() startGamePage(mode) @@ -350,32 +359,55 @@ def main(mode): login_packet = login_packet.encode('utf-8') lastNetworkMsg = networkMsg client.send(login_packet) + while networkMsg == None: pass while running: + #print('current moving color: ',game_state.color()) if lastNetworkMsg != networkMsg:#handle - print('get new msg: ',networkMsg) + if(networkMsg == server_died_message): + print("server died") + return None + print('catch new msg: ',networkMsg) lastNetworkMsg = networkMsg #networkMsg中保存当前字典 if 'status' in networkMsg.keys(): - if networkMsg['status'] == 1: - print('Waiting for another player to connect') - - - elif 'src' and 'dst' in networkMsg.keys(): - if other_joined == False: - other_joined = True + #Login_handler + if networkMsg['status'] == 1: #Finished Login process + if other_joined == False: + other_joined = True print('Game start 2 play!') - else: - theMove = backend.Move([networkMsg['src']['x'],networkMsg['src']['y']],[networkMsg['dst']['x'],networkMsg['dst']['y']],game_state.board) - game_state.makeMove(theMove) - game_state.exchange() - + game_id = networkMsg['game_id'] + MySide = networkMsg['side'] + other_stage = True if networkMsg['side']==0 else False + if(other_stage == True): + print('waiting for other player to move...') + #quick_game_handler + elif networkMsg['status'] == 2 : # other player quit the game + print('other player quitted with message: ',networkMsg['request']) + running = False + + elif 'src' and 'dst' in networkMsg.keys(): + theMove = backend.Move([networkMsg['src']['x'],networkMsg['src']['y']],[networkMsg['dst']['x'],networkMsg['dst']['y']],game_state.board) + game_state.makeMove(theMove) + #game_state.exchange() + valid_moves = game_state.getAllMoves() + other_stage = not other_stage + thisMove = None for e in pg.event.get(): #接下来处理游戏中的事件 if e.type == pg.QUIT: + quitJson = { + "type": 2, + "msg": { + "request": "quit", + "game_id": game_id, + "side": MySide + } + } + client.send(json.dumps(quitJson).encode('utf-8')) pg.quit() sys.exit() elif e.type == pg.MOUSEBUTTONDOWN: #鼠标点击事件:用于选择棋子,移动棋子 - if not game_over: + if not game_over and not other_stage: mouse_loc = pg.mouse.get_pos() row = int((mouse_loc[1] - bias_top) / SIZE) col = int((mouse_loc[0] - bias_left) / SIZE) #* get position of mouse click @@ -389,6 +421,7 @@ def main(mode): cur_piece_loc = click_queue[0] nxt_piece_loc = click_queue[1] move = backend.Move(cur_piece_loc,nxt_piece_loc,game_state.board) + thisMove = move if move in valid_moves: game_state.makeMove(move) mademove = True @@ -406,14 +439,37 @@ def main(mode): #? 但是考虑到ui刷新问题,故仍尝试在main中写 #ShowGameState(screen,game_state,valid_moves,square_selected) if mademove: + valid_moves = game_state.getAllMoves() mademove = False + if isOnline: + print('waiting for the other player to move...') + other_stage = not other_stage + thisMoveJson = { + 'type': 1, + 'msg': { + "game_id": game_id, + "side": MySide, + "chessman": thisMove.cur_piece, + "src": { + "x": thisMove.start_row, + "y": thisMove.start_col + }, + "dst": { + "x": thisMove.end_row, + "y": thisMove.end_col + } + } + } + client.send(json.dumps(thisMoveJson).encode('utf-8')) + + #思路变成:定时对敌方进行扫描,若收到更新相关包则进行局面更新。 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(10) + clock.tick(5) pg.display.flip() diff --git a/SafariChess_backend.py b/SafariChess_backend.py index bcc9fbf..e97be5b 100644 --- a/SafariChess_backend.py +++ b/SafariChess_backend.py @@ -27,108 +27,108 @@ def startNewThread(target): thread.daemon = True thread.start() -class Network: - def __init__(self,isNet=False): #注意:这里是否在传引用? - self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.server = "127.0.0.1" - self.port = 50005 - self.addr = (self.server, self.port) - self.msg = self.connect() - #self.game_state = game_state #考虑将game_state接入Network以方便修改 - global msg_from_serv - thread = Thread(target = self.receive())#开线程始终监听 - thread.setDaemon(True) - thread.start() #专用数据接收线程 +# class Network: +# def __init__(self,isNet=False): #注意:这里是否在传引用? +# self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +# self.server = "127.0.0.1" +# self.port = 50005 +# self.addr = (self.server, self.port) +# self.msg = self.connect() +# #self.game_state = game_state #考虑将game_state接入Network以方便修改 +# global msg_from_serv +# thread = Thread(target = self.receive())#开线程始终监听 +# thread.setDaemon(True) +# thread.start() #专用数据接收线程 - def getPos(self): - return self.pos +# def getPos(self): +# return self.pos - def connect(self): - try: - self.client.connect(self.addr) - #return self.client.recv(2048).decode() - except: - pass +# def connect(self): +# try: +# self.client.connect(self.addr) +# #return self.client.recv(2048).decode() +# except: +# pass - def send(self, msg): - try: - packet = json.dumps(msg) - if (sys.version[:1] == '3'): - packet = packet.encode('utf-8') - self.client.send(packet) - print("send complete") - return self.client.recv(2048).encode() - except socket.error as e: - print(e) - return e +# def send(self, msg): +# try: +# packet = json.dumps(msg) +# if (sys.version[:1] == '3'): +# packet = packet.encode('utf-8') +# self.client.send(packet) +# print("send complete") +# return self.client.recv(2048).encode() +# except socket.error as e: +# print(e) +# return e - def post(self, data): #using requests lib, data is json - headers = {'Content-Type': 'application/json'} - response = requests.post(url='http://localhost',data=data) - return response +# def post(self, data): #using requests lib, data is json +# headers = {'Content-Type': 'application/json'} +# response = requests.post(url='http://localhost',data=data) +# return response - def receive(self): #写成持续监听模式 - try: - while True: - recvMsg = self.client.recv(2048).decode('utf-8') - if len(recvMsg) != 0: - msg_from_serv = json.loads(recvMsg) - self.dataDealer(msg_from_serv) - except socket.error as e: - print(e) - return e +# def receive(self): #写成持续监听模式 +# try: +# while True: +# recvMsg = self.client.recv(2048).decode('utf-8') +# if len(recvMsg) != 0: +# msg_from_serv = json.loads(recvMsg) +# self.dataDealer(msg_from_serv) +# except socket.error as e: +# print(e) +# return e - def dataDealer(self, msg_json): #根据相关数据对棋盘状态进行更新 - if 'status' in msg_json.keys(): - #处理相关特殊情况 - if msg_json['status'] == '1': - print('Waiting 4 the other player...') +# def dataDealer(self, msg_json): #根据相关数据对棋盘状态进行更新 +# if 'status' in msg_json.keys(): +# #处理相关特殊情况 +# if msg_json['status'] == '1': +# print('Waiting 4 the other player...') - elif 'src' and 'dst' in msg_json.keys(): #侦测到移动 - theMove = Move([msg_json['src']['x'],msg_json['src']['y']],[msg_json['dst']['x'],msg_json['dst']['y']],self.game_state.board) - self.game_state.makeMove(theMove,toUpload = False) - self.game_state.exchange() +# elif 'src' and 'dst' in msg_json.keys(): #侦测到移动 +# theMove = Move([msg_json['src']['x'],msg_json['src']['y']],[msg_json['dst']['x'],msg_json['dst']['y']],self.game_state.board) +# self.game_state.makeMove(theMove,toUpload = False) +# self.game_state.exchange() - def dataReceiver(self): - try: - while True: - msg = self.client.recv(2048).decode('utf-8') - if len(msg) != 0: self.dataDealer(json.loads(msg)) +# def dataReceiver(self): +# try: +# while True: +# msg = self.client.recv(2048).decode('utf-8') +# if len(msg) != 0: self.dataDealer(json.loads(msg)) - except socket.error as e: - print(e) - return e +# except socket.error as e: +# print(e) +# return e - def tell_move(self, move: Move): - thisMove = { - 'type': 1, - 'msg':{ - "game_id": self.game_id, - "side": int(self.red_to_move), - "chessman": move.cur_piece, - "src": { - "x": move.start_row, - "y": move.start_col - }, - "dst": { - "x": move.end_row, - "y": move.end_col - } - } - } - self.client.send(thisMove) +# def tell_move(self, move: Move): +# thisMove = { +# 'type': 1, +# 'msg':{ +# "game_id": self.game_id, +# "side": int(self.red_to_move), +# "chessman": move.cur_piece, +# "src": { +# "x": move.start_row, +# "y": move.start_col +# }, +# "dst": { +# "x": move.end_row, +# "y": move.end_col +# } +# } +# } +# self.client.send(thisMove) - def login(self,myName): - myPlayerData = { - 'type': 0, # game state type ? - 'msg': { - 'name': myName - } - } - self.client.send(myPlayerData) +# def login(self,myName): +# myPlayerData = { +# 'type': 0, # game state type ? +# 'msg': { +# 'name': myName +# } +# } +# self.client.send(myPlayerData) class GameState: def __init__(self): @@ -221,6 +221,7 @@ class GameState: for col in range(len(self.board[row])): player = self.board[row][col][0] if (player == 'r' and self.red_to_move or player == 'b' and not self.red_to_move): + #print('what color is the valid move? ',player) self.moveFunctions[self.board[row][col][1]](row,col,moves) return moves diff --git a/__pycache__/SafariChess_Classes.cpython-39.pyc b/__pycache__/SafariChess_Classes.cpython-39.pyc index 741f4218a7cea57d68a3aae3362b9d09dd6a4d4d..a8f5bb0428c98dc0bee08f1a1c9598b755274729 100644 GIT binary patch delta 198 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