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模型库及建模灯光材质渲染效果图,用于建筑师、城市规划专家、游戏开发等行业。 一、下载地址 …...
力扣题解记录
三元组队列、取出元组中的元素:腐烂的橘子...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
