用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:returnelse:self.direction = pointdef move(self):# 移动蛇的位置cur = self.get_head_position()x, y = self.directionnew = (((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 = Falsedef game_over(self):# 游戏结束self.is_over = Truedef reset(self):# 重置蛇的位置和方向self.positions = [((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2))]self.direction = random.choice([UP, DOWN, LEFT, RIGHT])self.grow = Falsedef grow_snake(self):# 让蛇增长self.grow = Truedef 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 = REDself.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:breakif 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'#其他方向同理#...

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA接入DeepSeek

IDEA 目前有多个途径可以接入deepseek,比如CodeGPT或者Continue,这里借助CodeGPT插件接入,CodeGPT目前用的人最多,相对更稳定 一、安装 1.安装CodeGPT idea插件市场找到CodeGPT并安装 2.创建API Key 进入deepseek官网&#xf…

aspectFill(填充目标区域的同时保持图像的原有宽高比 (aspect ratio)图像不会被拉伸或压缩变形

“aspectFill” 是一个常用于图像和视频处理的术语,尤其是在用户界面 (UI) 设计和图形编程领域。它描述的是一种图像缩放或调整大小的方式,旨在填充目标区域的同时保持图像的原有宽高比 (aspect ratio)。 更详细的解释: Aspect Ratio (宽高比): 指的是图…

在 Windows 系统中如何快速进入安全模式的两种方法

在使用电脑的过程中,有时我们可能会遇到一些需要进入“安全模式”来解决的问题。安全模式是一种特殊的启动选项,它以最小化配置启动操作系统,仅加载最基本的驱动程序和服务,从而帮助用户诊断和修复系统问题。本文中简鹿办公将详细…

CNN-LSTM卷积神经网络长短期记忆神经网络多变量多步预测,光伏功率预测

CNN-LSTM卷积神经网络长短期记忆神经网络多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 光伏发电作为一种清洁能源,对于实现能源转型和应对气候变化具有重要意义。然而,光伏发电的输出功率具有很强的间歇性和波动性&#xff…

Matlab工具包安装

一,直接下载源码并配置方式 tensortoolbox地址:https://www.tensortoolbox.org/ 参考地址:https://blog.csdn.net/qq_37637914/article/details/116016157 二,从官方商店下载-需要登录

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件,具有单向导电性。 1. PN结形成 P型半导体:掺入三价元素,形成空穴作为多数载流子。N型半导体:掺入五价元素,形成自由电子作为多…

C++ 模板

一、非类型模板参数 模板参数分类:类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例:金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

RAG 在智能答疑中的探索

一、背景 得物开放平台是一个把得物能力进行开放,同时提供给开发者提供 公告、应用控制台、权限包申请、业务文档等功能的平台。 面向商家:通过接入商家自研系统。可以实现自动化库存、订单、对账等管理。 面向ISV :接入得物开放平台&#…

C语言基础11:分支结构以及if的使用

C语言基础 内容提要 分支结构 条件判断用if语句实现分支结构 分支结构 问题抛出 我们在程序设计往往会遇到如下问题,比如下面的函数的计算: y { 1 / x 当 x ≠ 0 时 10000 当 x 0 时 y \begin{cases} 1/x \quad当x\neq0时\\ \\ 10000 \quad当x0…

【Elasticsearch】监控与管理:集群监控指标

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

【文本处理】如何在批量WORD和txt文本提取手机号码,固话号码,提取邮箱,删除中文,删除英文,提取车牌号等等一些文本提取固定格式的操作,基于WPF的解决方案

企业的应用场景 数据清洗:在进行数据导入或分析之前,往往需要对大量文本数据进行预处理,比如去除文本中的无关字符(中文、英文),只保留需要的联系信息(手机号码、固话号码、邮箱)。…

Vue项目--动画效果的改变

前言: 本篇文章主要是用于解决Vue2改Vue3项目过程中遇到的动画问题 vue2中动画效果 1. 作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。 2. 写法: 1. 准备好样式: - 元素进入的样式&…

01.Docker 概述

Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…

【转载】开源鸿蒙OpenHarmony社区运营报告(2025年1月)

●截至2025年1月31日,开放原子开源鸿蒙(OpenAtom OpenHarmony,简称“开源鸿蒙”或“OpenHarmony”)社区累计超过8200名贡献者,共63家成员单位,产生51.2万多个PR、2.9万多个Star、10.5万多个Fork、68个SIG。…

STM32系统架构介绍

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

Leetcode - 149双周赛

目录 一、3438. 找到字符串中合法的相邻数字二、3439. 重新安排会议得到最多空余时间 I三、3440. 重新安排会议得到最多空余时间 II四、3441. 变成好标题的最少代价 一、3438. 找到字符串中合法的相邻数字 题目链接 本题有两个条件: 相邻数字互不相同两个数字的的…

2025.2.10 每日学习记录3:技术报告只差相关工作+补实验

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右,一次性备考笔试的三个科目 1.实习申请技术准备:微调、Agent、RAG 据央视财经,数据显示,截至2024年12月…

【苍穹外卖】修改前端代码解决修改Nginx端口后websocket连接失败的问题

解决方案——修改前端js代码 步骤一 找到文件app.d0aa4eb3.js(…\nginx-1.20.2\html\sky\js\app.d0aa4eb3.js),将n"ws://localhost/ws/"改成下面的内容。 // 改成n"ws://localhost:800/ws/"仍然不行——页面…

本地基于GGUF部署的DeepSeek实现轻量级调优之二:检索增强生成(RAG)

前文,我们在本地windows电脑基于GGUF文件,部署了DeepSeek R1 1.5B模型,如果想在离线模式下加载本地的DeepSeek模型自行对进行训练时,是不能直接使用GGUF文件进行训练的,但是可以对模型进行微调,以下说的是第…