探索Python世界的趣味之旅:自制贪吃蛇游戏

通过本次贪吃蛇游戏的开发实践,不仅可以掌握Python编程语言的基础知识,还深入了解了游戏开发的基本流程和技术要点。这只是一个开始,Python的世界远不止于此。未来,你可以尝试开发更复杂、更有趣的游戏项目,甚至探索人工智能、数据分析等领域的应用。

贪吃蛇游戏虽小,却蕴含了编程的无限可能。希望这个项目能够激发你对编程的热情,让你在Python的世界里自由翱翔,创造属于自己的精彩故事。


  • 博客主页:长风清留扬-CSDN博客
  • 系列专栏:Python趣味小游戏
  • 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
  • 感谢大家点赞👍收藏⭐评论

Python 贪吃蛇游戏项目


在编程的世界里,小游戏开发不仅是学习编程语言的绝佳途径,更是激发创造力和逻辑思维能力的有效方式。而且在学习和使用Python的过程中,一定要多加练习,一边学习知识点,一边动手练习才可以提高代码水平,今天,我们将一起踏上一段特别的旅程,使用Python语言亲手打造一款经典的游戏------贪吃蛇。通过这个项目,你不仅能加深对Python语言的理解,还能体验到从设计到实现的完整软件开发过程。

一、项目介绍:贪吃蛇游戏

贪吃蛇,这个简单却充满挑战的游戏,自诞生以来就深受玩家喜爱,还记得自己第一次玩的时候还是在老款的诺基亚上玩的,差不多算是自己第一次玩电子游戏。玩家需要控制一条不断增长的蛇在封闭的空间内移动,通过吃下随机出现的食物来增长身体,同时避免碰到墙壁或自己的尾巴。这个看似简单的规则背后,隐藏着无尽的策略与乐趣。

二、项目准备:搭建开发环境

在开始编写代码之前,确保你的计算机上安装了Python环境以及pygame库。可以通过Python的官方网站下载安装包,并通过pip命令安装pygame库。

pip install pygame

此外,准备一款文本编辑器或IDE(如PyCharm、VS Code等),用于编写和调试代码。

三、设计思路:规划游戏逻辑

1. 游戏界面设计

首先,规划游戏的基本界面布局,包括游戏窗口的大小、颜色主题、以及蛇和食物的显示方式。贪吃蛇游戏通常采用简洁的界面风格,以突出游戏的核心玩法。

2. 蛇的移动与控制

蛇的移动是贪吃蛇游戏的核心机制。通过监听键盘事件来控制蛇的上下左右移动,同时记录蛇的当前位置和历史位置,以便进行碰撞检测和绘制。

3. 食物的生成与碰撞检测

食物需要随机出现在游戏界面的空白位置,避免与蛇身重叠。当蛇头与食物重合时,增加蛇的长度并生成新的食物。同时,检测蛇头是否触碰到边界或自身身体,以判断是否游戏结束。

4. 分数统计与显示

随着蛇吃掉越来越多的食物,其长度增加,分数也应相应提升。在游戏界面上实时显示当前分数,增加游戏的互动性和挑战性。

四、实现细节:编码实践

在明确了设计思路后,就可以开始编码实践了。利用pygame库提供的图形绘制、事件监听等功能,逐步实现上述设计思路。在编码过程中,注意代码的可读性和可维护性,合理使用变量名、注释和函数封装来组织代码。

