Pygame рисует прямоугольник, следующий за другим прямоугольником в зависимости от их координат (например, игра змея) - PullRequest
3 голосов
/ 30 марта 2019

Я довольно новичок в программировании и в частности в Pygame, и сейчас я пишу римейк игры со змеями с нуля, но я не знаю, как именно рисовать тела змей, которые следуют за головой змеи. Это то, что я до сих пор:

Главный механик кузова:

    try:
        for pos in range(0, length):
            x = startX
            y = startY
            if moveX == 1:
                x = startX-pos
            elif moveX == -1:
                x = startX+pos
            elif moveY == 1:
                y = startY-pos
            elif moveY == -1:
                y = startY+pos
            snake1 = pygame.draw.rect(screen, yellow, [(margin + snakeposX*x, margin + snakeposY*y), (width, height)])
            snake = pygame.draw.rect(screen, white, [(margin + snakeposX*startX, margin + snakeposY*startY), (width, height)])
    except IndexError:
        pass

В

Используемые переменные:

screen = pygame.display.set_mode(size)

width = 20
height = 20
margin = 5
snakeposX = (width + margin)
snakeposY = (height + margin)

white = (255, 255, 255)
yellow = (255, 255, 0)

startX = 6
startY = 6
moveX = 1
moveY = 0
length = 1

startX += moveX
startY += moveY

1 Ответ

1 голос
/ 30 марта 2019

Вам нужен список позиций змей.Положение каждого элемента змеи является элементом списка:

snakepos = [[startX, startY]]

Если змея должна быть выращена, то последняя часть змеи должна быть скопирована и добавлена ​​к хвостуsnake:

snakepos.append(snakepos[-1][:])

Чтобы заставить вашего змею двигаться, каждая часть змеи получает позицию своего предшественника в списке частей.Голова змеи получает новую позицию.Пройдите змею в обратном порядке и скопируйте позиции.

for i in range(len(snakepos)-1, 0, -1):
    snakepos[i] = snakepos[i-1][:]
snakepos[0][0] += moveX
snakepos[0][1] += moveY

В качестве альтернативы вы можете добавить новый элемент в начало списка и удалить последний элемент списка:

snakepos.insert(0, [snakepos[0]+moveX, snakepos[1]+moveY])
del snakepos[-1]

Рекомендую разделить обновление позиции и чертеж:

for i in range(1, len(snakepos)):
    pygame.draw.rect(screen, yellow, [snakepos[i], (width, height)])
snake = pygame.draw.rect(screen, white, [snakepos[0], (width, height)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...