import network, sys, json, pygame, random pygame.init() address = ["0.0.0.0", int(sys.argv[1])] w, h = 640, 480 size = [w, h] black = [0, 0, 0] class Player: def __init__(self, pid, address, pos, color): self.pid = pid self.address = address self.pos = pos self.color = color self.speed = [0, 0] screen = pygame.display.set_mode(size) clock = pygame.time.Clock() sock = network.Sock() sock.listen(address) me = Player(random.randint(0,65535), address, [10, 10], [255, 0, 0]) players = {me.pid: me} def send_all(msg): msg = json.dumps(msg) for pid in players: sock.send(msg, players[pid].address) sock.send(json.dumps({"type":"join","pos":me.pos,"color":me.color,"port":address[1],"pid":me.pid}), ["192.168.0.255", 33033]) sock.send(json.dumps({"type":"join","pos":me.pos,"color":me.color,"port":address[1],"pid":me.pid}), ["127.0.0.1", 33033]) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: me.speed[0] = 1 send_all({"type":"move", "pid":me.pid, "speed":me.speed}) elif event.key == pygame.K_LEFT: me.speed[0] = -1 send_all({"type":"move", "pid":me.pid, "speed":me.speed}) elif event.key == pygame.K_DOWN: me.speed[1] = 1 send_all({"type":"move", "pid":me.pid, "speed":me.speed}) elif event.key == pygame.K_UP: me.speed[1] = -1 send_all({"type":"move", "pid":me.pid, "speed":me.speed}) elif event.type == pygame.KEYUP: if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT or event.key == pygame.K_DOWN or event.key == pygame.K_UP: me.speed[0] = 0 me.speed[1] = 0 send_all({"type":"move", "pid":me.pid, "speed":me.speed}) for (r, c) in sock.get(): r = json.loads(r.decode()) if r["pid"] == me.pid: continue if r["type"] == "join": pl = [] for pid in players: player = players[pid] pl.append({"pid":pid, "pos":player.pos, "color":player.color, "address":player.address}) sock.send(json.dumps({"type":"recap", "players":pl, "pid":me.pid}), [c[0], r["port"]]) players[r["pid"]] = Player(r["pid"], [c[0], r["port"]], r["pos"], r["color"]) elif r["type"] == "move": players[r["pid"]].speed = r["speed"] elif r["type"] == "recap": for player in r["players"]: if not player["pid"] in players: players[player["pid"]] = Player(player["pid"], player["address"], player["pos"], player["color"]) screen.fill(black) pygame.draw.rect(screen, me.color, (*me.pos, 16, 16)) for pid in players: player = players[pid] player.pos[0] += player.speed[0] player.pos[1] += player.speed[1] pygame.draw.rect(screen, player.color, (*player.pos, 16, 16)) pygame.display.flip() clock.tick(30)