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

💡 Усі статті, обговорення, новини про Python — в одному місці. Приєднуйтесь до 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

```python
import pygame
import random

# Инициализация Pygame
pygame.init()

# Определение размеров окна
width = 800
height = 600

# Создание экрана
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Brawl Stars")

# Определение цветов
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# Определение игрока и врага
player = pygame.Rect(width // 2, height — 50, 50, 50)
enemy = pygame.Rect(random.randint(0, width — 50), 0, 50, 50)

# Определение скорости игрока и врага
player_speed = 5
enemy_speed = 3

running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# Обработка движения игрока
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player.x > 0:
player.x -= player_speed
if keys[pygame.K_RIGHT] and player.x < width — player.width:
player.x += player_speed

# Обработка движения врага
enemy.y += enemy_speed
if enemy.y > height:
enemy.y = 0
enemy.x = random.randint(0, width — 50)

# Проверка столкновения игрока с врагом
if player.colliderect(enemy):
running = False

# Отрисовка игрока, врага и фона
screen.fill(WHITE)
pygame.draw.rect(screen, BLUE, player)
pygame.draw.rect(screen, RED, enemy)
pygame.display.update()

# Очистка Pygame и выход из программы
pygame.quit()
```

А етот что будет

В класс снаряд добавь метод
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

Напиши тест!

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