From 655ef43aa526b633496b77108d351e436a5de01f Mon Sep 17 00:00:00 2001 From: DoubleQ <1243026909@qq.com> Date: Tue, 13 Sep 2022 17:54:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 9 + SafariChess_Gamev1.0.py | 162 ++++++++++++------ SafariChess_backend.py | 95 +++++++++- .../SafariChess_backend.cpython-39.pyc | Bin 8795 -> 11257 bytes network/server.py | 2 +- network/transfer.py | 26 --- 6 files changed, 213 insertions(+), 81 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7e5da93..a42fab7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -21,6 +21,15 @@ "cwd": "${fileDirname}", "console": "integratedTerminal", "justMyCode": true + }, + { + "name": "current file", + "type": "python", + "request": "launch", + "program": "${file}", + "cwd": "${fileDirname}", + "console": "integratedTerminal", + "justMyCode": true } ] } \ No newline at end of file diff --git a/SafariChess_Gamev1.0.py b/SafariChess_Gamev1.0.py index f35b54c..dc64986 100644 --- a/SafariChess_Gamev1.0.py +++ b/SafariChess_Gamev1.0.py @@ -10,13 +10,13 @@ it handle user input and GUI """ import colorsys -from json import load +import json import pygame as pg import sys -from time import process_time +import socket import SafariChess_backend as backend from SafariChess_Classes import Button -import network.server as Server +from threading import Thread, Lock #设置棋盘的参数 WIDTH = 1000 @@ -34,6 +34,9 @@ SIZE = 64 IMAGES = {} bias_top = 100 #棋盘的上边距 bias_left = 100 #棋盘的左边距 +#multithreading? +mutex = Lock() +mutex_playing = Lock() def loadImages():#加载图片,a,b双方分别有象狮豹狼狐鹰鼠七个角色 pieces = ["r7", "r6", "r5", "r4", "r3", "r2", "r1", @@ -80,8 +83,7 @@ def drawPieces(screen,board): if piece != "00": screen.blit(IMAGES[piece], pg.Rect((column * SIZE) + bias_left + 5, (row * SIZE) + bias_top + 5, SIZE - 10, SIZE - 10)) -def uploadtoServer(move : backend.Move): - pass + # square_selected 是当前选中的可以移动的棋子的位置 def protrudeSquares(screen,game_state,square_selected,valid_moves): @@ -234,7 +236,22 @@ def MainMenu(): -def main(mode,p1,p2): +def main(mode,p1,p2,network = None): + NewPlayerMessage = '' #来自对手的信息 + if mode == 2: + network=backend.Network() + player1 = input("Enter your name: ") + myPlayerData = { + 'type': 0, # game state type ? + 'msg': { + 'name': player1 + } + } + network.send(myPlayerData) + print("Waiting for other player...") + NewPlayerMessage = network.receive() + print() + player2 = 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") @@ -242,7 +259,8 @@ def main(mode,p1,p2): screen.fill(pg.Color("white")) loadImages() drawBoard(screen) - game_state=backend.GameState() + isOnline = bool(network != None) + game_state=backend.GameState(isNet=isOnline,MySide=True if not isOnline else bool(NewPlayerMessage['side'])) valid_moves=game_state.getAllMoves() running = True mademove = False @@ -250,57 +268,105 @@ def main(mode,p1,p2): square_selected = ()#刚开始没有选择任何一个棋子 click_queue = []#点击队列,记录第一次点击和第二次点击位置,方便移动棋子 pg.display.update() - startGamePage() - while running: - for e in pg.event.get(): - #接下来处理游戏中的事件 - if e.type == pg.QUIT: - pg.quit() - sys.exit() + startGamePage(mode) + + if mode == 1: + while running: + for e in pg.event.get(): + #接下来处理游戏中的事件 + if e.type == pg.QUIT: + pg.quit() + sys.exit() + + elif e.type == pg.MOUSEBUTTONDOWN: + #鼠标点击事件:用于选择棋子,移动棋子 + if not game_over: + 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 + if square_selected == (row,col) or col >=DIMENSION_COLUMNS or row >= DIMENSION_ROWS: + square_selected = () + click_queue = [] + else: + square_selected = (row,col) + click_queue.append(square_selected) + if(len(click_queue) == 2): + cur_piece_loc = click_queue[0] + nxt_piece_loc = click_queue[1] + move = backend.Move(cur_piece_loc,nxt_piece_loc,game_state.board) + if move in valid_moves: + game_state.makeMove(move) + mademove = True + square_selected = () + click_queue = [] + else: + click_queue = [square_selected] + + elif e.type == pg.KEYDOWN: + #设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能 + pass - elif e.type == pg.MOUSEBUTTONDOWN: - #鼠标点击事件:用于选择棋子,移动棋子 - if not game_over: - 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 - if square_selected == (row,col) or col >=DIMENSION_COLUMNS or row >= DIMENSION_ROWS: - square_selected = () - click_queue = [] - else: - square_selected = (row,col) - click_queue.append(square_selected) - if(len(click_queue) == 2): - cur_piece_loc = click_queue[0] - nxt_piece_loc = click_queue[1] - move = backend.Move(cur_piece_loc,nxt_piece_loc,game_state.board) - if move in valid_moves: - game_state.makeMove(move) - mademove = True + if mademove: + valid_moves = game_state.getAllMoves() + 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() + elif mode == 2: + while running: + + for e in pg.event.get(): + #接下来处理游戏中的事件 + if e.type == pg.QUIT: + pg.quit() + sys.exit() + elif e.type == pg.MOUSEBUTTONDOWN: + #鼠标点击事件:用于选择棋子,移动棋子 + if not game_over: + 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 + if square_selected == (row,col) or col >=DIMENSION_COLUMNS or row >= DIMENSION_ROWS: square_selected = () click_queue = [] else: - click_queue = [square_selected] + square_selected = (row,col) + click_queue.append(square_selected) + if(len(click_queue) == 2): + cur_piece_loc = click_queue[0] + nxt_piece_loc = click_queue[1] + move = backend.Move(cur_piece_loc,nxt_piece_loc,game_state.board) + if move in valid_moves: + game_state.makeMove(move) + mademove = True + square_selected = () + click_queue = [] + else: + click_queue = [square_selected] + + elif e.type == pg.KEYDOWN: + #设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能 + pass - elif e.type == pg.KEYDOWN: - #设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能 - pass - - if mademove: - valid_moves = game_state.getAllMoves() - 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 mademove: + valid_moves = game_state.getAllMoves() + 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__': print("Loading...") print("Initialing game...") mode = MainMenu() - main() + player1='player1' + network = None #前后端通信接口 + player2='player2' + main(mode,player1,player2,network) \ No newline at end of file diff --git a/SafariChess_backend.py b/SafariChess_backend.py index 34a1259..4ca1318 100644 --- a/SafariChess_backend.py +++ b/SafariChess_backend.py @@ -1,11 +1,46 @@ +import socket +import requests +import sys +import json class GameState: - def __init__(self): + + ''' + 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): + #从服务器获取登录信息 + + #返回登录信息 + pass + ''' + + def __init__(self, isNet = False, MySide = True): ''' 有关信息: 1. 棋盘尺寸为7*9(横向) 2. 按照以下命名格式对棋盘中的棋子进行标注: (b|r)(1|2|3|4|5|6|7) - 3. + 3. 左方为蓝方,对应的网络服务器中的side项目编号为0 + 右方为红方,对应的网络服务器中的side项目编号为1 + 4. 网络版需要额外的类变量:type, game_id, side, chessman(piece), src, dst ''' self.board = [ ['00','00','b7','00','00','00','r1','00','00'], @@ -32,15 +67,18 @@ class GameState: self.red_home=(3,8) self.blue_pieces=[7,6,5,4,3,2,1] self.red_pieces=[7,6,5,4,3,2,1] - #蓝方(左)先行 - self.red_to_move=False + #红方(右)先行 + self.isNet = isNet + self.red_to_move=MySide self.conquered=False self.win_person='' self.MASSACRE=False def color(self): return 'r' if self.red_to_move else 'b' - + #网络版相关组件 + def upld2server(self,move): + pass # 判断特殊位置 def inHome(self,row,col,color): @@ -247,7 +285,52 @@ 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' - self.red_to_move = not self.red_to_move + if not self.isNet: self.red_to_move = not self.red_to_move + else: + + +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): diff --git a/__pycache__/SafariChess_backend.cpython-39.pyc b/__pycache__/SafariChess_backend.cpython-39.pyc index 3f19128f974d630d7fc1e4be07eaec0da477612d..91388e3bc2480dd1c85782d043193a98942a353d 100644 GIT binary patch literal 11257 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 diff --git a/network/server.py b/network/server.py index 9770956..596f819 100644 --- a/network/server.py +++ b/network/server.py @@ -233,7 +233,7 @@ def main(): #now keep talking with the client start_new_thread(timer_thread, ()) - while True: + while True: #! 监听本体 #wait to accept a connection - blocking call conn, addr = server.accept() print ('Connected with ' + addr[0] + ':' + str(addr[1])) diff --git a/network/transfer.py b/network/transfer.py index fa66b15..e69de29 100644 --- a/network/transfer.py +++ b/network/transfer.py @@ -1,26 +0,0 @@ -def uploadtoServer(move,game_state): - #将move转换为json格式 - - #将json格式的move上传到服务器 - - pass - -def getEnemyMove(): - #从服务器获取json信息 - - #将json信息转化成move - - #返回move - pass - -def updatefromServer(game_state): - move=getEnemyMove() - game_state.makeMove(move) - pass - -def getLoginInfo(): - #从服务器获取登录信息 - - #返回登录信息 - pass -