Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать обработку от какого игрока поступили координаты 1-го игрока, 2-го, 3-го и т.д.? Python. socket, pygame

Никита Документов Профи (976), на голосовании 2 месяца назад
клиент:
 import socket 
import pygame
import threading

pygame.init()

s = socket.socket()
host_f = open('socket.txt')
host_f1 = host_f.readline()
name = open('name.txt')
name1 = name.readline()

HOST = host_f1
PORT = 6000
s.connect((HOST, PORT))

x = 0
y = 0
fat = 50

x1 = 0
y1 = 0

pos = (x, y, fat, fat)
old_pos = (x, y, fat, fat)

pos1 = x1, y1, fat, fat

sc = pygame.display.set_mode((300, 450))
clock = pygame.time.Clock()
clossed = 0
id_ = 1

def cord():
global s, x, y, old_pos, pos, x1, y1, name1, clossed
try:
data = s.recv(1024)
player_pos = data.decode()
ggg = player_pos.split(',')
player_cord = (ggg[0], ggg[1], ggg[2])
if ggg[0] != name1:
x1 = int(ggg[1])
y1 = int(ggg[2])
except:
pass

def cord1():
global s, x, y, old_pos, pos, x1, y1, name1, clossed
posggg = str(name1) + ',' + str(x) + ',' + str(y) + ',' + str(clossed)
if old_pos != pos:
old_pos = pos
s.send(posggg.encode())

running = True

while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
clossed = 1
posggg = str(name1) + ',' + str(x) + ',' + str(y) + ',' + str(clossed)
s.send(posggg.encode())
pygame.quit()
exit()
running = False
sc.fill('white')
pygame.draw.rect(sc, ('blue'), (pos))

try:
pygame.draw.rect(sc, ('red'), (pos1))
except:
pass

pos = (x, y, fat, fat)
pos1 = (x1, y1, fat, fat)

keys = pygame.key.get_pressed()

if keys[pygame.K_a]:
x-=2
elif keys[pygame.K_d]:
x+=2
elif keys[pygame.K_s]:
y+=2
elif keys[pygame.K_w]:
y-=2

pygame.display.update()

threading.Thread(target=cord).start()
threading.Thread(target=cord1).start()
сервер:
 import socket 
import time
import threading

fff = 0
cord1 = 0
cord = 0
data = 0

def client_recv(conn, addr):
global fff, cord1, cord, data, id_
print('Подключился: ', addr)
conn.setblocking(0)
while True:
try:
data = conn.recv(1024)
player_pos = data.decode()
cord = player_pos.split(',')
cord1 = str(cord[0]) + ',' + str(cord[1]) + ',' + str(cord[2]) + ',' + str(cord[3])
ggg = int(cord[3])

print(cord[0], cord[1], cord[2], cord[3])
if ggg == 1:
break
except:
pass

try:
if fff != cord1:
fff = cord1
massenge = conn.send(cord1.encode())
except:
fff = cord1
pass
print('Отключился -', cord[0])
conn.close()

s = socket.socket()
host_f = open('socket.txt')
host_f1 = host_f.readline()

HOST = host_f1
PORT = 6000

s.bind((HOST, PORT))
s.listen(2)

print('Сервер запущен')

while True:
conn, addr = s.accept()

threading.Thread(target=client_recv, args=(conn, addr)).start()
в эту игру можно играть только на двоих, логика игры такова: если имя не равняется тому которое указанно в файле name.txt, то он управляет вторым игроком, соответственно другому игроку нужно обязательно поменять имя в файле name.txt, но если вдруг подключится третий игрок то как третий и второй управляют тем же вторым игроком, как сделать такую игру в которой можно играть с несколькими игроками, 3, 5, да хоть 10 игроков? Подскажите плиз
Голосование за лучший ответ
Андрей Панарин Искусственный Интеллект (242620) 3 месяца назад
Помимо соединения передавать в client_recv номер игрока.
Использовать этот номер при приеме данных из соединения.
Никита ДокументовПрофи (976) 3 месяца назад
сделал переменную id_ с значением 0, при подключении клиента id_+=1 тоесть добавляется 1 если клиент не один а например 2 то и значение 2, сервер понял что 2 игрока, а как понять от какого игрока поступили координаты? Можно конечно сделать номер и рандом при соединении с сервером выбирался рандомный номер из списка, но если у двух клиентов совпадут номера?
Андрей Панарин Искусственный Интеллект (242620) Передавайте номер игрока в client_recv параметром. Так у каждого вызова client_recv будет свой параметр.
Похожие вопросы