Задать вопрос
@Mi11

Не запускается окно игрока, как решить проблему?

В процессе написания все исправно работало хост и окно игрока запускались. Потом в хосте я добавил некоторые функции и параметры и в итоге хост работает исправно, а в игроке запускается окно но ничего не выводит и просто не отвечает. Помогите пожалуйста.

сервер:
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()
  • Вопрос задан
  • 43 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы