如何在函数之间同时交换两个变量?

时间:2020-07-28 08:52:49

标签: python multithreading server

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

有什么主意,我应该如何同时交换它们?这两个变量可以一个接一个地交换,但是在我的情况下这会产生错误,因为这些变量交换得不够快。

1 个答案:

答案 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)

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