Pygame中Sprite实现逃亡游戏5
在《Pygame中Sprite实现逃亡游戏4》中通过碰撞检测实现了玩家、飞龙与飞火之间的碰撞处理,基本上实现了逃亡功能。最后,实现这个逃亡游戏中文字提示的功能。
1 操作提示
当进入游戏后,会在玩家下方的位置给出操作提示,如图1所示。

图1 显示操作提示
1.1 定义字体
要在屏幕中显示提示信息,必须首先定义字体,代码如图2所示。
![]()
图2 定义字体代码
其中,通过pygame.font模块中的Font()类定义字体变量font,第一个参数表示字体文件,也可以用None表示使用默认字体;第二个参数表示字体大小。
相关链接1 pygame.font.Font()类的详细使用方法请参考《Pygame显示文字》
1.2 定义显示信息的函数
接下来自定义一个函数用来显示指定信息,代码如图3所示。

图3 自定义函数代码
其中,第76行代码中自定义了一个名为print_text()的函数,该函数的font参数表示使用的字体,x和y参数表示显示信息的位置(横坐标和纵坐标),text表示显示的内容,color表示字体的颜色,默认为白色;第77-78行代码的作用是根据位置、内容和颜色显示指定信息。
相关链接2 显示信息的详细使用方法请参考《Pygame显示文字》
1.3 显示操作提示
在while True的内部,使用图4所示代码显示操作提示信息。
![]()
图4 显示操作提示的代码
从图4中可以看出,调用自定义函数print_text(),使用font字体在(350,560)这个位置上显示“Press SPACE to jump”信息。
注意1 图4所示的代码必须在group.draw(screen)代码之后。
2 玩家获胜提示
当飞龙被飞火击退到屏幕最左侧时,玩家获胜,如图5所示。

图5 玩家获胜
2.1 玩家获胜的判断
判断玩家获胜的代码在while True循环中,如图6所示。

图6 判断玩家获胜的代码
第155行代码的含义是当飞龙的横坐标小于-50,也就是飞龙被飞火打到屏幕左侧的一定位置处,表示玩家获胜,此时将获胜标志you_win设置为True,游戏结束表示game_over也设置为True。
注意2 获胜标志you_win初始值是False。
2.2 获胜信息的显示
当飞龙被击退到屏幕左侧某个位置时,显示玩家获胜信息,代码如图7所示。

图7 玩家获胜或失败信息显示的代码
其中,第163行代码判断游戏是否结束(触发游戏结束的条件有两个:玩家获胜或者玩家失败);第164行代码调用自定义函数print_text()显示“GAME OVER”,第165-168行代码对玩家获胜或者玩家失败进行判断,如果you_win的值是True则表示玩家获胜,否则表示玩家失败,则分别调用print_text()显示成功或失败的信息。
3 玩家失败信息提示
当飞龙抓到玩家,则玩家失败。飞龙抓到玩家的代码在《Pygame中Sprite实现逃亡游戏4》中已实现,此时game_over为True,you_win为False,根据图7所示代码,显示玩家失败的信息,效果如图8所示。

