用Python编写经典《贪吃蛇》小游戏

在这里插入图片描述

文章目录

    • 环境准备
      • 依赖库
    • 实现思路
      • 核心模块设计
    • 代码框架
    • 运行效果
    • 优化建议
    • 总结
      • 通过本框架可实现基础版贪吃蛇游戏,关键点在于:
      • 典型问题解决方案:

环境准备

依赖库

主要依赖

  • Python 3.6+
  • pygame 2.1.2 # 用于图形界面渲染

安装命令

pip install pygame

实现思路

核心模块设计

  1. 游戏初始化
    • 创建游戏窗口
    • 设置颜色常量(蛇身/食物/背景)
    • 初始化计分系统
  2. 蛇体控制
  # 伪代码示例
  def handle_movement():
      while True:
          监听键盘事件 ← 方向键控制
          更新蛇头坐标
          维护蛇身长度
  1. 食物生成
    • 随机坐标生成算法
    • 碰撞检测避免与蛇体重叠
  2. 碰撞检测
    • 边界碰撞检测
    • 自碰撞检测

代码框架

import pygame
import random
import sys

# 游戏设置
SCREEN_WIDTH = 800  # 屏幕宽度
SCREEN_HEIGHT = 600  # 屏幕高度
GRID_SIZE = 20  # 网格大小
GRID_WIDTH = SCREEN_WIDTH // GRID_SIZE  # 网格宽度
GRID_HEIGHT = SCREEN_HEIGHT // GRID_SIZE  # 网格高度

# 颜色定义
WHITE = (255, 255, 255)  # 白色
BLACK = (0, 0, 0)  # 黑色
RED = (255, 0, 0)  # 红色
GREEN = (0, 255, 0)  # 绿色
GRAY = (128, 128, 128)  # 灰色

# 方向定义
UP = (0, -1)  # 向上
DOWN = (0, 1)  # 向下
LEFT = (-1, 0)  # 向左
RIGHT = (1, 0)  # 向右

class Snake:
    def __init__(self):
        # 蛇的初始位置在屏幕中央
        self.positions = [((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2))]
        # 随机选择一个初始方向
        self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
        self.grow = False  # 是否增长
        self.is_over = False  # 游戏是否结束

    def get_head_position(self):
        # 获取蛇头的位置
        return self.positions[0]

    def turn(self, point):
        # 转向,但不能直接反向
        if (point[0] * -1, point[1] * -1) == self.direction:
            return
        else:
            self.direction = point

    def move(self):
        # 移动蛇的位置
        cur = self.get_head_position()
        x, y = self.direction
        new = (((cur[0] + (x * GRID_SIZE)) % SCREEN_WIDTH), (cur[1] + (y * GRID_SIZE)) % SCREEN_HEIGHT)
        if new in self.positions[2:]:
            # 如果蛇头碰到身体,游戏结束
            self.game_over()
        else:
            self.positions.insert(0, new)
            if not self.grow:
                self.positions.pop()
            else:
                self.grow = False

    def game_over(self):
        # 游戏结束
        self.is_over = True

    def reset(self):
        # 重置蛇的位置和方向
        self.positions = [((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2))]
        self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
        self.grow = False

    def grow_snake(self):
        # 让蛇增长
        self.grow = True

    def draw(self, surface):
        # 绘制蛇
        for p in self.positions:
            r = pygame.Rect((p[0], p[1]), (GRID_SIZE, GRID_SIZE))
            pygame.draw.rect(surface, GREEN, r)
            pygame.draw.rect(surface, BLACK, r, 1)

class Food:
    def __init__(self):
        # 初始化食物位置和颜色
        self.position = (0, 0)
        self.color = RED
        self.randomize_position()

    def randomize_position(self):
        # 随机生成食物位置
        self.position = (random.randint(0, GRID_WIDTH - 1) * GRID_SIZE, random.randint(0, GRID_HEIGHT - 1) * GRID_SIZE)

    def draw(self, surface):
        # 绘制食物
        r = pygame.Rect((self.position[0], self.position[1]), (GRID_SIZE, GRID_SIZE))
        pygame.draw.rect(surface, self.color, r)
        pygame.draw.rect(surface, BLACK, r, 1)

def main():
    pygame.init()

    clock = pygame.time.Clock()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)

    surface = pygame.Surface(screen.get_size())
    surface = surface.convert()

    snake = Snake()
    food = Food()

    myfont = pygame.font.SysFont("monospace", 16)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    snake.turn(UP)
                elif event.key == pygame.K_DOWN:
                    snake.turn(DOWN)
                elif event.key == pygame.K_LEFT:
                    snake.turn(LEFT)
                elif event.key == pygame.K_RIGHT:
                    snake.turn(RIGHT)

        snake.move()
        if snake.is_over:
            break
        if snake.get_head_position() == food.position:
            snake.grow_snake()
            food.randomize_position()
        # snake.grow_snake()
        surface.fill(WHITE)
        snake.draw(surface)
        food.draw(surface)
        screen.blit(surface, (0, 0))
        text = myfont.render("Score {0}".format(len(snake.positions)), 1, BLACK)
        screen.blit(text, (5, 10))
        pygame.display.update()
        clock.tick(20)

    myfont = pygame.font.SysFont("monospace", 50)
    myfont.set_bold(True)
    myfont.set_italic(True)
    text = myfont.render("Game Over!", 1, BLACK, GRAY)
    screen.blit(text, (300, 300))
    pygame.display.update()
    pygame.time.wait(2000)

