Python 小游戏——贪吃蛇
Python 小游戏——贪吃蛇


文章目录
- Python 小游戏——贪吃蛇
- 项目介绍
- 环境配置
- 代码设计思路
- 1. 初始化和变量定义
- 2. 创建游戏窗口和FPS控制器
- 3. 初始化贪吃蛇和食物的位置
- 4. 控制贪吃蛇的方向和分数
- 5. 主游戏循环
- 难点分析
- 源代码
- 呈现代码结果
项目介绍
贪吃蛇游戏是一款通过上下左右方向键控制贪吃蛇吃到豆豆以获取积分的游戏,该项目使用Python语言进行实现。主要使用了Pygame库来处理图形和用户输入。
环境配置
该项目需要在Pycharm的终端中执行以下指令来安装Pygame库:
pip install pygame
具体步骤如下:
- 打开你的PyCharm项目。
- 选择顶部菜单栏中的 “View” 菜单。
- 选择 “Tool Windows” -> “Terminal” 以打开PyCharm的终端窗口。
- 在终端窗口中输入
pip install pygame并按回车键执行。
代码设计思路
1. 初始化和变量定义
首先,我们初始化Pygame并定义一些常量,包括窗口大小、贪吃蛇的速度和颜色。
import pygame
import time
import random# 初始化Pygame
pygame.init()# 定义一些常量
window_x = 720
window_y = 480
snake_block = 10
snake_speed = 15# 定义颜色
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)
2. 创建游戏窗口和FPS控制器
接着,创建游戏窗口并设置标题,同时创建FPS控制器来控制游戏的帧率。
# 创建游戏窗口
pygame.display.set_caption('Greedy Snake')
game_window = pygame.display.set_mode((window_x, window_y))# FPS控制器
fps = pygame.time.Clock()
3. 初始化贪吃蛇和食物的位置
定义贪吃蛇的默认位置和身体,以及食物的位置和生成状态。
# 定义贪吃蛇的默认位置
snake_pos = [100, 50]# 定义贪吃蛇的身体
snake_body = [[100, 50], [90, 50], [80, 50]]# 定义食物的位置
food_pos = [random.randrange(1, (window_x // 10)) * 10, random.randrange(1, (window_y // 10)) * 10]
food_spawn = True
4. 控制贪吃蛇的方向和分数
设置贪吃蛇的默认移动方向和分数,同时定义显示分数和结束游戏的函数。
# 设置默认方向
direction = 'RIGHT'
change_to = direction# 初始化分数
score = 0# 显示分数
def show_score(choice, color, font, size):score_font = pygame.font.SysFont(font, size)score_surface = score_font.render('Score : ' + str(score), True, color)score_rect = score_surface.get_rect()game_window.blit(score_surface, score_rect)# 结束游戏
def game_over():my_font = pygame.font.SysFont('times new roman', 50)game_over_surface = my_font.render('Your Score is : ' + str(score), True, red)game_over_rect = game_over_surface.get_rect()game_over_rect.midtop = (window_x / 2, window_y / 4)game_window.blit(game_over_surface, game_over_rect)pygame.display.flip()time.sleep(2)pygame.quit()quit()
5. 主游戏循环
在主游戏循环中,处理用户输入、更新贪吃蛇的位置、检测碰撞以及显示当前状态。
# 主函数
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()quit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:change_to = 'UP'elif event.key == pygame.K_DOWN:change_to = 'DOWN'elif event.key == pygame.K_LEFT:change_to = 'LEFT'elif event.key == pygame.K_RIGHT:change_to = 'RIGHT'# 确保贪吃蛇不能反向移动if change_to == 'UP' and direction != 'DOWN':direction = change_toif change_to == 'DOWN' and direction != 'UP':direction = change_toif change_to == 'LEFT' and direction != 'RIGHT':direction = change_toif change_to == 'RIGHT' and direction != 'LEFT':direction = change_to# 移动贪吃蛇if direction == 'UP':snake_pos[1] -= 10if direction == 'DOWN':snake_pos[1] += 10if direction == 'LEFT':snake_pos[0] -= 10if direction == 'RIGHT':snake_pos[0] += 10# 增加贪吃蛇的长度snake_body.insert(0, list(snake_pos))if snake_pos[0] == food_pos[0] and snake_pos[1] == food_pos[1]:score += 10food_spawn = Falseelse:snake_body.pop()if not food_spawn:food_pos = [random.randrange(1, (window_x // 10)) * 10, random.randrange(1, (window_y // 10)) * 10]food_spawn = Truegame_window.fill(black)for pos in snake_body:pygame.draw.rect(game_window, green, pygame.Rect(pos[0], pos[1], snake_block, snake_block))pygame.draw.rect(game_window, red, pygame.Rect(food_pos[0], food_pos[1], snake_block, snake_block))if snake_pos[0] < 0 or snake_pos[0] > window_x - snake_block:game_over()if snake_pos[1] < 0 or snake_pos[1] > window_y - snake_block:game_over()for block in snake_body[1:]:if snake_pos[0] == block[0] and snake_pos[1] == block[1]:game_over()show_score(1, white, 'times new roman', 20)pygame.display.update()fps.tick(snake_speed)
难点分析
- 方向控制:
- 确保贪吃蛇不能反向移动。这通过在检查方向变更时加入条件来实现,例如:当前方向是向上时不能变更为向下。
- 碰撞检测:
- 需要检测贪吃蛇是否碰到边界或者自身,这通过比较贪吃蛇头部的位置与边界和自身身体的位置来实现。
- 食物生成:
- 随机生成食物的位置,需要确保食物生成的位置不在贪吃蛇身体上。
源代码
import pygame
import time
import random# 初始化Pygame
pygame.init()# 定义一些常量
window_x = 720
window_y = 480
snake_block = 10
snake_speed = 15# 定义颜色
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)# 创建游戏窗口
pygame.display.set_caption('Greedy Snake')
game_window = pygame.display.set_mode((window_x, window_y))# FPS控制器
fps = pygame.time.Clock()# 定义贪吃蛇的默认位置
snake_pos = [100, 50]# 定义贪吃蛇的身体
snake_body = [[100, 50], [90, 50], [80, 50]]# 定义食物的位置
food_pos = [random.randrange(1, (window_x // 10)) * 10, random.randrange(1, (window_y // 10)) * 10]
food_spawn = True# 设置默认方向
direction = 'RIGHT'
change_to = direction# 初始化分数
score = 0# 显示分数
def show_score(choice, color, font, size):score_font = pygame.font.SysFont(font, size)score_surface = score_font.render('Score : ' + str(score), True, color)score_rect = score_surface.get_rect()game_window.blit(score_surface, score_rect)# 结束游戏
def game_over():my_font = pygame.font.SysFont('times new roman', 50)game_over_surface = my_font.render('Your Score is : ' + str(score), True, red)game_over_rect = game_over_surface.get_rect()game_over_rect.midtop = (window_x / 2, window_y / 4)game_window.blit(game_over_surface, game_over_rect)pygame.display.flip()time.sleep(2)pygame.quit()quit()# 主函数
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()quit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:change_to = 'UP'elif event.key == pygame.K_DOWN:change_to = 'DOWN'elif event.key == pygame.K_LEFT:change_to = 'LEFT'elif event.key == pygame.K_RIGHT:change_to = 'RIGHT'# 确保贪吃蛇不能反向移动if change_to == 'UP' and direction != 'DOWN':direction = change_toif change_to == 'DOWN' and direction != 'UP':direction = change_toif change_to == 'LEFT' and direction != 'RIGHT':direction = change_toif change_to == 'RIGHT' and direction != 'LEFT':direction = change_to# 移动贪吃蛇if direction == 'UP':snake_pos[1] -= 10if direction == 'DOWN':snake_pos[1] += 10if direction == 'LEFT':snake_pos[0] -= 10if direction == 'RIGHT':snake_pos[0] += 10# 增加贪吃蛇的长度snake_body.insert(0, list(snake_pos))if snake_pos[0] == food_pos[0] and snake_pos[1] == food_pos[1]:score += 10food_spawn = Falseelse:snake_body.pop()if not food_spawn:food_pos = [random.randrange(1, (window_x // 10)) * 10, random.randrange(1, (window_y // 10)) * 10]food_spawn = Truegame_window.fill(black)for pos in snake_body:pygame.draw.rect(game_window, green, pygame.Rect(pos[0], pos[1], snake_block, snake_block))pygame.draw.rect(game_window, red, pygame.Rect(food_pos[0], food_pos[1], snake_block, snake_block))if snake_pos[0] < 0 or snake_pos[0] > window_x - snake_block:game_over()if snake_pos[1] < 0 or snake_pos[1] > window_y - snake_block:game_over()for block in snake_body[1:]:if snake_pos[0] == block[0] and snake_pos[1] == block[1]:game_over()show_score(1, white, 'times new roman', 20)pygame.display.update()fps.tick(snake_speed)
呈现代码结果
该项目效果如图所示:


相关文章:
Python 小游戏——贪吃蛇
Python 小游戏——贪吃蛇 文章目录 Python 小游戏——贪吃蛇项目介绍环境配置代码设计思路1. 初始化和变量定义2. 创建游戏窗口和FPS控制器3. 初始化贪吃蛇和食物的位置4. 控制贪吃蛇的方向和分数5. 主游戏循环 难点分析源代码呈现代码结果 项目介绍 贪吃蛇游戏是一款通过上下…...
人工智能方面顶会
人工智能 AAAI the National Conference on Artificial Intelligence 美国人工智能协会主办 IJCAJ the International Joint Conference on Artificial Intelligence每年举办 计算机视觉 CVPR IEEE Conference on Computer Vision and Pattern Recognition ECCV European Co…...
JRT1.7发布
JRT1.7连仪器在线演示视频 JRT1.5实现质控主体、1.6基本完成质控;本次版本推进到1.7,1.7集菜单权限、登录、打印导出客户端、初始化、质控、Linux客户端、仪器连接和监控体系各种功能大全,上十年写系统用到的都全了。 这次直接挑战检验最难…...
Python错误集锦:xlwt写入表格时提示exception-unexpected-data-type-class-bytes
原文链接:http://www.juzicode.com/python-error-exception-unexpected-data-type-class-bytes 错误提示: #juzicode.com/VX公众号:juzicode import xlwt wb xlwt.Workbook() ws wb.add_sheet(juzicode) a bjuzicode ws.write(3, 0, 桔子code) ws.wri…...
赶紧收藏!2024 年最常见 20道 Redis面试题(八)
上一篇地址:赶紧收藏!2024 年最常见 20道 Redis面试题(七)-CSDN博客 十五、一个Redis实例最多能存放多少的keys? Redis实例能存放的键(keys)的数量主要受限于以下几个因素: 物理内…...
Flowable第一次启动MYSQL8.0版本(踩坑)
flowable工作流项目第一次启动报错表不存在,是因为连接mysql数据库的时候没有设置&nullCatalogMeansCurrenttrue,mysql5.0以上该配置默认为flase,即不操作本数据库。因此需要修改为true。datasource:url: jdbc:mysql://127.0.0.1:3306/fl…...
Java基础的语法---StringBuilder
StringBuilder 构造方法 StringBuilder():创建一个空的StringBuilder实例。 StringBuilder(String str):创建一个StringBuilder实例,并将其初始化为指定的字符串内容。 StringBuilder(int a): 创建一个StringBuilder实例…...
【微服务】springboot 构建镜像多种模式使用详解
目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …...
手写tomcat(Ⅲ)——tomcat动态资源的获取
仿写tomcat的Servlet接口体系 之前写过一篇博客,Tomcat的Servlet-GenericServlet-HttpServlet体系的具体结构,以及Servlet的生命周期 Servlet讲解 想要模仿tomcat获取动态资源,就需要我们自己仿写一个Servlet接口体系 主要包括:…...
软件测试面试题(四)
一:测试评估的目标? 量化测试进程 生成缺陷和测试覆盖率的总结报告 测试评估的问题 没有把测试覆盖率作为报告测试进程的根据,使得不知测试是否结束; 没有做测试缺陷评估,缺陷评估是量度软件可行性的重要指标&…...
infoq学习笔记-云原生网关当道,三大主流厂商如何“竞 技”?
注基础组件的质量,这些基础组件是用户看不到的。这些组件包括代码质量、自动化的CI/CD、端对端测试、混沌测试等。在APISIX中,我们内置了大 量的测试案例代码,包括单元测试、E2E测试、混沌测试,以及一些基准测试等,从而…...
Python中别再用 ‘+‘ 拼接字符串了!
大家好,在 Python 编程中,我们常常需要对字符串进行拼接。你可能会自然地想到用 操作符将字符串连接起来,毕竟这看起来简单明了。 在 Python 中,字符串是不可变的数据类型,这意味着一旦字符串被创建,它就…...
前端上传heic图片转jpe格式并展示
各大浏览器对 HEIC 格式图片的支持情况,包括上传和显示的支持度 浏览器版本HEIC 上传HEIC 显示Chrome版本 85 及以上支持不支持Firefox所有版本支持不支持Safari版本 11 及以上支持支持Edge版本 18 及以上支持不支持Opera所有版本支持不支持IE不支持不支持不支持 …...
VMware虚拟机-设置系统网络IP、快照、克隆
1.设置网络IP 1.点击右上角开关按钮-》有线 已连接-》有线设置 2.手动修改ip 3.重启或者把开关重新关闭开启 2.快照设置 快照介绍: 通过快照可快速保存虚拟机当前的状态,后续可以使用虚拟机还原到某个快照的状态。 1.添加快照(需要先关闭虚拟机) 2.在…...
指纹识别概念解析
目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来,指纹在侦破刑事案件、解决诉…...
图像处理神经网络数据预处理步骤的详细解释和分析
1. 尺寸调整(Resizing) 目的:神经网络通常需要固定尺寸的输入图像。通过统一图像尺寸,可以确保输入的一致性,使得网络能够正常处理。 方法:将所有输入图像调整为特定的尺寸(例如224x224像素&a…...
音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg
本节的目的是在windows 上 编译 ffmpeg 源码,这样做的目的是:在工作中可以根据工作的实际内容裁剪 ffmpeg,或者改动 ffmpeg 的源码。 第一步 :下载, 安装,配置 ,运行 msys64 下载 下载地址&…...
第十二周笔记
微信小程序的自定义事件是指开发者可以自行定义并触发的事件,以实现特定的功能或逻辑。通过自定义事件,开发者可以更灵活地管理小程序的交互和数据流动,提升用户体验和开发效率。下面我将详细讲解微信小程序自定义事件,包括定义、…...
SketchUp v2024 v24.0.553 解锁版安装教程 (强大的绘图三维建模工具)
前言 SketchUp(简称SU,俗称草图大师)全球知名的三维建模软件,强大的绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图,用于建筑师、城市规划专家、游戏开发等行业。 一、下载地址 …...
力扣题解记录
三元组队列、取出元组中的元素:腐烂的橘子...
Lampiao 靶场
Lampiao 靶场完整渗透解析一、靶场环境信息攻击机(Kali)IP:192.168.146.128靶机 IP:192.168.146.129目标:获取靶机 root 权限与 flag二、步骤 1:信息收集(端口与服务扫描)nmap -p- -…...
千亿镁合金产业集群正在成形:成都、抚州、池州的新版图
一个新赛道的地理坐标 如果要在中国地图上标注一条正在成形的新兴产业集群走廊,高强镁合金这条线,值得被认真画出来。 成都龙泉驿——江西抚州临川——安徽池州高新区,三个坐标,三条生产线,一家公司,两年内…...
CPU架构启发的智能仓储布局优化实践
1. 仓库布局优化的核心挑战与创新机遇在物流仓储领域,拣货环节通常占据运营成本的55%-65%,而其中约50%的时间消耗在无效行走路径上。传统矩形仓库布局虽然易于规划和施工,但其正交的通道设计导致拣货员需要频繁进行90度转向,这种&…...
WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案
WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案 【免费下载链接】wtfautolayout The source code for Why The Failure, Auto Layout? 项目地址: https://gitcode.com/gh_mirrors/wt/wtfautolayout 在iOS开发中,Auto Layout是构建灵…...
如何用HsMod解锁炉石传说60+项隐藏功能:终极优化指南
如何用HsMod解锁炉石传说60项隐藏功能:终极优化指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx开发的炉石传说功能增强插件,为玩家提供…...
claude code用户如何迁移到taotoken解决封号与token不足问题
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code 用户如何迁移到 Taotoken 解决封号与 Token 不足问题 应用场景类,针对 Claude Code 用户常遇封号与 Token…...
Driver Store Explorer终极指南:轻松管理Windows驱动存储区,释放宝贵磁盘空间
Driver Store Explorer终极指南:轻松管理Windows驱动存储区,释放宝贵磁盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾为Windows系统越来越慢而烦…...
PrediPrune:机器学习驱动的编译器超级优化候选剪枝策略
1. 项目概述与核心挑战在编译器优化的世界里,我们总在追求极致的性能。传统的编译器优化器,比如LLVM的Pass,依赖于一系列预定义的、经过验证的转换规则。它们很高效,但想象力也受限于这些规则。超级优化器(Superoptimi…...
还在古法编程?OpenAI Codex 全自动编程!稳定中转 Token 保姆级教程
OpenAI Codex 从安装到进阶实战|终端 AI 编程完全指南(2026 最新) 摘要:OpenAI Codex 是目前最强大的终端 AI 编程工具,支持代码生成、项目重构、Bug 修复、脚本自动化、批量代码优化等全场景能力。本文从零起步&…...
终极指南:5分钟搞定淘宝淘金币全任务自动化脚本
终极指南:5分钟搞定淘宝淘金币全任务自动化脚本 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 你是否厌倦…...
