pygame第6课——贪吃蛇小游戏
今天我们开始Pygame的第六课,前几节课的内容在这里【点我】,欢迎大家前去考古:

今天我们一起来学习制作一个小游戏【贪吃蛇】,这是一个非常经典的小游戏,那么我们一起开始吧

1、游戏准备工作
import pygame, random,os # 导入pygame模块和random、os模块os.environ["SDL_VIDEO_WINDOW_POS"]="100,100" # 设置环境变量,设置窗口的位置在屏幕左上角(100,100)的位置pygame.init() # 初始化pygametime_clock = pygame.time.Clock() # 创建一个Clock对象用于控制游戏的速度sc = pygame.display.set_mode((640, 480)) # 创建一个窗口,大小为640x480像素
pygame.display.set_caption("贪吃蛇") # 设置窗口标题为“贪吃蛇”font = pygame.font.SysFont("宋体", 48 , True) # 创建一个字体对象,字体为宋体,大小为48像素,加粗显示pink = (255, 182, 193) # 定义颜色pink为RGB值(255, 182, 193)
violet = (238,130,238) # 定义颜色violet为RGB值(238,130,238)
white = (255, 255, 255) # 定义颜色white为RGB值(255, 255, 255)
green = (0,255,0) # 定义颜色green为RGB值(0,255,0)
red = (255,0,0) # 定义颜色red为RGB值(255,0,0)
这里的代码每一行都加了注释
os.environ["SDL_VIDEO_WINDOW_POS"]="100,100":这一行是指运行代码时,Pygame以左上角 的初始位置
time_clock = pygame.time.Clock(): 创建一个Clock对象用于控制游戏的速度
2、接下来我们创建一个 【贪吃蛇】类
class Snake():def __init__(self):self.direction = "right"# 定义一个贪吃蛇的长度列表,其中有几个元素就代表有几段身体self.body = [[100, 100], [80, 100]]self.head = list(self.body[0]) # 蛇头位置def draw_me(self):# 绘制身体for b in self.body:pygame.draw.rect(sc, green, (b[0], b[1], 20, 20))def move_head(self):# 根据方向移动蛇头if self.direction == "right":self.head[0] += 20elif self.direction == "left":self.head[0] -= 20elif self.direction == "up":self.head[1] -= 20elif self.direction == "down":self.head[1] += 20def add_body(self):self.body.insert(0, list(self.head))def cut_tail(self):self.body.pop()def move_snake(self):self.add_body()self.cut_tail()
代码注释:
self.direction = "right":指【贪吃蛇】出生时的初始方向
self.body = [[100, 100], [80, 100]]:初始的小方格坐标(以左上角为原点)
self.head = list(self.body[0])# 蛇头位置,蛇头的坐标函数【
draw_me】,利用*pygame.draw.rect(sc, green, (b[0], b[1], 20, 20))*,这个在第三节课中有讲过:点我复习第三节课函数【
move_head】,移动函数,左右移动和X轴有关系,所以代码里取头的*head[0],上下移动和Y轴有关系,所以代码里取头的head[1]*函数【
add_body】:增加身体的小方格,这个是吃到食物调用的函数函数【
cut_tail】:这个是删除尾巴的小方格函数【
move_snake】,这个函数中调用了【add_body,cut_tail】,头加一个,尾巴减一个,头加一个,尾巴减一个,头加一个,尾巴减一个…,这就是移动
3、接下来我们创建一个 【贪吃蛇】类
# 食物类的设计
class Food():def __init__(self):self.color=white#知识进阶-双倍奖励#self.color=random.choice([white,pink])x = random.randrange(0, 640,20)y = random.randrange(0, 480,20)self.postion = [x,y]def draw_me(self):pygame.draw.rect(sc, self.color, (self.postion[0], self.postion[1], 20, 20))def reset(self):x = random.randrange(0, 640,20)y = random.randrange(0, 480,20)self.postion = [x,y]#知识进阶-双倍奖励#self.color=random.choice([white,pink])
代码注释
self.color=white,食物初始颜色是白色
x = random.randrange(0, 640,20),y = random.randrange(0, 480,20),这是指食物不可超过游戏的界面大小,X轴在0到640步长为20,Y轴上为0到480步长为20,都是随机的知识进阶-双倍奖励
self.color=random.choice([white,pink]),颜色可随机挑选
4、收尾
food = Food()
snake = Snake()
while True:len_text = font.render("Length: "+str(len(snake.body)),True,red)# 从队列中获取事件for event in pygame.event.get():# 判断是否为退出事件if event.type == pygame.QUIT:pygame.quit()# 按键事件elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:if snake.direction != "left":snake.direction = "right"if event.key == pygame.K_LEFT:if snake.direction != "right":snake.direction = "left"if event.key == pygame.K_UP:if snake.direction != "down":snake.direction = "up"if event.key == pygame.K_DOWN:if snake.direction != "up":snake.direction = "down"# 判断是否吃到食物if snake.head == food.postion:food.reset()snake.add_body()'''#知识进阶-双倍奖励if food.color==white:food.reset()snake.add_body()else:food.reset()snake.add_body()snake.add_body()'''# 判断是否碰到边缘if snake.head[0] > 620 or snake.head[0] < 0:breakif snake.head[1] > 460 or snake.head[1] < 0:break# 移动头部和身体snake.move_head()snake.move_snake()# 绘制游戏界面sc.fill(violet)snake.draw_me()food.draw_me()sc.blit(len_text ,(50,20))pygame.display.update()# 控制游戏速度time_clock.tick(3)
# 动手实践-GAME OVER
len_text = font.render("GAME OVER",True,red)
sc.blit(len_text ,(200,200))
pygame.display.update()
input()
代码注释
# 判断是否碰到边缘,这是判断小蛇是否移动出窗口的外面,否则就停止游戏
if snake.head[0] > 620 or snake.head[0] < 0:break
if snake.head[1] > 460 or snake.head[1] < 0:break
sc.fill(violet):游戏背景颜色,可以自己更换
time_clock.tick(3): 控制游戏速度 控制游戏速度,越大越快
5、完整版代码:
import pygame, random,os
os.environ["SDL_VIDEO_WINDOW_POS"]="100,100"
# 初始化
pygame.init()
# 定义一个变量来控制速度
time_clock = pygame.time.Clock()# 创建窗口,定义标题
sc = pygame.display.set_mode((640, 480))
pygame.display.set_caption("贪吃蛇")
# 实例化字体对象
font = pygame.font.SysFont("宋体", 48 , True)
# 定义颜色
pink = (255, 182, 193)
violet = (238,130,238)
white = (255, 255, 255)
green = (0,255,0)
red = (255,0,0)
class Snake():def __init__(self):self.direction = "right"# 定义一个贪吃蛇的长度列表,其中有几个元素就代表有几段身体self.body = [[100, 100], [80, 100]]self.head = list(self.body[0]) # 蛇头位置def draw_me(self):# 绘制身体for b in self.body:pygame.draw.rect(sc, green, (b[0], b[1], 20, 20))def move_head(self):# 根据方向移动蛇头if self.direction == "right":self.head[0] += 20elif self.direction == "left":self.head[0] -= 20elif self.direction == "up":self.head[1] -= 20elif self.direction == "down":self.head[1] += 20def add_body(self):self.body.insert(0, list(self.head))def cut_tail(self):self.body.pop()def move_snake(self):self.add_body()self.cut_tail()# 食物类的设计
class Food():def __init__(self):self.color=white#知识进阶-双倍奖励#self.color=random.choice([white,pink])x = random.randrange(0, 640,20)y = random.randrange(0, 480,20)self.postion = [x,y]def draw_me(self):pygame.draw.rect(sc, self.color, (self.postion[0], self.postion[1], 20, 20))def reset(self):x = random.randrange(0, 640,20)y = random.randrange(0, 480,20)self.postion = [x,y]#知识进阶-双倍奖励#self.color=random.choice([white,pink])food = Food()
snake = Snake()
while True:len_text = font.render("Length: "+str(len(snake.body)),True,red)# 从队列中获取事件for event in pygame.event.get():# 判断是否为退出事件if event.type == pygame.QUIT:pygame.quit()# 按键事件elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:if snake.direction != "left":snake.direction = "right"if event.key == pygame.K_LEFT:if snake.direction != "right":snake.direction = "left"if event.key == pygame.K_UP:if snake.direction != "down":snake.direction = "up"if event.key == pygame.K_DOWN:if snake.direction != "up":snake.direction = "down"# 判断是否吃到食物if snake.head == food.postion:food.reset()snake.add_body()'''#知识进阶-双倍奖励if food.color==white:food.reset()snake.add_body()else:food.reset()snake.add_body()snake.add_body()'''# 判断是否碰到边缘if snake.head[0] > 620 or snake.head[0] < 0:breakif snake.head[1] > 460 or snake.head[1] < 0:break# 移动头部和身体snake.move_head()snake.move_snake()# 绘制游戏界面sc.fill(violet)snake.draw_me()food.draw_me()sc.blit(len_text ,(50,20))pygame.display.update()# 控制游戏速度time_clock.tick(3)
# 动手实践-GAME OVER
len_text = font.render("GAME OVER",True,red)
sc.blit(len_text ,(200,200))
pygame.display.update()
input()
希望对大家有帮助
致力于办公自动化的小小程序员一枚#
都看到这了,关注+点赞+收藏=不迷路!!
如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!
相关文章:
pygame第6课——贪吃蛇小游戏
今天我们开始Pygame的第六课,前几节课的内容在这里【点我】,欢迎大家前去考古: 今天我们一起来学习制作一个小游戏【贪吃蛇】,这是一个非常经典的小游戏,那么我们一起开始吧 1、游戏准备工作 import pygame, random,o…...
iptables之iptables表、链、规则 、匹配模式、扩展模块、连接追踪模块(一)
一、iptables的链 1.请求到达本机: PREROUTING --> INPUT --> Local Process (本机) 2.请求经过本机: PREROUTING --> FORWARD --> POSTROUTING 3.请求从本机发出:local Process(本机…...
Mac 卸载appium
安装了最新版的appium 2.0.1,使用中各种问题,卡顿....,最终决定回退的。记录下卸载的过程 1.打开终端应用程序 2.卸载全局安装的 Appium 运行以下命令以卸载全局安装的 Appium: npm uninstall -g appium 出现报错:Error: EACCES: permiss…...
数据结构----哈夫曼树
这里写目录标题 基本概念引子基本概念各种路径长度各种带权路径长度结点的带权路径长度树的带权路径长度哈夫曼树 哈夫曼树的构造理论基础构造思想总结 哈夫曼树的实现哈夫曼编码前缀编码哈夫曼编码的思想案例代码实现 编码与解码 基本概念 引子 哈夫曼树就是寻找构造最优二叉…...
Spring之Aop切面---日志收集(环绕处理、前置处理方式)--使用/教程/实例
Spring之Aop切面---日志收集(环绕处理、前置处理方式)--使用/教程/实例 简介系统登录日志类LoginLogEntity .java 一、环绕处理方式1、自定义注解类LoginLogAop.class2、切面处理类LogoutLogAspect.java 二、前置处理方式:1、自定义注解类Log…...
UE4/UE5 照明构建失败 “Lightmass crashed”解决“数组索引越界”
在构建全局光照时,经常会出现“Lightmass crashed”的错误,导致光照构建失败。本文将分析这一问题的原因,并给出解决建议。 UE4 版本4.26 报错如下: <None> Lightmass crashed: Assertion failed: (Index > 0) & (Index < ArrayNum) [File:d:\bu…...
并发编程系列-Semaphore
Semaphore,如今通常被翻译为"信号量",过去也曾被翻译为"信号灯",因为类似于现实生活中的红绿灯,车辆是否能通行取决于是否是绿灯。同样,在编程世界中,线程是否能执行取决于信号量是否允…...
3年 Android 开发的面试心经(后悔当初没有拿 N+1)
作者:勇闯天涯 当某人顺利通过大厂面试时,总会有人认为这是运气比较好罢了,但他们不曾得知对方之前受过多少苦和委屈,又付出了多少努力一步步去突破这些困境。正是因为他们的努力付出,在合适的时间与地点,用…...
【c语言】 -- 指针进阶
📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。 c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。 本章来学习指针进阶。 让我们开启c语言学习…...
软件压力测试对软件产品起到什么作用?
一、软件压力测试是什么? 软件压力测试是一种通过模拟正常使用环境中可能出现的大量用户和大数据量的情况,来评估软件系统在压力下的稳定性和性能表现的测试方法。在软件开发过程中,经常会遇到一些性能瓶颈和稳定性问题,而软件压力测试的作…...
Stephen Wolfram:那么…ChatGPT 在做什么,为什么它有效呢?
So … What Is ChatGPT Doing, and Why Does It Work? 那么…ChatGPT在做什么,为什么它有效呢? The basic concept of ChatGPT is at some level rather simple. Start from a huge sample of human-created text from the web, books, etc. Then train…...
机器学习基础(五)
决策树 决策树是一种预测模型,它代表着对象属属性与对象值之间的一种映射关系。树中的每个节点代表一个对象,分叉路径(或者叫树枝)则代表一个属性值。 决策树常用方法: 分类树分析,是一种监督学习,用于预计结果可能为离散类型。 回归树分析,用于预计结果为实数。 CART,…...
阿里云服务器安装WordPress网站教程基于CentOS系统
阿里云百科分享使用阿里云服务器安装WordPress博客网站教程,WordPress是使用PHP语言开发的博客平台,在支持PHP和MySQL数据库的服务器上,您可以用WordPress架设自己的网站,也可以用作内容管理系统(CMS)。本教…...
【100天精通python】Day37:GUI界面编程_PyQT从入门到实战(上)
目录 专栏导读 1 PyQt6 简介: 1.1 安装 PyQt6 和相关工具: 1.2 PyQt6 基础知识: 1.2.1 Qt 的基本概念和组件: 1.2.2 创建和使用 Qt 窗口、标签、按钮等基本组件 1.2.3 布局管理器:垂直布局、水平布局、网格布局…...
数据结构—散列表的查找
7.4散列表的查找 7.4.1散列表的基本概念 基本思想:记录的存储位置域关键字之间存在对应关系 对应关系——hash函数 Loc(i) H(keyi) 如何查找: 根据散列函数 H(key) k 查找key9,则访…...
Expo项目 使用Native base UI库
装包: yarn add native-base expo install react-native-svg12.1.1 Index.js: import React from react import { View, Text } from react-native import useList from ./useList import { NativeBaseProvider, Button, Box } from native-base import styles f…...
74、75、76——tomcat项目实战
tomcat项目实战 tomcat 依赖 java运行环境,必须要有jre , 选择 jdk1.8 JvmPertest 千万不能用 kyj易捷支付 项目机器 选择 一台机器 ,安装jdk1.8的机器下载tomcat的包 上传到机器,解压tomcattomcat文件 bin文件夹: 启动文件 堆栈配置文件 catalina.sh JAVA_OPTS="-Xm…...
jmeter errstr :“unsupported field type for multipart.FileHeader“
在使用jmeter测试接口的时候,提示errstr :"unsupported field type for multipart.FileHeader"如图所示 这是因为我们 在HTTP信息头管理加content-type参数有问题 直接在HTTP请求中,勾选: use multipart/form-data for POST【中文…...
C#调用C++ DLL传参byte[]数组字节值大于127时会变为0x3f的问题解决
最近做了一个网络编程的DLL给C#调用,DLL中封装了一个TCP Client的函数接口,如下所示 //C TCP报文发送接口 int TcpClient_send(unsigned char* buffSend, unsigned int nLen) {unsigned char buff[1024];int len StringToHex(buffSend, buff);int nRet…...
【vue3+xlxs+xlsx-style-vite】vue3项目中使用xlsx插件实现Excel表格的导出和解析,已实现
在vue3项目中使用xlsx插件实现Excel表格的导出和解析 1、xlsx插件包官方 xlsx插件包官方 2、FileReader官方文档:FileReader官方文档 安装xlsx和xlsx-style-vite、file-saver npm install xlsx npm install xlsx-style-vite npm install file-saverpackage.json中查…...
用Wireshark抓包学LTE:手把手解析开机附着流程中的NAS/RRC消息
用Wireshark抓包学LTE:手把手解析开机附着流程中的NAS/RRC消息 1. LTE信令分析实战环境搭建 工欲善其事,必先利其器。在开始解析LTE信令前,我们需要搭建专业的分析环境。不同于传统教材的理论讲解,我们将从工程师视角构建完整的分…...
TranslateGemma部署避坑指南:常见问题与解决方案
TranslateGemma部署避坑指南:常见问题与解决方案 1. 部署前的硬件准备 1.1 显卡配置要求 TranslateGemma-12B-IT模型需要两张NVIDIA RTX 4090显卡协同工作,这是由模型并行技术决定的硬性要求。实际测试中发现: 单卡尝试运行会立即报错CUD…...
SNAP小白必看:哨兵1 SLC数据预处理全流程详解(附避坑指南)
SNAP小白必看:哨兵1 SLC数据预处理全流程详解(附避坑指南) 在遥感数据处理领域,哨兵1号卫星提供的SLC(Single Look Complex)数据因其高分辨率和极化信息,成为地表监测、灾害评估等领域的重要数据…...
语言清洗令:禁用for循环的第一年——软件测试从业者的专业复盘与策略革新
2025年全球编程社区发起的“语言清洗运动”,标志着软件开发范式的重大转折。这项运动的核心是禁用传统循环语句(如for、while),以推动声明式编程的普及,减少迭代错误并提升代码可读性。作为软件测试从业者,…...
从CentOS 7迁移到Ubuntu 22.04 LTS,我整理了一份保姆级系统初始化脚本(含内核调优、换源、时区设置)
从CentOS 7迁移到Ubuntu 22.04 LTS:系统初始化与性能调优全指南 当CentOS 7走向生命周期的终点,许多运维团队正面临向新平台的战略转移。Ubuntu 22.04 LTS以其长期支持特性和活跃的社区生态,成为最受欢迎的替代选择之一。但迁移绝非简单的系统…...
LFM2.5-1.2B-Thinking-GGUF惊艳效果:复杂逻辑推理题(如数理推导)分步求解
LFM2.5-1.2B-Thinking-GGUF惊艳效果:复杂逻辑推理题(如数理推导)分步求解 1. 模型能力概览 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,专为低资源环境优化设计。这个1.2B参数的模型采用GGUF格式࿰…...
煤矿电液阀系统摄像仪护套连接器 DLJ01(1000)参数
在煤矿综采工作面液压支架电液控制系统中,摄像仪护套连接器 DLJ01(1000)作为矿用本安型摄像仪与电源、信号传输线缆之间的专用接口,承担着视频信号与供电的稳定传输任务。其型号中的“1000”代表线缆长度为1000mm(1米),…...
根据您提供的写作范围,我为您总结的标题为:“昆通泰MCGS7.7嵌入版:6车位停车场监控系统仿...
6车位停车场监控系统昆通泰MCGS7.7嵌入版仿真运行带运行效果视频6车位停车场监控系统用昆通泰MCGS7.7嵌入版做仿真,真的是新手友好型项目——不用扛硬件、不用接复杂通讯,靠内部变量和几段脚本就能把核心逻辑跑通,还能直观看到实时效果&#…...
2025年开源工具jable-download:视频下载工具高效解决方案
2025年开源工具jable-download:视频下载工具高效解决方案 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download 在数字化内容消费日益增长的今天,视频资源的获取与保存成为许多用…...
UE5场景过曝/白屏排查指南:从后期处理体积到项目设置的实战修复
1. 当UE5场景变成"雪盲症"时该怎么办? 第一次打开UE5项目看到白茫茫一片的时候,我差点以为显卡烧了。这种场景过曝现象就像在雪山没戴墨镜,所有细节都被强光吞噬。新手遇到这种情况别慌,我整理了从"急救措施"…...