关键点:

  • 使用pygame的init()函数初始化游戏环境。

    python 复制代码
    # 初始化pygame
    pygame.init()
  • 设置游戏窗口大小,并使用set_mode()函数创建游戏屏幕。

    python 复制代码
    # 设置屏幕宽度和高度
    screen_width = 600
    screen_height = 400
    screen = pygame.display.set_mode((screen_width, screen_height))
  • 通过draw.rect()函数绘制蛇和食物。

    python 复制代码
    # 蛇的初始位置和方向
    snake_block = 20
    snake_list = [(screen_width // 2, screen_height // 2)]
    snake_direction = 'RIGHT'
    
    # 食物位置
    food_position = [random.randint(0, (screen_width // snake_block) - 1) * snake_block,
                     random.randint(0, (screen_height // snake_block) - 1) * snake_block]
  • 使用事件监听(如KEYDOWN)来控制蛇的移动方向。

    python 复制代码
    # 游戏主循环
    game_over = False
    while not game_over:
        # 检测键盘事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and snake_direction != 'RIGHT':
                    snake_direction = 'LEFT'
                elif event.key == pygame.K_RIGHT and snake_direction != 'LEFT':
                    snake_direction = 'RIGHT'
                elif event.key == pygame.K_UP and snake_direction != 'DOWN':
                    snake_direction = 'UP'
                elif event.key == pygame.K_DOWN and snake_direction != 'UP':
                    snake_direction = 'DOWN'
  • 实现碰撞检测逻辑,判断蛇是否吃到食物或撞到墙壁/自身。

    python 复制代码
    # 如果蛇头与身体相撞,则游戏结束
        if snake_head in snake_list[:-1]:
            game_over = True
    
        # 如果蛇头碰到边界,则游戏结束
        if snake_head[0] < 0 or snake_head[0] >= screen_width or snake_head[1] < 0 or snake_head[1] >= screen_height:
            game_over = True
  • 更新分数并显示在屏幕上。

    python 复制代码
    # 显示分数
        font = pygame.font.Font(None, 36)
        score_text = font.render(f"Score: {score}", True, white)
        screen.blit(score_text, [0, 0])
    
        pygame.display.update()

五、完整代码

python 复制代码
import pygame
import random

# 初始化pygame
pygame.init()

# 设置屏幕宽度和高度
screen_width = 600
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))

# 设置颜色
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)

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

# 蛇的初始位置和方向
snake_block = 20
snake_list = [(screen_width // 2, screen_height // 2)]
snake_direction = 'RIGHT'

# 食物位置
food_position = [random.randint(0, (screen_width // snake_block) - 1) * snake_block,
                 random.randint(0, (screen_height // snake_block) - 1) * snake_block]
food_spawn = True

# 分数
score = 0

# 游戏主循环
game_over = False
while not game_over:
    # 检测键盘事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and snake_direction != 'RIGHT':
                snake_direction = 'LEFT'
            elif event.key == pygame.K_RIGHT and snake_direction != 'LEFT':
                snake_direction = 'RIGHT'
            elif event.key == pygame.K_UP and snake_direction != 'DOWN':
                snake_direction = 'UP'
            elif event.key == pygame.K_DOWN and snake_direction != 'UP':
                snake_direction = 'DOWN'

    # 更新蛇的位置
    lead_x = snake_list[-1][0]
    lead_y = snake_list[-1][1]

    if snake_direction == 'RIGHT':
        lead_x += snake_block
    elif snake_direction == 'LEFT':
        lead_x -= snake_block
    elif snake_direction == 'UP':
        lead_y -= snake_block
    elif snake_direction == 'DOWN':
        lead_y += snake_block

    snake_head = [lead_x, lead_y]
    snake_list.append(snake_head)

    # 如果蛇头与身体相撞,则游戏结束
    if snake_head in snake_list[:-1]:
        game_over = True

    # 如果蛇头碰到边界,则游戏结束
    if snake_head[0] < 0 or snake_head[0] >= screen_width or snake_head[1] < 0 or snake_head[1] >= screen_height:
        game_over = True

    # 蛇吃食物
    if snake_head == food_position:
        score += 10
        food_spawn = False
        while not food_spawn:
            food_position = [random.randint(0, (screen_width // snake_block) - 1) * snake_block,
                             random.randint(0, (screen_height // snake_block) - 1) * snake_block]
            # 确保新生成的食物不与蛇身重叠
            food_spawn = True
            for block in snake_list:
                if block == food_position:
                    food_spawn = False
                    break

    # 绘制屏幕
    screen.fill(black)
    pygame.draw.rect(screen, green, [food_position[0], food_position[1], snake_block, snake_block])

    for block in snake_list[:-1]:
        pygame.draw.rect(screen, white, [block[0], block[1], snake_block, snake_block])

    pygame.draw.rect(screen, red, [snake_list[-1][0], snake_list[-1][1], snake_block, snake_block])

    # 显示分数
    font = pygame.font.Font(None, 36)
    score_text = font.render(f"Score: {score}", True, white)
    screen.blit(score_text, [0, 0])

    pygame.display.update()

    # 控制游戏速度,也就是蛇游动的速度,值越大,蛇的速度越快
    clock.tick(5)

# 游戏结束
pygame.quit()
quit()
相关推荐
Ajiang282473530442 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书4 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024066 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it6 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