Питон проблема с равенством
Ребята,помогите пожалуйста,пишу змейку дошел до такого момента,что когда координат головы(head) будут равны координате еды(food),то координаты еды должны меняться на другие.Но почему то ,хотя и выполняется равенство,но координаты не меняются
условие равенства для созданного мною класса Python
def __eq__(self, other):
return isinstance(other, snakeblock) and self.x == other.x and self.y == other.y
условие,меняющее координаты еды при равенстве координат головы змейки и еды
if food == head:
food = snakeblock(10, 15)
Сам код программы :
import pygame
import sys
size_of_block = 20
background_color = (59,153,0)
color_1 = (255,254,255)
color_2= (204,255,204)
color_snake = (204,255,0)
red = (255, 0, 0)
head = 100
head_color = (51,255,102)
size = [625, 800]
screen = pygame.display.set_mode(size)
pygame.display.set_caption('Snake')
fps = 5
class snakeblock:
def __init__(self, x, y):
self.x = x
self.y = y
def is_in(self):
return 0 < self.x < 30 and 0 < self.y < 28
def __eq__(self, other):
return isinstance(other, snakeblock) and self.x == other.x and self.y == other.y
time = pygame.time.Clock()
def draw_snake(color_snake,stroka,stolb):
pygame.draw.rect(screen, color_snake, [(stolb-1)*21+10, (stroka-1)*21+140, size_of_block, size_of_block])
def draw_block(color_snake,stroka,stolb):
pygame.draw.rect(screen, color_snake, [(stolb-1)*21+10, (stroka-1)*21+140, size_of_block, size_of_block])
snake_blocks = [snakeblock(5,5),snakeblock(5,6),snakeblock(5 ,7)]
food = snakeblock(2,5)
d_1 = 1
d_2 = 0
while True:
snake_coordinates = [[],[]]
for event in pygame.event.get():
if event.type == pygame.QUIT:
print('Вышли')
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
if (d_2 != 1 and d_1 != 0):
d_2 = -1
d_1 = 0
elif event.key == pygame.K_DOWN:
if (d_2 != -1 and d_1 != 0):
d_2 = 1
d_1 = 0
elif event.key == pygame.K_LEFT:
if (d_1 != 1 and d_2 != 0):
d_1 = -1
d_2 = 0
elif event.key == pygame.K_RIGHT:
if (d_1 != -1 and d_2 != 0):
d_1 = 1
d_2 = 0
elif event.key == pygame.K_SPACE:
if fps == 5:
fps = 0.0000001
else:
fps = 5
screen.fill(background_color)
for number_stroka in range(10, 600, 42):
for number_stolb in range(20+head+20, 700, 42):
pygame.draw.rect(screen, color_1, [number_stroka, number_stolb, size_of_block, size_of_block])
for number_stroka_2 in range(31, 600, 42):
for number_stolb_2 in range(41+head+20, 700, 42):
pygame.draw.rect(screen, color_2, [number_stroka_2, number_stolb_2, size_of_block, size_of_block])
for number_stroka in range(31, 600, 42):
for number_stolb in range(20+head+20, 700, 42):
pygame.draw.rect(screen, color_1, [number_stroka, number_stolb, size_of_block, size_of_block])
for number_stroka_2 in range(10, 600, 42):
for number_stolb_2 in range(41+head+20, 700, 42):
pygame.draw.rect(screen, color_1, [number_stroka_2, number_stolb_2, size_of_block, size_of_block])
pygame.draw.rect(screen, head_color, [0, 0, 625, 120])
head_snake = snake_blocks[-1]
if not head_snake.is_in():
print('Врезались')
pygame.quit()
sys.exit()
for block in snake_blocks:
draw_snake(color_snake, block.y, block.x)
print (block.y, block.x)
if food == head:
food = snakeblock(10, 15)
draw_block(red, food.x, food.y)
new_head_snake = snakeblock(head_snake.x + d_1, head_snake.y + d_2)
snake_blocks.append(new_head_snake)
snake_blocks.pop(0)
pygame.display.flip()
time.tick(fps)
Ответы (1 шт):
С равенством у вас здесь всё в порядке, у вас другие ошибки:
if food == head:
food = snakeblock(10, 15)
У вас head - это число 100. Похоже, здесь должно быть не head, а head_snake
Кроме того, блоки змеи вы отрисовываете так:
draw_snake(color_snake, block.y, block.x)
а блок еды так:
draw_block(red, food.x, food.y)
обратите внимание, что в этих двух случаях порядок аргументов с x и y перепутаны. Поменяйте порядок для отрисовки блока еды и будет вам счастье.