змея в python с помощью модуля Pygame - PullRequest
2 голосов
/ 28 января 2020

Хорошо, так что запускаю код dr aws змея, но я вообще не могу его сдвинуть. Попытка сделать так, чтобы змея не остановилась, когда она начала двигаться. Я новичок в программировании в целом, извините, если я тупой, но ради любви к Богу, я не могу понять, как заставить это работать, пожалуйста, помогите. Функция сетки работает просто отлично, а функции перемещения - нет.

Вот код

# Snake game

import pygame


pygame.init()
pygame.display.set_caption("Snake Game and AI")

WIDTH = 24
HEIGHT = 24
SCREEN = pygame.display.set_mode((500, 500))
RED = (255, 0, 0)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
WHITE = (255, 255, 255)
SPEED = 25
x_head = 251
y_head = 251
keys = pygame.key.get_pressed()
direction = None


def grid():
    for x in range(25, 500, 25):
        pygame.draw.rect(SCREEN, WHITE, (x, 25, 1, 450))

    for y in range(25, 500, 25):
        pygame.draw.rect(SCREEN, WHITE, (25, y, 450, 1))


def press_key():
    global direction
    global keys
    if keys[pygame.K_RIGHT] and direction != 'left':
        direction = 'right'
    if keys[pygame.K_LEFT] and direction != 'right':
        direction = 'left'
    if keys[pygame.K_UP] and direction != 'down':
        direction = 'up'
    if keys[pygame.K_DOWN] and direction != 'up':
        direction = 'down'


def move_snake():
    global x_head
    global y_head
    global SCREEN
    global WIDTH
    global HEIGHT
    while direction == 'right':
        x_head += SPEED
    while direction == 'left':
        x_head -= SPEED
    while direction == 'up':
        y_head -= SPEED
    while direction == 'down':
        y_head += SPEED

    pygame.draw.rect(SCREEN, GREEN, (x_head, y_head, WIDTH, HEIGHT))


is_running = True
while is_running:
    pygame.time.delay(150)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            is_running = False

    press_key()
    SCREEN.fill(BLACK)
    grid()
    move_snake()
    pygame.display.update()


pygame.quit()

1 Ответ

4 голосов
/ 28 января 2020

pygame.key.get_pressed() возвращает список состояний каждой клавиши на клавиатуре. Вы должны получить текущие состояния клавиш в каждом кадре:

is_running = True
while is_running:
    pygame.time.delay(150)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            is_running = False

    # get current key states
    keys = pygame.key.get_pressed() # <-----

    press_key()
    # [...]

Кроме того, move_snake называется в основном приложении l oop. Вам не нужны бесконечные циклы в move_snake вообще. Измените циклы while на выбор (if). Змея делает один шаг в каждом кадре, в зависимости от состояния direction:

def move_snake():
    global x_head
    global y_head
    global SCREEN
    global WIDTH
    global HEIGHT
    if direction == 'right':
        x_head += SPEED
    if direction == 'left':
        x_head -= SPEED
    if direction == 'up':
        y_head -= SPEED
    if direction == 'down':
        y_head += SPEED
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...