【Python游戏开发】贪吃蛇游戏demo
准备步骤
项目开发使用【Mu 编辑器】
1.新建项目,并导入游戏图片

游戏编写
1.创建场景
SIZE = 15 # 每个格子的大小
WIDTH = SIZE * 30 # 游戏场景总宽度
HEIGHT = SIZE * 30 # 游戏场景总高度def draw():screen.fill((255,255,255)) # 设置背景色为白色
运行游戏,可见一个简单的场景被绘制出来

2.创建主角
snake_head = Actor("snake_head",(30, 30)) # 绘制蛇头图标,初始坐标为(30,30)def draw():screen.fill((255,255,255)) snake_head.draw() # 绘制蛇头
运行后,场景中可见多了一个蛇头图标

3.移动蛇头
direction = "R" # 蛇头初始移动方向
counter = 0 # 循环标识,控制蛇头位置变更频率
# 监测按下的按键
def check_keys():global direction# ←键被按下,且当前方向不为向右if keyboard.left and direction != "R":direction = "L"# →键被按下,且当前方向不为向左elif keyboard.right and direction != "L":direction = "R"# ↑键被按下,且当前方向不为向下elif keyboard.up and direction != "D":direction = "U"# ↓键被按下,且当前方向不为向上elif keyboard.down and direction != "U":direction = "D"
# 蛇头移动位置逻辑
def update_snake(): global countercounter += 1# 每执行10次update函数,才执行一次下方代码,减缓蛇头位置变更速度if counter < 10:returnelse:counter = 0# 蛇头移动逻辑,改变蛇头位置实现移动效果if direction == "L":snake_head.x -= SIZEelif direction == "R":snake_head.x += SIZEelif direction == "U":snake_head.y -= SIZEelif direction == "D":snake_head.y += SIZE
def update():check_keys()update_snake()
此刻开始游戏,蛇头就会开始移动,按下方向键,便会改变蛇头移动方向

