Pygame 蛇游戏 - 移动蛇

安东尼奥·雷贝洛

我正在尝试在 pygame 中构建蛇游戏。我使用二维向量表示蛇。
我编写了这段代码来移动蛇,但由于某种原因它不起作用。蛇没有移动,而是变得更大了。我希望蛇移动并保持与它相同的大小。

def move_snake(self):
    body_copy = self.body[:-1]
    body_copy.insert(0, body_copy[0] + self.direction)
    self.body = body_copy[:]

self.direction 只是另一个向量,而 self.body 是我所说的二维向量。

我不知道错误是否在那个 move_snake 方法中,所以我也在此处发布了我的完整代码。

import pygame
import sys
import random
from pygame.math import Vector2


pygame.init()
pygame.display.set_caption("Snake")

DARK_GREEN = (126, 166, 114)
STEEL_BLUE = (70, 130, 180)


CELL_SIZE = 40
CELL_NUMBER = 20
WIDTH, HEIGTH = CELL_SIZE * CELL_NUMBER, CELL_SIZE * CELL_NUMBER
FPS = 60
SCREEN = pygame.display.set_mode((WIDTH, HEIGTH))
SCREEN.fill((175, 215, 70))


class Snake:
    def __init__(self):
        self.body = [Vector2(5, 10), Vector2(6, 10), Vector2(7, 10)]
        self.direction = Vector2(1, 0)

    def draw_snake(self):
        for block in self.body:
            x_pos = int(block.x * CELL_SIZE)
            y_pos = int(block.y * CELL_SIZE)
            block_rect = pygame.Rect(x_pos, y_pos, CELL_SIZE, CELL_SIZE)
            pygame.draw.rect(SCREEN, STEEL_BLUE, block_rect)

    def move_snake(self):
        body_copy = self.body[:-1]
        body_copy.insert(0, body_copy[0] + self.direction)
        self.body = body_copy[:]


class Fruit:
    def __init__(self):
        self.x = random.randint(0, CELL_NUMBER - 1)
        self.y = random.randint(0, CELL_NUMBER - 1)

        self.pos = Vector2(self.x, self.y)

    def draw_fruit(self):
        fruit_rect = pygame.Rect(
            int(self.pos.x * CELL_SIZE), int(self.pos.y * CELL_SIZE), CELL_SIZE, CELL_SIZE)
        pygame.draw.rect(SCREEN, DARK_GREEN, fruit_rect)


def main():
    run = True
    clock = pygame.time.Clock()

    while run:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                sys.exit()
            if event.type == SCREEN_UPDATE:
                snake.move_snake()

        fruit.draw_fruit()
        snake.draw_snake()

        pygame.display.update()


fruit = Fruit()
snake = Snake()

SCREEN_UPDATE = pygame.USEREVENT
pygame.time.set_timer(SCREEN_UPDATE, 150)


main()
赛斯

在绘制任何内容之前,您需要screen.fill(color)在循环中的某个位置(一个参数是游戏的背景颜色),否则它不会清除屏幕(换句话说,它将保留它在屏幕上绘制的最后一帧)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章