使用Python+pygame实现贪吃蛇小游戏
使用Python+pygame贪吃蛇小游戏
使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520
给出两种实现。
第一种
运行效果如下:

游戏源码如下:
import pygame
import sys
import random# 初始化pygame
pygame.init()# 设置屏幕大小
screen_size = (640, 480)
screen = pygame.display.set_mode(screen_size)# 设置游戏标题
pygame.display.set_caption("贪吃蛇:按p键暂停/继续")# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)# 蛇的初始位置
snake_pos = [[100, 100], [80, 100], [60, 100]]# 食物的初始位置
food_pos = [300, 300]# 蛇的初始速度
snake_speed = [20, 0]# 初始化分数
score = 0# 创建字体对象
font = pygame.font.Font(None, 36)# 游戏暂停标志
paused = False# 主循环
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_p: # 按 P 键暂停或继续paused = not pausedif not paused:if event.key == pygame.K_UP and snake_speed != [0, 20]:snake_speed = [0, -20]elif event.key == pygame.K_DOWN and snake_speed != [0, -20]:snake_speed = [0, 20]elif event.key == pygame.K_LEFT and snake_speed != [20, 0]:snake_speed = [-20, 0]elif event.key == pygame.K_RIGHT and snake_speed != [-20, 0]:snake_speed = [20, 0]if not paused:# 更新蛇的位置snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])# 检查蛇头是否碰到墙壁,如果是则“经过墙壁”if snake_pos[0][0] < 0:snake_pos[0][0] = screen_size[0]-20elif snake_pos[0][0] >= screen_size[0]:snake_pos[0][0] = 0elif snake_pos[0][1] < 0:snake_pos[0][1] = screen_size[1]-20elif snake_pos[0][1] >= screen_size[1]:snake_pos[0][1] = 0# 检查蛇头是否碰到食物if snake_pos[0] == food_pos:food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]score += 1 # 计分else:snake_pos.pop()# 绘制游戏界面screen.fill(WHITE)for pos in snake_pos:pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))# 显示得分score_text = font.render("Score: " + str(score), True, (0, 0, 0))screen.blit(score_text, (10, 10))# 如果游戏暂停,则显示暂停提示if paused:pause_text = font.render("Paused. Press P to continue.", True, (0, 0, 0))screen.blit(pause_text, (screen_size[0] // 2 - pause_text.get_width() // 2, screen_size[1] // 2 - pause_text.get_height() // 2))pygame.display.flip() # 更新屏幕显示# 控制游戏速度pygame.time.Clock().tick(6)
第二种
就不给出运行效果图了,你可以运行看看。
下面给出另一种实现源码:
import pygame
import time
import random# 设置蛇的速度
snake_speed = 15# 窗口颜色
white = pygame.Color(255, 255, 255)# 蛇的颜色
green = pygame.Color(0, 255, 0)# 食物的颜色
red = pygame.Color(255, 0, 0)# 初始化pygame
pygame.init()# 初始化游戏窗口
window = pygame.display.set_mode((720, 480))# FPS(帧率)控制器
fps = pygame.time.Clock()# 定义蛇的默认位置
snake_position = [100, 50]# 定义蛇身体的前四个块
snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]# 食物位置
food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]# 蛇吃到食物时
food_spawn = True# 设置默认的蛇的方向为向右
direction = 'RIGHT'# 初始分数
score = 0def game_over():# 设置字体以显示分数#font = pygame.font.SysFont(None, 26) font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 26) #显示中文文字score_text = font.render('得分: ' + str(score), True, green)window.blit(score_text, [320, 240])# 显示信息again_text = font.render('游戏结束!按任意键重新开始', True, red) # 修改颜色变量为whitewindow.blit(again_text, [160, 280])pygame.display.flip() # 使用 flip() 来更新整个屏幕# 等待用户按键然后重新开始游戏waiting_for_input = Truewhile waiting_for_input:for event in pygame.event.get():if event.type == pygame.KEYDOWN:waiting_for_input = Falseelif event.type == pygame.QUIT:pygame.quit()quit()# 游戏重新开始main()# 游戏的主逻辑
def main():global direction, food_position, food_spawn, score# 重置游戏score = 0snake_position = [100, 50]snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]direction = 'RIGHT'food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]food_spawn = Truewhile 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 and direction != 'DOWN':direction = 'UP'if event.key == pygame.K_DOWN and direction != 'UP':direction = 'DOWN'if event.key == pygame.K_LEFT and direction != 'RIGHT':direction = 'LEFT'if event.key == pygame.K_RIGHT and direction != 'LEFT':direction = 'RIGHT'# 移动蛇if direction == 'UP':snake_position[1] -= 10if direction == 'DOWN':snake_position[1] += 10if direction == 'LEFT':snake_position[0] -= 10if direction == 'RIGHT':snake_position[0] += 10# 蛇身体增长机制snake_body.insert(0, list(snake_position))if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:score += 1food_spawn = Falseelse:snake_body.pop()if not food_spawn:food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]food_spawn = True# 图形界面window.fill(white)for pos in snake_body:pygame.draw.rect(window, green, pygame.Rect(pos[0], pos[1], 10, 10))pygame.draw.rect(window, red, pygame.Rect(food_position[0], food_position[1], 10, 10))# 游戏结束条件if snake_position[0] < 0 or snake_position[0] > 710 or snake_position[1] < 0 or snake_position[1] > 470:game_over()break # 结束游戏后跳出循环for block in snake_body[1:]:if snake_position[0] == block[0] and snake_position[1] == block[1]:game_over()break # 结束游戏后跳出循环# 更新显示pygame.display.update()# 每秒帧数/刷新率fps.tick(snake_speed)# 运行主函数
if __name__ == "__main__":main()
OK!
相关文章:
使用Python+pygame实现贪吃蛇小游戏
使用Pythonpygame贪吃蛇小游戏 使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 给出两种实现。 第一种 运行效果如下: 游戏源码如下: import pygame import sy…...
SpringBoot 全局异常统一处理:BindException(绑定异常)
概述 在Spring Boot应用中,数据绑定是一个至关重要的环节,它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到任何问题,如参数缺失、类型不匹配或验证失败等,Spring MVC将会抛出一个org.springframewo…...
ucloud轻量云(wordpress)配置ssl
ucloud 轻量云(wordpress)配置ssl 1、上传ssl证书到/usr/local/software/apache/conf,这里的文件名和内容与ucloud控制台下载下来的文件名和内容保持一致 2、修改httpd.conf文件 vim /usr/local/software/apache/conf/httpd.conf 找到下面两行,去掉注…...
电脑/设备网络共享给其他设备上网
文章目录 一、概述二、设置网络共享2.1 电脑可以上网,通过网络共享让其他设备也可以上网2.2 手机如何使用USB数据线共享网络给电脑 一、概述 现在有如下几种情况: 设备本身不能上网,需要通过电脑上网 笔记本WIFI连热点上网,然后…...
vue之虚拟滚动
一、解决的问题 对于大量数据的懒加载,我们可以使用虚拟滚动的技术。虚拟滚动的原理是只渲染可视区域内的数据,当用户滚动时,动态计算并渲染新的可视数据,从而实现大数据量的流畅滚动。 在Vue中,我们可以使用第三方库…...
Redis学习指南(11)-Redis的有序集合数据类型介绍
文章目录 特点和用途常用命令插入操作查询操作删除操作 示例总结 Redis的有序集合数据类型是一种高效的数据结构,能够存储多个成员和对应的分值,并能够根据分值进行快速的查找、插入和删除操作。本文将详细介绍Redis的有序集合数据类型,包括其…...
Spring的纯注解配置
1.环境搭建 1.1.创建工程 1.2.待改造的问题 我们发现,之所以我们现在离不开xml配置文件,是因为我们有一处很关键的配置,如果他要也能用注解配置,那么我们就可以脱离xml文件了: 1.2.1.jdbc配置 <context:propert…...
numpy 筛选多段数据
目录 掩码方式 利用切片 掩码方式 range_to_remove list(range(77-1, 111-1)) list(range(122-1, 135-1))keep_mask np.ones(image0_cut.shape[0], dtypebool)keep_mask[range_to_remove] Falseprocessed_data image0_cut[keep_mask] 利用切片 import numpy as np# 假设…...
【Kotlin】协程的字节码原理
前言 协程是Koltin语言最重要的特性之一,也是最难理解的特性。网上关于kotlin协程的描述也是五花八门,有人说它是轻量级线程,有人说它是无阻塞式挂起,有人说它是一个异步框架等等,众说纷芸。甚至还有人出了书籍专门介…...
区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测
区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现…...
基于深度学习的实例分割的Web应用
基于深度学习的实例分割的Web应用 1. 项目简介1.1 模型部署1.2 Web应用 2. Web前端开发3. Web后端开发4. 总结 1. 项目简介 这是一个基于深度学习的实例分割Web应用的项目介绍。该项目使用PaddlePaddle框架,并以PaddleSeg训练的图像分割模型为例。 1.1 模型部署 …...
20240115如何在线识别俄语字幕?
20240115如何在线识别俄语字幕? 2024/1/15 21:25 百度搜索:俄罗斯语 音频 在线识别 字幕 Bilibili:俄语AI字幕识别 音视频转文字 字幕小工具V1.2 BING:音视频转文字 字幕小工具V1.2 https://www.bilibili.com/video/BV1d34y1F7…...
Flink 处理函数(1)—— 基本处理函数
在 Flink 的多层 API中,处理函数是最底层的API,是所有转换算子的一个概括性的表达,可以自定义处理逻辑 在处理函数中,我们直面的就是数据流中最基本的元素:数据事件(event)、状态(st…...
Linux系统下编译MPlayer
一、编译MPlayer 在 http://www.mplayerhq.hu/design7/dload.html 下载MPlayer源码 执行命令: tar -xf MPlayer-1.5.tar.xz cd MPlayer-1.5 ./configure --prefix$(pwd)/install --yasm make make install 然后在install/bin目录下即会生成mplayer的可执行文件 二…...
事务的ACID属性是什么?为什么它们很重要?
引言 在现代的数据库和事务处理系统中,事务处理是一项非常重要的技术。在数据库中,事务是指一组被视为单个逻辑操作单元的SQL语句序列,它们要么全部成功执行,要么全部不执行。事务可以确保数据库在执行时保持一致性和可靠性。ACI…...
计算机毕业设计 基于Java的手机销售网站的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Redis相关命令详解及其原理
Redis概念 Redis,英文全称是remote dictionary service,也就是远程字典服务。这是kv存储数据库。Redis,包括所有的数据库,都是请求-回应模式,通俗来说就是数据库不会主动地要给前台推送数据,只有前台发送了…...
go语言中的GoMock
GoMock是一个Go框架。它与内置的测试包整合得很好,并在单元测试时提供了灵活性。正如我们所知,对具有外部资源(数据库、网络和文件)或依赖关系的代码进行单元测试总是很麻烦。 安装 为了使用GoMock,我们需要安装gomo…...
DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS (Paper reading)
DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS Zhifeng Kong, Computer Science and Engineering, UCSD, ICLR2021, Code, Paper 1. 前言 在这项工作中,我们提出了DiffWave,这是一种用于条件和无条件波形生成的多功能扩散概率模型。该模…...
排序算法8----归并排序(非递归)(C)
1、介绍 归并排序既可以是内排序(在内存上的数据排序),也可以是外排序(磁盘上)(硬盘)(在文件中的数据排序)。 其他排序一般都是内排序。 区别于快速排序的非递归…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
