Python贪吃蛇小游戏

发布于:2025-03-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

背景介绍

贪吃蛇(Snake Game)是一款经典的电子游戏,最早可以追溯到20世纪70年代。它的设计非常简单,但玩法却极具吸引力。玩家控制一条蛇在屏幕上移动,蛇会不断吃食物并变长,同时需要避免撞到墙壁或自己的身体。游戏的规则简单易懂,但操作起来却需要一定的技巧和策略。

贪吃蛇游戏因其简单的设计和高度的可玩性,成为了许多早期计算机和手机的预装游戏之一。它不仅是一个娱乐工具,还被广泛用于编程教学和算法练习。通过实现贪吃蛇游戏,开发者可以学习到许多基础的游戏开发知识,例如图形渲染、用户输入处理、碰撞检测和游戏逻辑设计。


为什么做这个游戏?

1. 学习编程的基础

贪吃蛇游戏是一个非常好的入门项目,尤其是对于初学者来说。它涉及到的知识点包括:

  • 图形界面开发:通过pygame库,你可以学习如何创建窗口、绘制图形和处理颜色。
  • 事件处理:通过键盘输入控制蛇的移动,学习如何响应用户的操作。
  • 逻辑设计:实现蛇的移动、食物的生成和碰撞检测,帮助你理解游戏的核心逻辑。
  • 循环和条件语句:游戏主循环和碰撞检测的实现需要大量的循环和条件判断。
2. 锻炼编程能力

即使你已经掌握了基础的编程知识,制作贪吃蛇游戏仍然是一个很好的练习。你可以通过优化代码、添加新功能(如计分系统、难度调整、障碍物等)来提升自己的编程能力。

3. 探索游戏开发的乐趣

贪吃蛇游戏虽然简单,但它是一个完整的游戏项目。通过完成这个项目,你可以体验到从零开始开发一个游戏的完整流程,包括需求分析、设计、编码、测试和优化。这种成就感会让你对游戏开发产生更大的兴趣。

4. 为更复杂的项目打基础

贪吃蛇游戏是一个基础项目,但它的设计思路可以扩展到更复杂的游戏中。例如:

  • 增加障碍物,设计更复杂的地图。
  • 添加AI对手,让玩家与计算机对战。
  • 实现网络功能,让多个玩家在线对战。
5. 个人兴趣和挑战

如果你对游戏开发感兴趣,贪吃蛇游戏是一个很好的起点。它不仅简单易实现,还可以让你在短时间内完成一个完整的作品。完成后,你可以尝试添加更多功能,或者制作其他类型的游戏。

源码:

import pygame
import time
import random

# 初始化pygame
pygame.init()

# 屏幕尺寸
WIDTH, HEIGHT = 800, 600

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (213, 50, 80)
GREEN = (0, 255, 0)
BLUE = (50, 153, 213)

# 初始化游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇游戏")

# 时钟对象,用于控制帧率
clock = pygame.time.Clock()

# 蛇的初始设置
snake_block = 10  # 每个方块的大小
snake_speed = 15  # 蛇的移动速度

# 字体设置
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)


def display_score(score):
    """显示得分"""
    value = score_font.render("Score: " + str(score), True, BLUE)
    screen.blit(value, [10, 10])


def draw_snake(snake_block, snake_list):
    """绘制蛇"""
    for block in snake_list:
        pygame.draw.rect(screen, GREEN, [block[0], block[1], snake_block, snake_block])


def message(msg, color):
    """显示消息"""
    mesg = font_style.render(msg, True, color)
    screen.blit(mesg, [WIDTH / 6, HEIGHT / 3])


def game_loop():
    """游戏主循环"""
    game_over = False
    game_close = False

    # 蛇的初始位置
    x1, y1 = WIDTH / 2, HEIGHT / 2

    # 蛇的移动增量
    x1_change, y1_change = 0, 0

    # 蛇的身体
    snake_list = []
    length_of_snake = 1

    # 食物的初始位置
    food_x = round(random.randrange(0, WIDTH - snake_block) / 10.0) * 10.0
    food_y = round(random.randrange(0, HEIGHT - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close:
            screen.fill(BLACK)
            message("Game Over!", RED)
            display_score(length_of_snake - 1)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        game_loop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and x1_change == 0:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT and x1_change == 0:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP and y1_change == 0:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN and y1_change == 0:
                    y1_change = snake_block
                    x1_change = 0

        # 检测蛇是否撞墙
        if x1 >= WIDTH or x1 < 0 or y1 >= HEIGHT or y1 < 0:
            game_close = True

        # 更新蛇的位置
        x1 += x1_change
        y1 += y1_change
        screen.fill(BLACK)

        # 绘制食物
        pygame.draw.rect(screen, RED, [food_x, food_y, snake_block, snake_block])

        # 更新蛇的身体
        snake_head = [x1, y1]
        snake_list.append(snake_head)
        if len(snake_list) > length_of_snake:
            del snake_list[0]

        # 检测蛇是否撞到自己
        for block in snake_list[:-1]:
            if block == snake_head:
                game_close = True

        draw_snake(snake_block, snake_list)
        display_score(length_of_snake - 1)

        pygame.display.update()

        # 检测蛇是否吃到食物
        if x1 == food_x and y1 == food_y:
            food_x = round(random.randrange(0, WIDTH - snake_block) / 10.0) * 10.0
            food_y = round(random.randrange(0, HEIGHT - snake_block) / 10.0) * 10.0
            length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()


# 启动游戏
game_loop()

在这里插入图片描述