图8 显示玩家失败信息
4 完整代码
import pygame
import os
import time
import random
from pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, target):pygame.sprite.Sprite.__init__(self) #extend the base Sprite classself.master_image = Noneself.frame = 0self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0self.last_frame = 0self.columns = 1self.last_time = 0#X propertydef _getx(self):return self.rect.xdef _setx(self,value):self.rect.x = valueX = property(_getx,_setx)#Y propertydef _gety(self):return self.rect.ydef _sety(self,value):self.rect.y = valueY = property(_gety,_sety)#position propertydef _getpos(self):return self.rect.topleftdef _setpos(self,pos):self.rect.topleft = posposition = property(_getpos,_setpos)def load(self, filename, width, height, columns):self.master_image = pygame.image.load(filename).convert_alpha()self.frame_width = widthself.frame_height = heightself.rect = Rect(0,0,width,height)self.columns = columns#try to auto-calculate total framesrect = self.master_image.get_rect()self.last_frame = (rect.width // width) * (rect.height // height) - 1def update(self, current_time, rate=30):#update animation frame numberif current_time > self.last_time + rate:self.frame += 1if self.frame > self.last_frame:self.frame = self.first_frameself.last_time = current_time#build current frame only if it changedif self.frame != self.old_frame:frame_x = (self.frame % self.columns) * self.frame_widthframe_y = (self.frame // self.columns) * self.frame_heightrect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)self.image = self.master_image.subsurface(rect)self.old_frame = self.framedef __str__(self):return str(self.frame) + "," + str(self.first_frame) + \"," + str(self.last_frame) + "," + str(self.frame_width) + \"," + str(self.frame_height) + "," + str(self.columns) + \"," + str(self.rect)def reset_arrow():y = random.randint(250,350)arrow.position = 800,ydef print_text(font, x, y, text, color=(255,255,255)):imgText = font.render(text, True, color)screen.blit(imgText, (x,y))pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption('Escape The Dragon Game')
font = pygame.font.Font('1.ttf', 18)
framerate = pygame.time.Clock()group = pygame.sprite.Group()
player = MySprite(screen)
player.load('caveman.png', 50, 64, 8)
player.first_frame = 1
player.last_frame = 7
player.position = 400, 303
group.add(player)bg = pygame.image.load('background.png').convert_alpha()#create the dragon sprite
dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
dragon.position = 100, 230
group.add(dragon)#create the arrow sprite
arrow = MySprite(screen)
arrow.load("flame.png", 40, 16, 1)
arrow.position = 800,320
group.add(arrow)game_over = False
arrow_vel = 8.0
player_jumping = False
you_win = False
jump_vel = 0.0
player_start_y = player.Y
while True:framerate.tick(30)ticks = pygame.time.get_ticks()for event in pygame.event.get():if event.type == QUIT:pygame.quit()os.sys.exit()keys = pygame.key.get_pressed()if keys[K_ESCAPE]:pygame.quit()os.sys.exit()elif keys[K_SPACE]:if not player_jumping:player_jumping = Truejump_vel = -8.0#update the arrowif not game_over:arrow.X -= arrow_velif arrow.X < 0:reset_arrow()if player_jumping:player.Y += jump_veljump_vel += 0.5if player.Y > player_start_y:player.Y = player_start_yplayer_jumping = Falsejump_vel = 0.0if pygame.sprite.collide_rect(arrow, player):reset_arrow()player.X -= 10if pygame.sprite.collide_rect(arrow, dragon):reset_arrow()dragon.X -= 10if pygame.sprite.collide_rect(player, dragon):game_over = Trueif dragon.X < -50:you_win = Truegame_over = Truescreen.blit(bg, (0,0))group.update(ticks, 50)group.draw(screen)print_text(font, 350, 560, "Press SPACE to jump!")if game_over:print_text(font, 360, 100, "G A M E O V E R")if you_win:print_text(font, 330, 130, "YOU BEAT THE DRAGON!")else:print_text(font, 330, 130, "THE DRAGON GOT YOU!")pygame.display.update()
相关文章:
Pygame中Sprite实现逃亡游戏5
在《Pygame中Sprite实现逃亡游戏4》中通过碰撞检测实现了玩家、飞龙与飞火之间的碰撞处理,基本上实现了逃亡功能。最后,实现这个逃亡游戏中文字提示的功能。 1 操作提示 当进入游戏后,会在玩家下方的位置给出操作提示,如图1所示…...
等保2.0数据库测评之达梦数据库测评
一、达梦数据库介绍 达梦数据库管理系统属于新一代大型通用关系型数据库,全面支持 ANSI SQL 标准和主流编程语言接口/开发框架。行列融合存储技术,在兼顾 OLAP 和 OLTP 的同时,满足 HTAP 混合应用场景。 本次安装环境为Windows10专业版操作…...
集成mcuboot后测试和验证的方法
本文介绍一些在实际项目中集成的 MCUboot后测试和验证的方法和步骤: 功能测试 启动测试 正常启动验证 : 多次上电启动设备,观察 MCUboot 是否能够正常加载并跳转到应用程序。检查启动过程中的日志输出(如果有)&#…...
Vulhub zico 2靶机详解
项目地址 https://download.vulnhub.com/zico/zico2.ova实验过程 将下载好的靶机导入到VMware中,设置网络模式为NAT模式,然后开启靶机虚拟机 使用nmap进行主机发现,获取靶机IP地址 nmap 192.168.47.1-254根据对比可知Zico 2的一个ip地址为…...
宠物医院微信小程序源码
文章目录 前言研究背景研究内容一、主要技术?二、项目内容1.整体介绍(示范)2.系统分析3.数据表信息4.运行截图5.部分代码介绍 总结 前言 随着当代社会科技的迅速发展,计算机网络时代正式拉来帷幕,它颠覆性的影响着社会…...
[教程]Crystal源码下载及编译
描述: 随着 Crystal Source 代码的更新,用于构建源代码和编译它们的指南已经过时,这导致了很多混淆和寻求帮助。 本指南将是一个完整的分步指南,从下载 Visual Studio 到启动到您的服务器。 此外,请确保下载此存储库中…...
【Android 14源码分析】WMS-窗口显示-流程概览与应用端流程分析
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...
双指针---(部分地更新)
双指针 复写零 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。 …...
【Windows】自定义显示器的分辨率
背景 由于本人更新驱动导致2个显示器里面,有一个显示器的分辨率只剩下2个可以调节 这样就导致2个显示器分辨率不同,更新了多次驱动都修复不了,所以想着看能不能自定义分辨率 工具下载 显示器自定义分辨率工具 或者百度搜索 Custom Resolu…...
组播基础-2-IGMP协议
文章目录 IGMPIGMPv1IGMPv2IGMPv3IGMP总结IGMP Snooping IGMP 运行于主机和路由器之间 因特网组管理协议,TCP/IP 协议族中负责 IP 组播成员管理的协议,用来在接收者与其他直接相邻的组播路由器之间建立、维护组播组成员关系 负责组播成员管理…...
基于Springboot+Vue的视频点播系统设计与实现登录 (含源码数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…...
执行力怎么培养?
执行力怎么培养? 并行:适合在初期养成习惯,不抱对结果的期望天才就是强迫症:适合中期修身:适合高级 并行:适合在初期养成习惯,不抱对结果的期望 在你开始做任何事情的时候,不要一开…...
Power apps:一次提交多项申请
1、添加一个Form,导入sharepoint列表,添加确认,继续,取消按钮 2、在页面的onvisible属性中添加 Set(applynumber,Last(付款申请表).申请编号1); #定义一个申请编号变量,每次申请,就将列表最后一个…...
Oracle数据库物理结构操作管理
实验步骤 (1)查询数据库初始化参数中参数名包含sga的参数的名称、值和描述信息。 SQL> select name,value,description from V$PARAMETER where name like %sga%; (2)设置sga_max_size的大小为1G SQL> alter system set sg…...
Python自然语言处理之spacy模块介绍、安装与常见操作案例
文章目录 spacy模块介绍安装spacy常见操作案例及代码1. 加载模型并处理文本2. 词性标注3. 命名实体识别4. 依存句法分析5. 可视化(在Jupyter Notebook中) spacy模块介绍 spacy是一个强大的Python库,用于自然语言处理(NLP…...
DSPy101
DSPy 介绍 DSPy(Declarative Self-improved Language Programs in Python) 是一个用于系统化和增强在流水线内使用语言模型的框架,它通过数据驱动和意图驱动的系统来优化大型语言模型(LLM)的使用。 DSPy 的核心是模块…...
网格交易策略:从原理、应用到实战Python回测
01 引言 随着金融市场的快速发展,量化交易成为投资者追求收益的一种重要手段。在众多的量化交易策略中,网格交易策略(Grid Trading Strategy)因其简单易用、风险控制灵活等优点而备受青睐。网格交易策略的核心思想是“低买高卖”&…...
软考论文《论大数据处理架构及其应用》精选试读
论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型…...
fatfs API使用手册
配置 /*---------------------------------------------------------------------------/ / Configurations of FatFs Module /---------------------------------------------------------------------------*/#define FFCONF_DEF 80286 /* Revision ID *//*---------------…...
9.23作业
仿照string类,自己手动实现 My_string 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_H #include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; …...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
