贪吃蛇游戏开发实训报告

#1024程序员节 | 征文#

简介

贪吃蛇游戏是一个非常经典的游戏,玩家控制一条不断移动的蛇,通过吃掉屏幕的食物来增加身体的长度,目标就是尽可能的变长继续生存下去。

贪吃蛇游戏开发可以利用不用的语言来进行编写开发,这里教大家的是使用Python开发一款简约的贪吃蛇游戏。这个贪吃蛇游戏非常适合初学者学习,使用Python3和PyCharm的Pygame编写。Pygame是一个开源的跨平台Python模块,非常适合咱们初学者学习游戏变成。

1、需求分析

贪吃蛇移动:贪吃蛇能够根据用户输入的方向键进行移动,并且在移动过程中不能反向移动。

食物生成:在游戏屏幕内随机生成食物。

吃食物增长:当贪吃蛇的头部碰到食物时,贪吃蛇的长度增加,同时重新生成食物。

游戏失败判定:如果贪吃蛇的头部碰到自己的身体,则游戏结束。

图形界面:使用 Pygame 库创建游戏窗口,并在窗口中绘制贪吃蛇和食物。

2、技术简介

ygame 是一组专门为编写电子游戏而设计的 Python 模块。

图形绘制:可以使用 Pygame 的函数在屏幕上绘制各种形状,如矩形、圆形等。在这个贪吃蛇游戏中,使用 pygame.draw.rect 函数来绘制贪吃蛇和食物。

事件处理:Pygame 提供了一种处理用户输入和系统事件的机制。在这个游戏中,通过监听 pygame.QUIT 事件来处理游戏窗口的关闭,通过监听 pygame.KEYDOWN 事件来处理用户按下方向键的操作。

屏幕管理:可以使用 Pygame 创建游戏窗口,并在窗口中显示图形。在这个游戏中,使用 pygame.display.set_mode 函数创建了一个特定尺寸的游戏窗口,并设置了窗口的标题。

游戏循环:Pygame 通常使用游戏循环来不断更新游戏状态和绘制画面。在这个游戏中,使用 while running 循环来实现游戏的主循环,在循环中处理事件、更新游戏状态和绘制画面。

3、开发环境

Windows操作系统、Python3、PyCharm,Pygame开发。

4、详细设计

这个模块主要进行了游戏的初始化设置。首先调用 pygame.init() 初始化 Pygame 库。然后定义了屏幕的宽度和高度常量,以及游戏中使用的几种颜色。接着使用 pygame.display.set_mode 创建了一个特定尺寸的游戏窗口,并通过 pygame.display.set_caption 设置了窗口的标题。

# 初始化 Pygame
pygame.init()

# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 创建屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("贪吃蛇游戏ZQY")

init 方法:初始化贪吃蛇,设置初始长度为 1,初始位置在屏幕中心,初始方向为向右(1,0)。

move 方法:实现贪吃蛇的移动。根据当前方向计算新的位置,同时检查新位置是否与自身身体冲突(除了头部的部分),如果冲突则返回 False,表示游戏失败。如果没有冲突,将新位置插入到位置列表的开头,并根据长度判断是否需要删除尾部位置。最后返回移动是否成功的结果。

change_direction 方法:改变贪吃蛇的移动方向,但不能直接反向移动。

grow 方法:增加贪吃蛇的长度。

draw 方法:在屏幕上绘制贪吃蛇,通过遍历位置列表,使用 pygame.draw.rect 在每个位置绘制一个绿色的矩形。

# 贪吃蛇类
class Snake:
    def __init__(self):
        self.length = 1
        self.positions = [(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)]
        self.direction = (1, 0)

    def move(self):
        cur = self.positions[0]
        x, y = self.direction
        new = ((cur[0] + (x * 20)) % SCREEN_WIDTH, (cur[1] + (y * 20)) % SCREEN_HEIGHT)
        if len(self.positions) > 2 and new in self.positions[2:]:
            return False
        self.positions.insert(0, new)
        if len(self.positions) > self.length:
            self.positions.pop()
        return True

    def change_direction(self, direction):
        if (direction[0] * -1, direction[1] * -1)!= self.direction:
            self.direction = direction

    def grow(self):
        self.length += 1

    def draw(self):
        for p in self.positions:
            pygame.draw.rect(screen, GREEN, (p[0], p[1], 20, 20))

