В процессе написания все исправно работало хост и окно игрока запускались. Потом в хосте я добавил некоторые функции и параметры и в итоге хост работает исправно, а в игроке запускается окно но ничего не выводит и просто не отвечает. Помогите пожалуйста.
сервер:
import socket
import time
import pygame
import random
WIDTH, HEIGHT = 2000, 2000
WIDTH_S, HEIGHT_S = 300, 300
FPS = 100
START_PLAYER_SIZE = 50
colours = {'0' : (255, 255, 0),
'1' : (255, 0, 0),
'2' : (0, 255, 0),
'3' : (0, 255, 255),
'4' : (128, 0, 128)}
def find(s):
open = None
for i in range(len(s)):
if s[i] == '<':
open = i
if s[i] == '>' and open != None:
open = i
res = s[open + 1 : open]
res = list(map(int, res.split(',')))
return res
return ' '
class Player():
def _init_(self, conn, addr, x, y, r, colour):
self.conn = conn
self.addr = addr
self.x = x
self.y = y
self.r = r
self.colour = colour
self.w_vision = 1000
self.h_vision = 1000
self.errors = 0
self.abs_speed = 1
self.speed_x = 0
self.speed_y = 0
def change_speed(self, data):
if (v[0] == 0) and (v[1] == 0):
self.speed_x = 0
self.speed_y = 0
else:
lenv = (v[0]**2 + [1]**2)**0.5
v = (v[0/lenv, v[1]/lenv])
v = (v[0]*self.abs_speed, v[1]*self.abs_speed)
self.speed_x, speed_y = v[0], v[1]
def update(self):
self.x += self.speed_x
self.y += self.speed_y
#создание сокета
main_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#AF_INET - тип адресов IPv4
#SOCK_STREAM - протокол TCP
main_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
main_socket.bind(('localhost', 10000)) #добавили сокету хост и порт
main_socket.setblocking(0)
main_socket.listen(5)#сокет прослушивает 5 устройств
print('Создался сокет')
#создание графического окна сервера
pygame.init()
screen = pygame.display.set_mode((WIDTH_S, HEIGHT_S))
pygame.display.set_caption('server')
clock = pygame.time.Clock()#устанавливает частоту
players = []
start = True
while start:
clock.tick(FPS)
#есть ли желающие войти в игру
try:
new_socket, addr = main_socket.accept()
print('подключился', addr)
new_socket.setblocking(0)
new_player.setblocking(0)
new_player = Player(new_socket, addr,
random.randint(0, WIDTH),
random.randint(0, HEIGHT),
START_PLAYER_SIZE,
str(random.randint(0, 4)))
players.append(new_player)
except:
pass
#считываем команды игроков
for player in players:
try:
data = player.conn.recv(1024)
data = data.decode()
data = find(data)
#обрабатываем команды
player.change_speed(data)
except:
pass
player.update()
#определим, что видит каждый игрок
visible_balls = [[] for i in range(len(players))]
for i in range(len(players)):
for j in range(i + 1, len(players)):
#рассматриваем пару i и j игрока
dist_x = players[j].x - players[i].x
dist_y = players[j].y - players[i].y
# i видит j
if (((abs(dist_x) <= players[i].w_vision)//2 + players[j].r) and ((abs(dist_y) <= players[i].h_vision)//2 + players[j].r)):
#подготовим данные к добавлению в список видимых шаров
x_ = str(round(dist_x))
y_ = str(round(dist_y))
r_ = str(round(players[j].r))
c = players[j].colour
visible_balls[i].append(x_ + ' ' + y_ + ' ' + r_ + ' ' + c_)
# j видит i nn
if (
((abs(dist_x) <= players[j].w_vision)//2 + players[i].r)
and
((abs(dist_y) <= players[j].h_vision)//2 + players[i].r)
):
#подготовим данные к добавлению в список видимых шаров
x_ = str(round(-dist_x))
y_ = str(round(-dist_y))
r_ = str(round(players[i].r))
c = players[i].colour
visible_balls[j].append(x_ + ' ' + y_ + ' ' + r_ + ' ' + c_)
#формируем ответ каждому игроку
answers = [' ' for i in range(len(players))]
for i in range(len(players)):
answers[i] = '<' + (','.join(visible_balls[i])) + '>'
#отправляем новое состояние игрового поля
for i in range(len(players)):
try:
players[i].conn.send(answers[i].encode())
players[i].errors = 0
except:
players[i].errors += 1
#чистим список от отвалившихся игроков
for player in players:
if player.errors == 500:
player.conn.close()
players.remove(player)
#нарисуем состояние комнаты
for event in pygame.event.get():#цикл последних событий
if event.type == pygame.QUIT:
start = False
screen.fill('BLACK')
for player in players:
x = round(player.x * WIDTH_S/WIDTH)
y = round(player.y * HEIGHT_S/HEIGHT)
r = round(player.r * WIDTH_S/WIDTH)
c = colours[player.colour]
pygame.draw.circle(screen, c, (x, y), r)
pygame.display.update()
pygame.quit()
main_socket.close()
игрок:
import socket
import pygame
WIDTH, HEIGHT = 1000, 800
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
sock.connect(('localhost', 10000))
#создание окна игры
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Агарио')
old_v = (0, 0)
start = True
while start:
#обработка событий
for event in pygame.event.get():#цикл последних событий
if event.type == pygame.QUIT:
start = False
#cчитаем положение мыши игрока
if pygame.mouse.get_focused():
pos = pygame.mouse.get_pos()
v = (pos[0]- WIDTH//2, pos[1] - HEIGHT//2)
if (v[0])**2 + (v[1])**2 <= 50**2:
v = (0, 0)
#отправляем вектор желаемого направления движения,
#если он поменялся
if v != old_v:
old_v += v
message = '<' + str(v[0]) + ',' + str(v[1]) + '>'
sock.send(message.encode())
#получение нового состояния игрового поля
data = sock.recv(2**20)
data = data.decode()
print(data)
#рисуем новое состояние игрового поля
screen.fill('gray25')
pygame.draw.circle(screen, (255, 0, 0),
(WIDTH//2, HEIGHT//2), 50)
pygame.display.update()
pygame.quit()