diff --git a/SafariChess_Gamev1.0.py b/SafariChess_Gamev1.0.py index dc64986..3976fab 100644 --- a/SafariChess_Gamev1.0.py +++ b/SafariChess_Gamev1.0.py @@ -260,7 +260,7 @@ def main(mode,p1,p2,network = None): loadImages() drawBoard(screen) isOnline = bool(network != None) - game_state=backend.GameState(isNet=isOnline,MySide=True if not isOnline else bool(NewPlayerMessage['side'])) + game_state=backend.GameState(isNet=isOnline,MySide=True if not isOnline else bool(NewPlayerMessage['side']),game_id=NewPlayerMessage['game_id'],client=network) valid_moves=game_state.getAllMoves() running = True mademove = False @@ -316,7 +316,6 @@ def main(mode,p1,p2,network = None): pg.display.flip() elif mode == 2: while running: - for e in pg.event.get(): #接下来处理游戏中的事件 if e.type == pg.QUIT: @@ -352,7 +351,12 @@ def main(mode,p1,p2,network = None): if mademove: valid_moves = game_state.getAllMoves() - ShowGameState(screen,game_state,valid_moves,square_selected) + ShowGameState(screen,game_state,valid_moves,square_selected) + #* 网络对战局面更新 + if network is not None: + print('waiting for other players to move...') + otherMove = game_state.dnldmv_server() + if game_state.conquer(): showGameOverText(screen,"player "+game_state.win_person+" wins") game_over = True diff --git a/SafariChess_backend.py b/SafariChess_backend.py index 4ca1318..547f503 100644 --- a/SafariChess_backend.py +++ b/SafariChess_backend.py @@ -2,37 +2,66 @@ import socket import requests import sys import json -class GameState: - - ''' - def uploadtoServer(self,move): - #将move转换为json格式 - - #将json格式的move上传到服务器 - - pass - - def getEnemyMove(self): - #从服务器获取json信息 - - #将json信息转化成move - - #返回move - pass - - def updatefromServer(self,move): - move=getEnemyMove() - self.makeMove(move) - pass - - def getLoginInfo(self): - #从服务器获取登录信息 +class Network: + def __init__(self): + 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) - #返回登录信息 - pass - ''' - - def __init__(self, isNet = False, MySide = True): + self.msg = self.connect() + + def getPos(self): + return self.pos + + 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') + #return self.client.recv(2048).encode() + self.client.send(packet) + except socket.error as e: + print(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 receive(self): + try: + msg = json.loads(self.client.recv(2048)) + print(msg) + return msg + except socket.error as e: + print(e) + return e + +class Move: + def __init__(self,start_loc,end_loc,board): + self.start_row = start_loc[0] + self.start_col = start_loc[1] + self.end_row = end_loc[0] + self.end_col = end_loc[1] + self.nxt_piece = board[self.end_row][self.end_col] + self.cur_piece = board[self.start_row][self.start_col] + self.attack = self.nxt_piece != '00' + self.moveID = self.start_row + self.start_col*10 + self.end_row *100 +self.end_col * 1000 #Hash + def __eq__(self, __o: object) -> bool: + if isinstance(__o, Move): + return self.moveID == __o.moveID + return False +class GameState: + def __init__(self, isNet = False, MySide = True, + game_id = None, client:Network = None ): ''' 有关信息: 1. 棋盘尺寸为7*9(横向) @@ -69,7 +98,9 @@ class GameState: self.red_pieces=[7,6,5,4,3,2,1] #红方(右)先行 self.isNet = isNet + self.game_id = game_id self.red_to_move=MySide + self.client = client self.conquered=False self.win_person='' self.MASSACRE=False @@ -77,8 +108,28 @@ class GameState: def color(self): return 'r' if self.red_to_move else 'b' #网络版相关组件 - def upld2server(self,move): - pass + def upldmv_server(self,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 dnldmv_server(self): + thisMovejson = self.client.receive() + thisMove = + return thisMove # 判断特殊位置 def inHome(self,row,col,color): @@ -287,62 +338,7 @@ class GameState: 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.upldmv_server(move) - -class Network: - def __init__(self): - 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() - - def getPos(self): - return self.pos - - 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') - #return self.client.recv(2048).encode() - self.client.send(packet) - except socket.error as e: - print(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 receive(self): - try: - msg = json.loads(self.client.recv(2048)) - print(msg) - return msg - except socket.error as e: - print(e) - return e - -class Move: - def __init__(self,start_loc,end_loc,board): - self.start_row = start_loc[0] - self.start_col = start_loc[1] - self.end_row = end_loc[0] - self.end_col = end_loc[1] - self.nxt_piece = board[self.end_row][self.end_col] - self.cur_piece = board[self.start_row][self.start_col] - self.attack = self.nxt_piece != '00' - self.moveID = self.start_row + self.start_col*10 + self.end_row *100 +self.end_col * 1000 #Hash - def __eq__(self, __o: object) -> bool: - if isinstance(__o, Move): - return self.moveID == __o.moveID - return False \ No newline at end of file