[Python] 纯文本查看 复制代码
import pygame
import socket
import threading
import json
import math
# ========== 修改这里!填入服务端电脑的局域网IPv4地址 ==========
SERVER_HOST = "192.168.2.34"
SERVER_PORT = 7788
# ==========================================================
# 窗口配置
WIDTH, HEIGHT = 800, 600
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("局域网多人联机驾驶游戏")
clock = pygame.time.Clock()
# 本地控制缓存
ctrl_angle = 0
ctrl_speed = 0
# 所有车辆同步数据
all_cars = {}
my_pid = None
# 连接服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER_HOST, SERVER_PORT))
def recv_loop():
"""持续接收服务器同步数据"""
global all_cars, my_pid
buf = b""
while True:
try:
data = sock.recv(2048)
if not data:
break
buf += data
while b"\n" in buf:
line, buf = buf.split(b"\n", 1)
msg = json.loads(line.decode())
if msg["type"] == "sync":
all_cars = msg["cars"]
elif msg["type"] == "new_player":
if my_pid is None:
my_pid = msg["pid"]
elif msg["type"] == "leave":
pid = msg["pid"]
if pid in all_cars:
del all_cars[pid]
except:
break
print("与服务器断开连接")
pygame.quit()
# 开启接收线程
threading.Thread(target=recv_loop, daemon=True).start()
def draw_car(x, y, angle, color):
"""绘制旋转小车"""
car_surf = pygame.Surface((24, 40), pygame.SRCALPHA)
pygame.draw.rect(car_surf, color, (0, 0, 24, 40))
pygame.draw.rect(car_surf, (30, 30, 30), (2, 5, 20, 12))
rotated = pygame.transform.rotate(car_surf, -angle)
rect = rotated.get_rect(center=(x, y))
screen.blit(rotated, rect)
# 主循环
running = True
while running:
dt = clock.tick(60) / 1000.0
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 按键控制
keys = pygame.key.get_pressed()
turn_speed = 120
accel = 180
friction = 0.92
if keys[pygame.K_A]:
ctrl_angle -= turn_speed * dt
if keys[pygame.K_D]:
ctrl_angle += turn_speed * dt
if keys[pygame.K_W]:
ctrl_speed += accel * dt
if keys[pygame.K_S]:
ctrl_speed -= accel * dt
# 摩擦力减速
ctrl_speed *= friction
# 速度限制
ctrl_speed = max(-120, min(120, ctrl_speed))
# 发送控制指令到服务端
send_msg = json.dumps({
"type": "control",
"angle": ctrl_angle,
"speed": ctrl_speed
}) + "\n"
sock.send(send_msg.encode("utf-8"))
# 渲染画面
screen.fill((30, 80, 30))
# 绘制道路边线
pygame.draw.rect(screen, (70, 70, 70), (20, 20, WIDTH-40, HEIGHT-40), 4)
# 绘制所有在线玩家车辆
for pid, car_data in all_cars.items():
draw_car(
car_data["x"],
car_data["y"],
car_data["angle"],
car_data["color"]
)
pygame.display.flip()
sock.close()
pygame.quit()