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

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

@ -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__':

@ -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)

Loading…
Cancel
Save