(Pygame) Что не так с этой функцией?

#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)