init 方法:在屏幕内随机生成食物的位置,位置的坐标是 20 的倍数,以确保食物能够完整地显示在格子中。

draw 方法:在屏幕上绘制食物,使用 pygame.draw.rect 在食物的位置绘制一个红色的矩形。

# 食物类
class Food:
    def __init__(self):
        self.position = (random.randrange(0, SCREEN_WIDTH - 20, 20), random.randrange(0, SCREEN_HEIGHT - 20, 20))

    def draw(self):
        pygame.draw.rect(screen, RED, (self.position[0], self.position[1], 20, 20))

创建对象:创建一个贪吃蛇对象 snake 和一个食物对象 food,并创建一个游戏时钟 clock 用于控制游戏的帧率。

事件处理循环:遍历 Pygame 事件队列,处理游戏窗口的关闭事件(pygame.QUIT)和方向键按下事件(pygame.KEYDOWN)。根据按下的方向键调用贪吃蛇的 change_direction 方法改变方向。

游戏逻辑更新:调用贪吃蛇的 move 方法进行移动,如果移动失败则设置游戏状态为结束。如果贪吃蛇的头部位置与食物位置相同,则调用贪吃蛇的 grow 方法增加长度,并重新创建一个食物对象。

画面绘制:使用 screen.fill(BLACK) 填充屏幕为黑色,然后分别调用贪吃蛇的 draw 方法和食物的 draw 方法绘制贪吃蛇和食物。最后使用 pygame.display.flip 更新屏幕显示,并通过 clock.tick(10) 控制游戏帧率为每秒 10 帧。

游戏结束:当游戏主循环结束时,调用 pygame.quit() 退出 Pygame 库。

# 创建贪吃蛇和食物对象
snake = Snake()
food = Food()

# 游戏时钟
clock = pygame.time.Clock()

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                snake.change_direction((0, -1))
            elif event.key == pygame.K_DOWN:
                snake.change_direction((0, 1))
            elif event.key == pygame.K_LEFT:
                snake.change_direction((-1, 0))
            elif event.key == pygame.K_RIGHT:
                snake.change_direction((1, 0))

    if not snake.move():
        running = False

    if snake.positions[0] == food.position:
        snake.grow()
        food = Food()

    screen.fill(BLACK)
    snake.draw()
    food.draw()
    pygame.display.flip()
    clock.tick(10)

pygame.quit()

5、软件测试

6、功能测试

移动控制:通过按下方向键(上、下、左、右),贪吃蛇能够按照预期的方向进行移动,且不能反向移动,符合设计要求。

吃食物增长:当贪吃蛇的头部碰到食物时,贪吃蛇的长度会增加,并且食物会在屏幕上随机的新位置重新出现。

游戏失败判定:当贪吃蛇的头部碰到自己的身体时,游戏会正确结束。

7、不足之处

缺乏游戏难度设置:目前游戏的难度是固定的,速度始终为每秒 10 帧,没有不同难度级别供玩家选择。

画面比较简陋:游戏的画面只有简单的颜色方块,没有更多的图形效果或动画,缺乏吸引力。没有音效:游戏中没有任何音效,缺乏趣味性和反馈。

相关推荐
Mopes__1 小时前
Python | Leetcode Python题解之第517题超级洗衣机
python·leetcode·题解
测试老哥3 小时前
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
Ws_3 小时前
蓝桥杯 python day01 第一题
开发语言·python·蓝桥杯
神雕大侠mu4 小时前
函数式接口与回调函数实践
开发语言·python
萧鼎5 小时前
【Python】高效数据处理:使用Dask处理大规模数据
开发语言·python
互联网杂货铺5 小时前
Python测试框架—pytest详解
自动化测试·软件测试·python·测试工具·测试用例·pytest·1024程序员节
Ellie陈5 小时前
Java已死,大模型才是未来?
java·开发语言·前端·后端·python
菜鸟的人工智能之路6 小时前
ROC 曲线:医学研究中的得力助手
python·数据分析·健康医疗
梦幻精灵_cq6 小时前
python包结构模块如何有效传递数据?
python
黑叶白树6 小时前
包和模块(上) python复习笔记
开发语言·笔记·python