Как проверить, пересекает ли змея в игре змея еду? - PullRequest
2 голосов
/ 26 марта 2019

Я работаю над игрой со змеями, использующей python и pygame, но у меня проблемы с проверкой, пересекла ли змея еду или нет. Может ли кто-нибудь здесь помочь мне с этим?

Я пытался сделать расположение еды кратным 10, поскольку ширина и высота моей змеи также равна 10, а окно (ширина и высота) также кратно 10.

food_x = random.randrange(0, displayWidth-foodWidth, 10)
food_y = random.randrange(0, displayHeight-foodHeight, 10)

Я ожидал, что это сделает расположение еды таким, что не будет столкновений, а будет прямое наложение змеи и еды, что облегчит кодирование. Однако были и столкновения.

1 Ответ

3 голосов
/ 26 марта 2019

Таким образом, учитывая, что ваша структура данных snake представляет собой набор прямоугольников, а змея только «ест» из прямоугольника головы, определить процедуру столкновения довольно просто.

Библиотека PyGame rect имеет функции для проверки столкновений между прямоугольниками.

Таким образом, предполагая, что head_rect - это rect с координатами и размером головы вашей змеи, а food_rect - этоэлемент для проверки:

if ( head_rect.colliderect( food_rect ) ):
    # TODO - consume food

Или, если есть список food_rect в food_list:

def hitFood( head_rect, food_list ):
    """ Given a head rectangle, and a list of food rectangles, return 
        the first item in the list that overlaps the list items.  
        Return None for a no-hit """
    food_hit = None
    collide_index = head_rect.collidelist( food_list )
    if ( collide_index != -1 ):
        # snake hit something
        food_hit = food_list.pop( collide_index )
    return food_hit

Это намного проще использовать библиотеки PyGameфункции перекрытия прямоугольника, чем создание своих собственных.

...