可使用angle属性,控制图标翻转,实现蛇头朝向效果
# 监测按下的按键
def check_keys():global direction# ←键被按下,且当前方向不为向右if keyboard.left and direction != "R":direction = "L"snake_head.angle = 0# →键被按下,且当前方向不为向左elif keyboard.right and direction != "L":direction = "R"snake_head.angle = 180# ↑键被按下,且当前方向不为向下elif keyboard.up and direction != "D":direction = "U"snake_head.angle = 90# ↓键被按下,且当前方向不为向上elif keyboard.down and direction != "U":direction = "D"snake_head.angle = -90
4.添加食物
food = Actor("snake_food")
# 在窗口内生成随机坐标,作为食物出现的位置
food.x = random.randint(2,WIDTH // SIZE - 2) * SIZE
food.y = random.randint(2,HEIGHT // SIZE - 2) * SIZEdef draw():screen.fill((255,255,255)) snake_head.draw()food.draw() # 绘制食物
此时运行游戏,窗口中会随机生成食物,但蛇头触碰,并不会被吃掉

5.吃食物
length = 1 # 贪吃蛇当前的初始长度
body = [] # 贪吃蛇蛇身各部位位置,不含蛇头
# draw函数中添加蛇身绘制方法
def draw():screen.fill((255,255,255)) snake_head.draw() food.draw() # 通过循环列表绘制出所有蛇身for b in body:b.draw()
# 蛇头移动位置逻辑中增加蛇身移动逻辑
def update_snake():global countercounter += 1if counter < 10:returnelse:counter = 0# 如果蛇身数量等于蛇的总长度,则移除列表记录的第一个蛇身,实际是移除蛇尾if len(body) == length:body.remove(body[0])# 在列表后追加当前蛇头的坐标,用于绘制新的蛇身;配合上面删除实现蛇身位置变更效果body.append(Actor("snake_body",(snake_head.x, snake_head.y)))if direction == "L":snake_head.x -= SIZEelif direction == "R":snake_head.x += SIZEelif direction == "U":snake_head.y -= SIZEelif direction == "D":snake_head.y += SIZE
# 吃食物逻辑
def eat_food():global length# 如果当前食物坐标与蛇头坐标位置重叠if food.x == snake_head.x and food.y == snake_head.y:# 在窗口内随机坐标位置重新生成食物food.x = random.randint(2,WIDTH // SIZE - 2) * SIZEfood.y = random.randint(2,HEIGHT // SIZE - 2) * SIZElength += 1 # 每吃一个食物,贪吃蛇长度+1
# 将eat_food方法写入update中
def update():check_keys()update_snake()eat_food()
6.游戏结束判定
finished = False # 游戏结束标识
# draw函数中添加失败弹窗
def draw():screen.fill((255,255,255)) snake_head.draw() food.draw() for b in body:b.draw()# 绘制失败提示图像if finished:screen.draw.text("Game Over!",center=(WIDTH // 2,HEIGHT // 2),fontsize = 50,color = "red")
# 检测游戏是否结束
def check_gameover():global finished# 如果蛇头的位置超出窗口,则判定失败if snake_head.left < 0 or snake_head.right > WIDTH or snake_head.top < 0 or snake_head.bottom > HEIGHT:finished = True# 遍历蛇身,判断是否存在与蛇头重叠的蛇身,有,则判定失败for n in range(len(body) - 1):if(body[n].x == snake_head.x and body[n].y == snake_head.y):finished = True
# update函数中调用检测方法
def update():# 如果游戏已结束,则不再更新游戏,即暂停游戏 if finished:returncheck_gameover()check_keys()eat_food()update_snake()
运行游戏后,当蛇头碰到蛇身或墙壁,则会暂停游戏,弹窗游戏失败提示语

完整代码
import random
SIZE = 15 # 每个格子的大小
WIDTH = SIZE * 30 # 游戏场景总宽度
HEIGHT = SIZE * 30 # 游戏场景总高度
direction = "R" # 蛇头初始移动方向
counter = 0 # 循环标识
snake_head = Actor("snake_head",(30, 30)) # 绘制蛇头图标,初始坐标为(30,30)
length = 1 # 贪吃蛇当前的初始长度
body = [] # 贪吃蛇蛇身各部位位置,不含蛇头
finished = False # 游戏结束标识food = Actor("snake_food")
# 在窗口内生成随机坐标,作为食物出现的位置
food.x = random.randint(2,WIDTH // SIZE - 2) * SIZE
food.y = random.randint(2,HEIGHT // SIZE - 2) * SIZEdef draw():screen.fill((255,255,255)) # 设置背景色为白色snake_head.draw() # 绘制蛇头food.draw() # 绘制食物# 通过循环列表绘制出所有蛇身for b in body:b.draw()# 绘制失败提示图像if finished:screen.draw.text("Game Over!",center=(WIDTH // 2,HEIGHT // 2),fontsize = 50,color = "red")# 监测按下的按键
def check_keys():global direction# ←键被按下,且当前方向不为向右if keyboard.left and direction != "R":direction = "L"snake_head.angle = 180# →键被按下,且当前方向不为向左elif keyboard.right and direction != "L":direction = "R"snake_head.angle = 0# ↑键被按下,且当前方向不为向下elif keyboard.up and direction != "D":direction = "U"snake_head.angle = 90# ↓键被按下,且当前方向不为向上elif keyboard.down and direction != "U":direction = "D"snake_head.angle = -90# 贪吃蛇移动位置各部位变化逻辑
def update_snake():global countercounter += 1# 每执行10次update函数,才执行一次下方代码,减缓蛇头位置变更速度if counter < 10:returnelse:counter = 0# 如果蛇身数量等于蛇的总长度,则移除列表记录的第一个蛇身,实际是移除蛇尾if len(body) == length:body.remove(body[0])# 在列表后追加当前蛇头的坐标,用于绘制新的蛇身;配合上面删除实现蛇身位置变更效果body.append(Actor("snake_body",(snake_head.x, snake_head.y)))# 蛇头移动逻辑,改变蛇头位置实现移动效果if direction == "L":snake_head.x -= SIZEelif direction == "R":snake_head.x += SIZEelif direction == "U":snake_head.y -= SIZEelif direction == "D":snake_head.y += SIZE# 吃食物
def eat_food():global length# 如果当前食物坐标与蛇头坐标位置重叠if food.x == snake_head.x and food.y == snake_head.y:# 在窗口内随机坐标位置重新生成食物food.x = random.randint(2,WIDTH // SIZE - 2) * SIZEfood.y = random.randint(2,HEIGHT // SIZE - 2) * SIZElength += 1 # 每吃一个食物,贪吃蛇长度+1
# 检测游戏是否结束
def check_gameover():global finished# 如果蛇头的位置超出窗口,则判定失败if snake_head.left < 0 or snake_head.right > WIDTH or snake_head.top < 0 or snake_head.bottom > HEIGHT:finished = True# 遍历蛇身,判断是否存在与蛇头重叠的蛇身,有,则判定失败for n in range(len(body) - 1):if(body[n].x == snake_head.x and body[n].y == snake_head.y):finished = True def update():# 如果游戏已结束,则不再更新游戏,即暂停游戏 if finished:returncheck_gameover()check_keys()eat_food()update_snake()
相关文章:
【Python游戏开发】贪吃蛇游戏demo
准备步骤 项目开发使用【Mu 编辑器】 1.新建项目,并导入游戏图片 游戏编写 1.创建场景 SIZE 15 # 每个格子的大小 WIDTH SIZE * 30 # 游戏场景总宽度 HEIGHT SIZE * 30 # 游戏场景总高度def draw():screen…...
pytorch张量基础
引言张量的基础知识 张量的概念张量的属性张量的创建张量的操作 基本运算索引和切片形状变换自动微分 基本概念停止梯度传播张量的设备管理 检查和移动张量CUDA 张量高级操作 张量的视图广播机制分块和拼接张量的复制内存优化和管理 稀疏张量内存释放应用实例 线性回归神经网络…...
深入解析LlamaIndex Workflows【下篇】:实现ReAct模式AI智能体的新方法
之前我们介绍了来自LLM开发框架LlamaIndex的新特性:Workflows,一种事件驱动、用于构建复杂AI工作流应用的新方法(参考:[深入解析LlamaIndex Workflows:构建复杂RAG与智能体工作流的新利器【上篇】]。在本篇中ÿ…...
要在 Git Bash 中使用 `tree` 命令,下载并手动安装 `tree`。
0、git bash 安装 git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作) 1、下载并手动安装 tree 下载 tree.exe 从 tree for Windows 官方站点 下载 tree 的 Windows 可执行文件。tree for Window:https://gnuwin32.source…...
Linux的基本指令(1)
前提: a:博主是在云服务器上进行操作的 b:windows上普通文件在Linux中也叫作普通文件,但是windows上的文件夹,在Linux中叫作目录 c:文件 文件内容 文件属性(创建时间,修改时间,…...
JavaEE之多线程进阶-面试问题
一.常见的锁策略 锁策略不是指某一个具体的锁,所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高,悲观锁为预测锁冲突的概率较高,乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…...
费曼学习法没有输出对象怎么办?
费曼学习法并不需要输出对象。费曼学习法的核心在于通过将所学知识以简明易懂的方式解释给自己听,从而加深对知识的理解和记忆。这种方法强调的是理解和反思的过程,而不是简单地通过输出(如向他人解释)来检验学习效果。费曼学…...
Hive优化操作(二)
Hive 数据倾斜优化 在使用 Hive 进行大数据处理时,数据倾斜是一个常见的问题。本文将详细介绍数据倾斜的概念、表现、常见场景及其解决方案。 1. 什么是数据倾斜? 数据倾斜是指由于数据分布不均匀,导致大量数据集中到某个节点或任务中&…...
销冠的至高艺术:让自己不像销售
若想在销售领域脱颖而出,首先是让自己超越传统销售的框架,成为客户心中不可多得的行业顾问与信赖源泉。这不仅是身份的蜕变,更是影响力与信任度质的飞跃。 销冠对客户只吸引不骚扰,不讲自己卖什么,只讲自己能解决什么…...
Hive数仓操作(十一)
一、Hive 日期函数 在日常的数据处理工作中,日期和时间的处理是非常常见的操作。Hive 提供了丰富的日期函数,能够帮助我们方便地进行日期和时间的计算。本文将详细介绍 Hive 中常用的日期函数,并通过具体的示例展示其用法和结果。 1. 获取当…...
C语言初步介绍(初学者,大学生)【上】
1.C语⾔是什么? ⼈和⼈交流使⽤的是⾃然语⾔,如:汉语、英语、⽇语 那⼈和计算机是怎么交流的呢?使⽤ 计算机语⾔ 。 ⽬前已知已经有上千种计算机语⾔,⼈们是通过计算机语⾔写的程序,给计算机下达指令&am…...
陈文自媒体:现在的房价,已经跌到7年前!
今年的国庆北上广深都放开了政策,很多人都放弃旅游去看房了,现在的全民都有一个基本意识,现在的房子已经到了谷底,从各大政策就可以看出来,稍微有点钱的可以出手买房了。 昨天我哥跟我说,现在xx地方的房子…...
基于STM32的智能水族箱控制系统设计
引言 本项目基于STM32微控制器设计一个智能水族箱控制系统。该系统能够通过传感器监测水温、照明和水位,并自动控制加热器、LED灯和水泵,确保水族箱内的环境适宜鱼类生长。该项目展示了STM32在环境监测、设备控制和智能反馈系统中的应用。 环境准备 1…...
java语言基础案例-cnblog
java语言基础案例 象棋口诀 输出 package nb;public class XiangQi {public static void main(String[] args) {char a 马;char b 象;char c 卒;System.out.println(a"走日"b"走田""小"c"一去不复还");} }输出汇款单 package nb…...
MyBatis-Plus 之 typeHandler 的使用
一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式,可以使用JacksonTypeHandler处理器。使用方式非常简单,如下所示: 在domain实体类里面要加上,两个注解 TableName(autoResultMap true) 表示自动…...
HDLBits中文版,标准参考答案 |2.5 More Verilog Features | 更多Verilog 要点
关注 望森FPGA 查看更多FPGA资讯 这是望森的第 7 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Conditional ternary operator | 条件三目运算符 2 Reduction operators | 归约运算器 3 Reduction: Even wider gates | 归约:更宽的门电路 4 Combinational fo…...
提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享
日常使用Windows电脑时,总会需要下载各种各样的办公软件。部分软件会默认开机自启功能,开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿,开机慢,运行不流畅的情况出现,而…...
数据库简单介绍
数据库是现代信息技术中用于存储、管理和检索数据的重要工具。数据库技术的发展经历了多个阶段,从早期的层次模型和网状模型,到关系型数据库的兴起,再到NoSQL和NewSQL的多样化发展。数据库系统已经成为现代信息系统的核心和基础设施。 数据库…...
运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )
在上一篇文章中,我们已经在云服务器中安装并开启了minio服务,本章我们将为大家讲解如何利用程序将文件上传到minio桶中 下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。 - **对象(Object࿰…...
C语言 | Leetcode C语言题解之第461题汉明距离
题目: 题解: int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s) {s & s - 1;ret;}return ret; }...
保姆级教程:将LabelImg标注的VOC数据一键转为Ultralytics RT-DETR训练格式
从VOC到RT-DETR:零基础完成目标检测数据格式转换实战 当你第一次尝试用Ultralytics框架训练RT-DETR模型时,最令人头疼的往往不是模型调参,而是数据准备阶段——特别是当你的标注数据还停留在LabelImg生成的VOC格式(XML文件&#x…...
从分辨率、码率到蓝光:解码高清视频的三大核心要素
1. 分辨率:高清世界的基石 第一次接触高清视频时,我被商家宣传的"4K超清"搞得一头雾水。直到自己开始做视频剪辑才明白,分辨率就像织布的经纬线——它决定了画面能有多细腻。举个生活中的例子,1080P分辨率相当于用19201…...
音乐解锁实战:如何让网易云音乐的加密文件在任意设备自由播放
音乐解锁实战:如何让网易云音乐的加密文件在任意设备自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在特定客户端播放,无法在车载音响…...
别再复制官网代码了!Vue + Ant Design 图标与分隔符的本地化实战(附避坑指南)
Vue Ant Design 图标与分隔符的本地化实战指南 在Vue项目中使用Ant Design Vue组件库时,很多开发者习惯直接从官网复制示例代码。然而,这种"拿来主义"常常导致项目运行时出现图标不显示、样式依赖CDN资源等问题。本文将带你从零开始ÿ…...
Neovim原生GitHub Copilot客户端gp.nvim:从安装配置到高级实战
1. 项目概述:一个为Neovim量身打造的GitHub Copilot客户端如果你和我一样,是个重度Neovim用户,同时又对GitHub Copilot这类AI编程助手爱不释手,那你肯定也经历过那种“鱼与熊掌”的纠结时刻。在VSCode里,Copilot的集成…...
微软UFO项目:统一AI模型调用的抽象层设计与工程实践
1. 项目概述:当“统一”成为AI开发的新范式最近在折腾大模型应用开发的朋友,可能都绕不开一个痛点:模型太多,工具链太杂。想用闭源的GPT-4处理文本,用开源的Llama搞本地推理,再用DALL-E 3生成图片ÿ…...
Proxima向量检索库:硬件优化与量化技术实战解析
1. 项目概述:一个为现代开发者打造的“近邻”代码库 最近在GitHub上看到一个挺有意思的项目,叫“Zen4-bit/Proxima”。乍一看这个标题,可能会有点摸不着头脑。“Zen4-bit”像是一个用户名或者某种架构的代号,而“Proxima”则让人联…...
实在Agent如何破解成本分析报告编制耗时耗力与数据滞后?企业架构师的避坑指南
摘要:在2026年的今天,尽管AI技术已深度普及,但许多企业的财务与运营部门仍深陷“数据泥潭”。传统的成本分析报告编制依赖于大量的人工导数、Excel汇总及跨系统搬运,导致报告产出即滞后,严重误导决策。作为一名深耕行业…...
Claude集成OpenClaw:多智能体框架的模型驱动开发实践
1. 项目概述:当Claude遇上OpenClaw,一个智能体协作框架的诞生最近在AI智能体开发圈里,一个名为“gungwang/claude-into-openclaw”的项目引起了我的注意。乍一看这个标题,你可能会有点懵——“Claude”是Anthropic家的那个大语言模…...
