#python #pygame
#python #pygame
Вопрос:
Итак, я работал над игрой snake, созданной в Pygame. Пока все в порядке, за исключением одной проблемы: когда змея ест фрукты, фрукты (которые появляются случайным образом) иногда появляются внутри тела змеи. Итак, чтобы избежать этого, я создал эту функцию:
def random_fruit(body_pos):
global general_fruit_x, general_fruit_y # Fruit rectangle coordinates
while True:
general_fruit_x = randrange(window[0] // snake.w) * snake.w # (Snake is a pygame.Rect)
general_fruit_y = randrange(window[1] // snake.h) * snake.h
if len(list(filter(lambda z: body_pos == (general_fruit_x, general_fruit_y), body_pos))) > 0:
continue # If the spawning position of the fruit is the same as the snake's body, we continue the loop
else:
break # If not, we are done
set_obj_coordinates(general_fruit, general_fruit_x, general_fruit_y) # set fruit random position
И реализовал его в основном игровом цикле:
if fruit_eated:
random_ind1 = random_ind2
snake_len = 1
apple_sound.play()
random_fruit(snake_pos) # snake_pos is a list of tuples with all snake's body coordinates
for m in range(3):
snake_imgs[random_ind1][m] = img("snake_" snake_colors[random_ind1] str(m 1)) # Reset snake image
random_ind2 = randint(0, 3)
if x_move < 0:
rotate_imgs(90, random_ind1)
if x_move > 0:
rotate_imgs(-90, random_ind1)
if y_move > 0:
rotate_imgs(180, random_ind1)
if y_move < 0:
pass
Но кажется, что функция random_fruit игнорирует состояние тела змеи.
Вот полный код: https://github.com/n4tm/PySnake/tree/main/snake
Комментарии:
1. Корень вашей проблемы в вашем лямбда. Вы сравниваете координаты фруктов со ВСЕМ телом, а
z
не с параметром. Вместо этого, еслиlen(list(filter(
, вы могли бы рассмотретьif any(lambda z : z == (general_fruit_x,general_fruit_y)) for z in body_pos):
.
Ответ №1:
Вы должны проверить, совпадает ли any
положение тела с новым случайным положением плода:
` if len(list(filter(lambda z: body_pos == (general_fruit_x, general_fruit_y), body_pos))) > 0:
if any(pos == (general_fruit_x, general_fruit_y) for pos in body_pos):
random_fruit
функция:
def random_fruit(body_pos):
global general_fruit_x, general_fruit_y
while True:
general_fruit_x = randrange(window[0] // snake.w) * snake.w
general_fruit_y = randrange(window[1] // snake.h) * snake.h
if not any(pos == (general_fruit_x, general_fruit_y) for pos in body_pos):
break
set_obj_coordinates(general_fruit, general_fruit_x, general_fruit_y)