Python — Помогите с кодом!

Созал простую игру, но почему-то при совпадении снаряда с рандомным врагом, враг не пропадает, но иногда пропадает. Что не так с кодом?

import pygame, random

pygame.init()
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("Jacksonville")
bg = pygame.image.load("pygame_bg.jpg")
bullets = []
clock = pygame.time.Clock()
x = 90
y = 450
width = 20
height = 20
speed = 10
run = True
enemies = [random.randrange(1, 50)*10, random.randrange(1,20)*10]
enemiesVisible = True
body = [[x, y], [x + 20,y], [x + 40,y],[x + 20,y-20]] # Структура тела питончика

class snaryad():
	def __init__(self, x , y, color, facing):
		self.x = x
		self.y = y
		self.color = color
		self.facing = facing
		self.vel = 8 * facing
	def draw(self, win):
		pygame.draw.rect(win, self.color, (pygame.Rect(self.x, self.y, 20 , 20)))	


while run:
	clock.tick(15)

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			run = False

	keys = pygame.key.get_pressed()
	if keys[pygame.K_LEFT] and x > 5:
		x -= speed
		body[0][0] -= speed
		body[1][0] -= speed
		body[2][0] -= speed
		body[3][0] -= speed
	if keys[pygame.K_RIGHT] and x < 500 - 3*width:
		x += speed
		body[0][0] += speed
		body[1][0] += speed
		body[2][0] += speed
		body[3][0] += speed
	if keys[pygame.K_f]:
		facing = 1
		if len(bullets) < 1:
			bullets.append(snaryad(round(x + width), round(y - height),(255, 0, 0), facing))
	

	for bullet in bullets:
		if enemies[0] == bullet.x and enemies[1] == bullet.y :
			enemiesVisible = False
		

		if bullet.y < 500 and bullet.y > 0:
			bullet.y -= bullet.vel
		else:
			bullets.pop(bullets.index(bullet))	

		if enemiesVisible == False:
			enemiesVisible = True
			enemies = [random.randrange(1, 50)*10, random.randrange(1,20)*10]
			 		
		
	win.fill((0,0,255))	
	pygame.draw.rect(win, (255,255,255), (pygame.Rect(enemies[0], enemies[1], width, height)))
	for element in body:
		pygame.draw.rect(win, (0,255,0), (pygame.Rect(element[0],element[1], width , height)))	
	for bullet in bullets:
		bullet.draw(win)
	pygame.display.update()
pygame.quit()
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

В класс снаряд добавь метод
class snaryad():
...
def interact(self, x, y):
delta = 8 # точного совпадения не будет, используй погрешность
return True if (self.x — x < delta) and (self.y — y < delta) else False

И используй вместо:
#if enemies[0] == bullet.x and enemies[1] == bullet.y :
# enemiesVisible = False
if bullet.interact( enemies[0], enemies[1] ):
enemiesVisible = False

Без багов и на питоне? Не в этой реальности. Питонже для простеньких скриптиков по ML и крадиков.

Знайди місце у коді де виникає проблема і продебаж через PyCharm, або будь-який інший дебагер. Глянеш значення змінних на момент самого багу і тоді вдасться зробити висновки чому так.

Зачем дебагер? Там достаточно вывести переменные через print
Да и вообще не уверен что начинающим стоит использовать ide.
Простой редактор с подсветкой синтаксиса и запуск программы из командной строки.

Проблема в этой строке -
if enemies[0] == bullet.x and enemies[1] == bullet.y :
Если вывести сравниваемые переменные через print (или иным образом их проконтролировать) — сразу станет понятно где ошибка.

Вивести значення змінних через print() і глянути значення змінних через IDE — одне і те саме. Просто другий варіант більш автоматизований, суть одна і та сама.

я гадаю, що тут не має помилки, а просто рандомайзер генерує тіж самі значення іноді. Тому простіше додати перевірку, що нові координати не такі як попередні

Позиция врага у тебя кратна десяти, а позиция пули по y (bullet.y) кратна двум.
А дальше там enemies[1] == bullet.y

Я вже цю помилку робив, публікував код в коментарях, а треба на github.com або pastebin.com

Напиши тест!

Підписатись на коментарі