我正在制作2D多人游戏,所以我需要交换两个玩家的x和y值,以便他们可以看到彼此移动。这就是我的操作方式,您知道如何同时交换它吗?
import socket
import threading
HEADER = 64
PORT = 5050
SERVER = "192.168.0.137"
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
x_value = 0
y_value = 0
x_value_2 = 0
y_value_2 = 0
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
def handle_client_1(conn, addr):
print(f"[NEW CONNECTION1] {addr} connected.")
connected = True
while connected:
msg_lenght = conn.recv(HEADER).decode(FORMAT)
if msg_lenght:
msg_lenght = int(msg_lenght)
msg = conn.recv(msg_lenght).decode(FORMAT)
if msg == DISCONNECT_MESSAGE:
connected = False
else:
msg = msg.split(' ')
global x_value_2
global y_value_2
x_value_2 = msg[0]
y_value_2 = msg[1]
print(x_value, y_value)
msg = x_value + " " + y_value
msg_lenght = len(msg)
msg_lenght = str(msg_lenght).encode(FORMAT)
msg_lenght += b' ' * (HEADER - len(msg))
conn.send(msg_lenght)
conn.send((msg).encode(FORMAT))
conn.close()
def handle_client_2(conn, addr):
print(f"[NEW CONNECTION2] {addr} connected.")
connected = True
while connected:
msg_lenght = conn.recv(HEADER).decode(FORMAT)
if msg_lenght:
msg_lenght = int(msg_lenght)
msg = conn.recv(msg_lenght).decode(FORMAT)
if msg == DISCONNECT_MESSAGE:
connected = False
else:
msg = msg.split(' ')
global x_value
global y_value
x_value = msg[0]
y_value = msg[1]
print(x_value, y_value)
msg = x_value_2 + " " + y_value_2
msg_lenght = len(msg)
msg_lenght = str(msg_lenght).encode(FORMAT)
msg_lenght += b' ' * (HEADER - len(msg))
conn.send(msg_lenght)
conn.send((msg).encode(FORMAT))
conn.close()
def start():
server.listen()
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print(f"[LISTENING] Sever is listening on {SERVER}")
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
conn, addr = server.accept()
conn_2, addr_2 = server.accept()
thread = threading.Thread(target=handle_client_2, args=(conn_2, addr_2))
handle_client_2(conn_2, addr_2)
thread2 = threading.Thread(target=handle_client_1, args=(conn, addr))
handle_client_1(conn, addr)
thread2.start()
thread.start()
print("[STARTING] Starting......")
start()
有什么主意,我应该如何同时交换它们?这两个变量可以一个接一个地交换,但是在我的情况下这会产生错误,因为这些变量交换得不够快。
答案 0 :(得分:0)
我找到了一种交换它们的方法,但是代码的执行方式并不十分灵活。我对交换部分进行了硬编码。
def get_values(conn):
msg = conn.recv(HEADER).decode(FORMAT)
if msg == DISCONNECT_MESSAGE:
quit()
else:
msg = msg.split(' ')
x_value = msg[0]
y_value = msg[1]
return x_value, y_value
def exchange(conn_1, addr_1, conn_2, addr_2):
print("[NEW GAME] started....")
connected = True
while connected:
x_value_1, y_value_1, health_1, shoot_1 = get_values(conn_1)
x_value_2, y_value_2, health_2, shoot_2 = get_values(conn_2)
message_1 = x_value_2 + " " + y_value_2
message_2 = x_value_1 + " " + y_value_1
message_1 = message_1.encode(FORMAT)
message_2 = message_2.encode(FORMAT)
conn_1.send(message_1)
conn_2.send(message_2)
这就是我的做法,希望对其他人有帮助。