【问题标题】:How to swap two variables between functions at the same time?如何同时在函数之间交换两个变量?
【发布时间】:2020-11-17 16:10:48
【问题描述】:

我正在制作一个 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()

知道如何同时交换它们吗?这两个变量可以一个接一个地交换,但在我的情况下会出错,因为变量交换的速度不够快。

【问题讨论】:

    标签: python multithreading server


    【解决方案1】:

    我找到了一种交换它们的方法,但代码在我这样做时不太灵活。我对交换部分进行了硬编码。

    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)
    

    我就是这样做的,希望对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2019-11-08
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多