下午进度
master
DoubleQ 3 years ago
parent 1a4f07f70c
commit f3f2f60df3

@ -18,7 +18,7 @@
"type": "python", "type": "python",
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/network/server.py", "program": "${workspaceFolder}/network/server.py",
"cwd": "${fileDirname}", "cwd": "${workspaceFolder}/network/",
"console": "integratedTerminal", "console": "integratedTerminal",
"justMyCode": true "justMyCode": true
}, },

@ -34,21 +34,12 @@ SIZE = 64
IMAGES = {} IMAGES = {}
bias_top = 100 #棋盘的上边距 bias_top = 100 #棋盘的上边距
bias_left = 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双方分别有象狮豹狼狐鹰鼠七个角色 def loadImages():#加载图片,a,b双方分别有象狮豹狼狐鹰鼠七个角色
pieces = ["r7", "r6", "r5", "r4", "r3", "r2", "r1", pieces = ["r7", "r6", "r5", "r4", "r3", "r2", "r1",
"b7", "b6", "b5", "b4", "b3", "b2", "b1", "b7", "b6", "b5", "b4", "b3", "b2", "b1",
@ -251,7 +242,8 @@ def main(mode,p1,p2,network = None):
NewPlayerMessage = '' #来自对手的信息 NewPlayerMessage = '' #来自对手的信息
if mode == 2: if mode == 2:
network=backend.Network() network=backend.Network()
player1 = input("Enter your name: ") #p1 = input("Enter your name: ")
p1 = 'player1'
myPlayerData = { myPlayerData = {
'type': 0, # game state type ? 'type': 0, # game state type ?
'msg': { 'msg': {
@ -262,7 +254,7 @@ def main(mode,p1,p2,network = None):
print("Waiting for other player...") print("Waiting for other player...")
NewPlayerMessage = network.receive() NewPlayerMessage = network.receive()
print() print()
player2 = NewPlayerMessage['counterpart_name'] p2 = NewPlayerMessage['counterpart_name']
pg.init() pg.init()
screen = pg.display.set_mode((BOARD_WIDTH + MOVE_LOG_PANEL_WIDTH, BOARD_HEIGHT)) screen = pg.display.set_mode((BOARD_WIDTH + MOVE_LOG_PANEL_WIDTH, BOARD_HEIGHT))
pg.display.set_caption("Safafi Chess Game") pg.display.set_caption("Safafi Chess Game")
@ -361,18 +353,19 @@ def main(mode,p1,p2,network = None):
#设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能 #设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能
pass pass
#* 网络对战局面更新
#? 考虑将多线程状态更新指令写在backend中。
#? 但是考虑到ui刷新问题故仍尝试在main中写
#ShowGameState(screen,game_state,valid_moves,square_selected)
if mademove: if mademove:
valid_moves = game_state.getAllMoves() mademove = False
#mademove = False game_state.updateEnemy()#思路变成:定时对敌方进行扫描,若收到更新相关包则进行局面更新。
#* 网络对战局面更新 ShowGameState(screen,game_state,valid_moves,square_selected)
if network is not None:
startNewThread(updateForEnemy(network,game_state))
ShowGameState(screen,game_state,valid_moves,square_selected)
if game_state.conquer(): if game_state.conquer():
showGameOverText(screen,"player "+game_state.win_person+" wins") showGameOverText(screen,"player "+game_state.win_person+" wins")
game_over = True game_over = True
clock.tick(60) clock.tick(60)
pg.display.flip() pg.display.flip()
if __name__ == '__main__': if __name__ == '__main__':

@ -1,7 +1,15 @@
import socket import socket
import this
import requests import requests
import sys import sys
import json import json
from threading import Thread
#multithreading?
def startNewThread(target):
thread = Thread(target=target)
thread.daemon = True
thread.start()
class Network: class Network:
def __init__(self): def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@ -28,6 +36,7 @@ class Network:
packet = packet.encode('utf-8') packet = packet.encode('utf-8')
#return self.client.recv(2048).encode() #return self.client.recv(2048).encode()
self.client.send(packet) self.client.send(packet)
print("send complete")
except socket.error as e: except socket.error as e:
print(e) print(e)
@ -38,8 +47,9 @@ class Network:
def receive(self): def receive(self):
try: try:
msg = json.loads(self.client.recv(2048)) recvMsg = self.client.recv(2048).decode('utf-8')
print(msg) msg = json.loads(recvMsg)
print('receiver got: ', msg)
return msg return msg
except socket.error as e: except socket.error as e:
print(e) print(e)
@ -100,6 +110,7 @@ class GameState:
self.isNet = isNet self.isNet = isNet
self.game_id = game_id self.game_id = game_id
self.red_to_move=MySide self.red_to_move=MySide
self.MySide = MySide
self.client = client self.client = client
self.conquered=False self.conquered=False
self.win_person='' self.win_person=''
@ -107,6 +118,8 @@ class GameState:
def color(self): def color(self):
return 'r' if self.red_to_move else 'b' 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): def upldmv_server(self,move):
thisMove = { thisMove = {
@ -126,11 +139,19 @@ class GameState:
} }
} }
self.client.send(thisMove) self.client.send(thisMove)
def dnldmv_server(self): def __updateOther__(self):#! 注意:考虑使用多线程执行该函数。
#print('waiting 4 other player 2 act...')
thisMovejson = self.client.receive() thisMovejson = self.client.receive()
thisMove = Move([thisMovejson['src']['x'],thisMovejson['src']['y']],[thisMovejson['dst']['x'],thisMovejson['dst']['y']],self.board) if not thisMovejson or thisMovejson['side'] == int(self.MySide):
return thisMove 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): def inHome(self,row,col,color):
if color=="b": if color=="b":
@ -326,8 +347,9 @@ class GameState:
return self.conquered return self.conquered
#移动操作 #移动操作
def makeMove(self,move):#cur是当前位置nxt是下一个位置,参数传入为元组 def makeMove(self,move,toUpload = True):#cur是当前位置nxt是下一个位置,参数传入为元组
# makeMove假设这个move一定是合法的 # makeMove假设这个move一定是合法的
# 为什么添加toUpload防止使用makeMove更新己方棋盘时把敌方棋盘错误上传导致“棋子消失”。
if self.board[move.end_row][move.end_col] != '00': if self.board[move.end_row][move.end_col] != '00':
nxt_piece = self.board[move.end_row][move.end_col] nxt_piece = self.board[move.end_row][move.end_col]
if nxt_piece[0] == 'r': if nxt_piece[0] == 'r':
@ -336,9 +358,10 @@ class GameState:
self.blue_pieces.remove(int(nxt_piece[1])) 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.end_row][move.end_col] = self.board[move.start_row][move.start_col]
self.board[move.start_row][move.start_col] = '00' self.board[move.start_row][move.start_col] = '00'
if not self.isNet: self.red_to_move = not self.red_to_move self.red_to_move = not self.red_to_move
else: #由于使用多线程考虑让另一个线程去更新red_to_move
#直接在这里完成两步实现看起来不可行…… if self.isNet and toUpload:
#因为界面更新在main中 #因为界面更新在main中考虑在main中执行相关指令。
self.upldmv_server(move) self.upldmv_server(move)

Loading…
Cancel
Save