if __name__ == "__main__":
    main()

运行效果

运行截图在这里插入图片描述

优化建议

难度系统:通过得分逐步提升移动速度
音效增强:添加进食音效和背景音乐
存档功能:记录最高分数到本地文件
皮肤系统:允许自定义蛇体外观

总结

通过本框架可实现基础版贪吃蛇游戏,关键点在于:

  • 合理设计游戏循环时序
  • 精确的碰撞检测实现
  • 高效的画面刷新机制

完整实现代码约120-150行,建议在以下环境测试:

   操作系统:Windows/MacOS/Linux
    显示器分辨率:1920x1080(向下兼容)
    开发提示:调试时建议先关闭画面渲染,使用控制台打印坐标进行逻辑验证

典型问题解决方案:

# 常见问题1:方向键反方向无效处理
```python
if event.key == pygame.K_UP and current_direction != 'DOWN':
    direction = 'UP'
    #其他方向同理
    #...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防洪先锋,应急防洪墙助力灾害应急响应|深圳鼎跃

在全球极端天气频发的背景下,洪涝灾害日益成为威胁人类安全的重要因素。传统的防洪措施如堤坝、沙袋虽有一定效果,但在突发性洪水面前往往难以迅速部署。 应急防洪墙是一种模块化、可移动的临时防洪结构,通过拼插、折叠或液压驱动快速形成刚性…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

高通android WIFI debug

参考高通文档:80-76240-16_REV_AA_Wi-Fi_Debug_Techniques 大纲 一、 WLAN Debug Logs –logcat ■ Logcat log logcat is a command-line tool that dumps the log of system messages, ■ Including stack traces when the device throws an error. ■ Need t…

Python:凯撒密码

题目内容: 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符,对应关系如下: 原文:A B C D E F G H I J K L M N O P Q R …

基于STM32的智能鱼缸水质净化系统设计

🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能鱼缸水质净化系统。 目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 1、设计要求…

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…

美甲美睫门店拓客营销小程序开发

一套针对美甲美睫门店开发的营销拓客小程序 小程序支持线上线下服务预约、客户管理、多种客户营销方式以及员工管理、门店管理、门店营销活动创建开展等等。 用户端:服务预约、次卡、时卡办理,会员办理、会员升级、会员权益,复购攒积分&…

deepseek+“D-id”或“即梦AI”快速生成短视频

1、deepseek生成视频脚本 1.1、第一步:使用通用模板提出需求,生成视频脚本 对话输入示例脚本1: 大年初五是迎财神的日志,帮我生成10秒左右的短视频, 体现一家3口在院子里欢庆新年, 孩子在院子里放鞭炮烟…

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1)Rook Operator2)Rook Discover3)Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…

如何在本地部署deepseek?

1、打开ollama官网,点download(下载需要翻墙 https://ollama.com/ 2、双击下载好的OllamaSetup.exe,一直点下一步即可。 3、winR 输入cmd,打开命令提示符,输入ollama。有以下提示即安装完成。 4、可以根据 nvidia-…

团结引擎 OpenHarmony 平台全面支持 UAAL,实现引擎能力嵌入原生应用

团结引擎1.4版本已于近日正式发布!在这一版本中,OpenHarmony 平台迎来了一个具有里程碑意义的更新:全面支持 Used as a Library(UAAL)。UAAL 这一技术方案,具有将引擎嵌入原生应用的独特能力,其…

【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…

【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)

接着上一篇文章;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询(2)Filter【结果过滤】(3)term(4)Aggregation(执行聚合) (1) bool用来做复合查询 复合语…

如何使用DiskGenius做备份并且恢复?

如何使用DiskGenius做备份并且恢复? 前言 前言 此操作适用于将1台旧电脑的数据迁移到新电脑上 一、进入PE使用DG分区进行备份镜像 二、分区备份 1选择要操作的硬盘——2选择操作分区——3备份分区 1选择文件路径(保存pmf文件的位置选择存到U盘中&…

ZZNUOJ(C/C++)基础练习1091——1100(详解版)⭐

目录 1091 : 童年生活二三事(多实例测试) C C 1092 : 素数表(函数专题) C C 1093 : 验证哥德巴赫猜想(函数专题) C C 1094 : 统计元音(函数专题) C C 1095 : 时间间隔(多…

【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现一

整理不易,请不要吝啬你的赞和收藏。 1. 前言 这是 SpringAI 系列的第二篇文章,这篇文章将介绍如何基于 RAG 技术,使用 SpringAI Vue3 ElementPlus 实现一个 Q&A 系统。本文使用 deepseek 的 DeepSeek-V3 作为聊天模型,使用…

【Vue】在Vue3中使用Echarts的示例 两种方法

文章目录 方法一template渲染部分js部分方法一实现效果 方法二template部分js or ts部分方法二实现效果 贴个地址~ Apache ECharts官网地址 Apache ECharts示例地址 官网有的时候示例显示不出来,属于正常现象,多进几次就行 开始使用前,记得先…

1.【线性代数】——方程组的几何解释

1.方程组的几何解释 概述举例举例一1. matrix2.row picture3.column picture 概述 三种表示方法 matrixrow picturecolumn picture 举例 举例一 { 2 x − y 0 − x 2 y 3 \begin{cases} 2x - y 0 \\ -x 2y 3 \end{cases} {2x−y0−x2y3​ 1. matrix [ 2 − 1 − 1 2…