Python版《超级玛丽+源码》-Python制作超级玛丽游戏
小时候最喜欢玩的小游戏就是超级玛丽了,有刺激有又技巧,通关真的很难,救下小公主还被抓走了,唉,心累,最后还是硬着头皮继续闯,终于要通关了,之后再玩还是没有那么容易,哈哈,不知道现在能不能通关,今天就来简单实现一下。
超级玛丽

运行起来是这样的,可以简单作为试玩。

绘制金币:
class Coin(EntityBase):def __init__(self, screen, spriteCollection, x, y, gravity=0):super(Coin, self).__init__(x, y, gravity)self.screen = screenself.spriteCollection = spriteCollectionself.animation = copy(self.spriteCollection.get("coin").animation)self.type = "Item"def update(self, cam):if self.alive:self.animation.update()self.screen.blit(self.animation.image, (self.rect.x + cam.x, self.rect.y))
绘制玛丽:
spriteCollection = Sprites().spriteCollection
smallAnimation = Animation([spriteCollection["mario_run1"].image,spriteCollection["mario_run2"].image,spriteCollection["mario_run3"].image,],spriteCollection["mario_idle"].image,spriteCollection["mario_jump"].image,
)
bigAnimation = Animation([spriteCollection["mario_big_run1"].image,spriteCollection["mario_big_run2"].image,spriteCollection["mario_big_run3"].image,],spriteCollection["mario_big_idle"].image,spriteCollection["mario_big_jump"].image,
)class Mario(EntityBase):def __init__(self, x, y, level, screen, dashboard, sound, gravity=0.8):super(Mario, self).__init__(x, y, gravity)self.camera = Camera(self.rect, self)self.sound = soundself.input = Input(self)self.inAir = Falseself.inJump = Falseself.powerUpState = 0self.invincibilityFrames = 0self.traits = {"jumpTrait": JumpTrait(self),"goTrait": GoTrait(smallAnimation, screen, self.camera, self),"bounceTrait": bounceTrait(self),}self.levelObj = levelself.collision = Collider(self, level)self.screen = screenself.EntityCollider = EntityCollider(self)self.dashboard = dashboardself.restart = Falseself.pause = Falseself.pauseObj = Pause(screen, self, dashboard)def update(self):if self.invincibilityFrames > 0:self.invincibilityFrames -= 1self.updateTraits()self.moveMario()self.camera.move()self.applyGravity()self.checkEntityCollision()self.input.checkForInput()def moveMario(self):self.rect.y += self.vel.yself.collision.checkY()self.rect.x += self.vel.xself.collision.checkX()def checkEntityCollision(self):for ent in self.levelObj.entityList:collisionState = self.EntityCollider.check(ent)if collisionState.isColliding:if ent.type == "Item":self._onCollisionWithItem(ent)elif ent.type == "Block":self._onCollisionWithBlock(ent)elif ent.type == "Mob":self._onCollisionWithMob(ent, collisionState)def _onCollisionWithItem(self, item):self.levelObj.entityList.remove(item)self.dashboard.points += 100self.dashboard.coins += 1self.sound.play_sfx(self.sound.coin)def _onCollisionWithBlock(self, block):if not block.triggered:self.dashboard.coins += 1self.sound.play_sfx(self.sound.bump)block.triggered = Truedef _onCollisionWithMob(self, mob, collisionState):if isinstance(mob, RedMushroom) and mob.alive:self.powerup(1)self.killEntity(mob)self.sound.play_sfx(self.sound.powerup)elif collisionState.isTop and (mob.alive or mob.bouncing):self.sound.play_sfx(self.sound.stomp)self.rect.bottom = mob.rect.topself.bounce()self.killEntity(mob)elif collisionState.isTop and mob.alive and not mob.active:self.sound.play_sfx(self.sound.stomp)self.rect.bottom = mob.rect.topmob.timer = 0self.bounce()mob.alive = Falseelif collisionState.isColliding and mob.alive and not mob.active and not mob.bouncing:mob.bouncing = Trueif mob.rect.x < self.rect.x:mob.leftrightTrait.direction = -1mob.rect.x += -5self.sound.play_sfx(self.sound.kick)else:mob.rect.x += 5mob.leftrightTrait.direction = 1self.sound.play_sfx(self.sound.kick)elif collisionState.isColliding and mob.alive and not self.invincibilityFrames:if self.powerUpState == 0:self.gameOver()elif self.powerUpState == 1:self.powerUpState = 0self.traits['goTrait'].updateAnimation(smallAnimation)x, y = self.rect.x, self.rect.yself.rect = pygame.Rect(x, y + 32, 32, 32)self.invincibilityFrames = 60self.sound.play_sfx(self.sound.pipe)def bounce(self):self.traits["bounceTrait"].jump = Truedef killEntity(self, ent):if ent.__class__.__name__ != "Koopa":ent.alive = Falseelse:ent.timer = 0ent.leftrightTrait.speed = 1ent.alive = Trueent.active = Falseent.bouncing = Falseself.dashboard.points += 100def gameOver(self):srf = pygame.Surface((640, 480))srf.set_colorkey((255, 255, 255), pygame.RLEACCEL)srf.set_alpha(128)self.sound.music_channel.stop()self.sound.music_channel.play(self.sound.death)for i in range(500, 20, -2):srf.fill((0, 0, 0))pygame.draw.circle(srf,(255, 255, 255),(int(self.camera.x + self.rect.x) + 16, self.rect.y + 16),i,)self.screen.blit(srf, (0, 0))pygame.display.update()self.input.checkForInput()while self.sound.music_channel.get_busy():pygame.display.update()self.input.checkForInput()self.restart = Truedef getPos(self):return self.camera.x + self.rect.x, self.rect.ydef setPos(self, x, y):self.rect.x = xself.rect.y = ydef powerup(self, powerupID):if self.powerUpState == 0:if powerupID == 1:self.powerUpState = 1self.traits['goTrait'].updateAnimation(bigAnimation)self.rect = pygame.Rect(self.rect.x, self.rect.y-32, 32, 64)self.invincibilityFrames = 20
绘制土坯,金币盒子,动物,乌龟等的文件:
class CoinBox(EntityBase):def __init__(self, screen, spriteCollection, x, y, sound, dashboard, gravity=0):super(CoinBox, self).__init__(x, y, gravity)self.screen = screenself.spriteCollection = spriteCollectionself.animation = copy(self.spriteCollection.get("CoinBox").animation)self.type = "Block"self.triggered = Falseself.time = 0self.maxTime = 10self.sound = soundself.dashboard = dashboardself.vel = 1self.item = Item(spriteCollection, screen, self.rect.x, self.rect.y)def update(self, cam):if self.alive and not self.triggered:self.animation.update()else:self.animation.image = self.spriteCollection.get("empty").imageself.item.spawnCoin(cam, self.sound, self.dashboard)if self.time < self.maxTime:self.time += 1self.rect.y -= self.velelse:if self.time < self.maxTime * 2:self.time += 1self.rect.y += self.velself.screen.blit(self.spriteCollection.get("sky").image,(self.rect.x + cam.x, self.rect.y + 2),)self.screen.blit(self.animation.image, (self.rect.x + cam.x, self.rect.y - 1))
直接运行main.py文件就可以进入游戏了:
windowSize = 640, 480def main():pygame.mixer.pre_init(44100, -16, 2, 4096)pygame.init()screen = pygame.display.set_mode(windowSize)max_frame_rate = 60dashboard = Dashboard("./img/font.png", 8, screen)sound = Sound()level = Level(screen, sound, dashboard)menu = Menu(screen, dashboard, level, sound)while not menu.start:menu.update()mario = Mario(0, 0, level, screen, dashboard, sound)clock = pygame.time.Clock()while not mario.restart:pygame.display.set_caption("Super Mario running with {:d} FPS".format(int(clock.get_fps())))if mario.pause:mario.pauseObj.update()else:level.drawLevel(mario.camera)dashboard.update()mario.update()pygame.display.update()clock.tick(max_frame_rate)return 'restart'if __name__ == "__main__":exitmessage = 'restart'while exitmessage == 'restart':exitmessage = main()
需要游戏素材,和完整代码,可在下方图片获取,备注:超级玛丽 即可获取,长期有效。

相关文章:
Python版《超级玛丽+源码》-Python制作超级玛丽游戏
小时候最喜欢玩的小游戏就是超级玛丽了,有刺激有又技巧,通关真的很难,救下小公主还被抓走了,唉,心累,最后还是硬着头皮继续闯,终于要通关了,之后再玩还是没有那么容易,哈…...
互联网私有IP地址列表
最近因为业务需要,要判断用户的IP是否私有IP, 以前知道的私有IP,基本上只有如下几个(注意:这不是正确答案): 10.0.0.0/8(10.0.0.0-10.255.255.255)172.16.0.0/12(172.16.0.0-172.31…...
光伏项目管理软件为什么那么多光伏人在用?
在光伏行业迅速发展的今天,光伏项目管理软件已成为众多光伏从业者不可或缺的得力助手。那么,为何这款软件能够受到如此广泛的青睐和应用呢? 一、提高项目管理效率 光伏项目管理软件通过数字化、智能化的手段,对光伏项目的各个环节…...
《AOP实战》— 自定义注解
承接上文(传送门 —>《面试必考》 — AOP-CSDN博客),在被面试官拷打的时候,会被问到一个致命问题:“你了解aop吗?有具体的使用经验吗?” 你:......... 言尽于此,此篇…...
微前端架构下的单页应用实现策略
随着Web应用的复杂性日益增加,传统的多页应用(MPA)模式已经难以满足现代Web开发的需求。单页应用(SPA)以其流畅的用户体验和高效的页面加载速度,逐渐成为Web开发的主流模式。然而,在微前端架构下…...
JWT(JSON Web Token)工作原理及特点
JWT定义 概念:JWT是一种开放标准(RFC 7519),用于在网络上安全传输信息,常用于身份验证。比喻:类似于电子通行证,包含用户身份信息,用于身份验证和享受服务。 JWT组成部分 头部&am…...
【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等
程序员养生指南之 【体检】程序人生之健康检查,全身体检项目分类,五大传染病普筛,基因检测等 文章目录 一、全身体检与预防疫苗(年检)1、实验室检测:生化全套检查2、医技检查:辅助诊疗科室3、科…...
汇编语言中的指令锁定:解锁高效并发编程
标题:汇编语言中的指令锁定:解锁高效并发编程 在汇编语言的微观世界中,指令锁定(Instruction Locking)是一种确保数据一致性和操作原子性的关键机制。通过使用特定的lock前缀,开发者可以告诉CPU在执行多处…...
《人工智能时代:金融投资决策的潜在系统性风险及防范策略》
在当今数字化飞速发展的时代,人工智能(AI)在金融领域的应用日益广泛,特别是在投资决策方面展现出了巨大的潜力。然而,随着其影响力的不断扩大,我们也必须警惕潜在的系统性风险。 人工智能在金融投资决策中…...
MT7621+MT7915(MT7905)+MT7975 (W7621A6G-SDK)编译固件与升级固件方法
一、搭建开发环境,编译固件。 1、安装在Ubuntu 14.04.5 x86_64系统后,然后安装下面命令行。 $ sudo apt-get install git g make libncurses5-dev subversion libssl-dev gawk libxml-parser-perl unzip wget python xz-utils vim zlibc zlib1g zlib1g…...
[php:\\filter]
写入 #题目 <?php $filename$_GET[filename]; $content$_POST[content]; file_put_contents($filename,<?php exit();.$content); highlight_file(__FILE__); ?> 源码如上,需要再服务器上写入一句话木马 payload如下: #<?php phpinf…...
Linux-环境变量
文章目录 第6章 Linux 环境变量6.1 环境变量简介?6.2 全局变量6.3 局部环境变量6.4 设置用户自定义变量6.4.1 设置局部用户自定义变量6.4.2 设置全局环境变量6.4.3 删除环境变量 6.5 默认的shell环境变量6.6 设置PATH环境变量6.7 定位系统环境变量6.7.1 登录shell6.…...
DISCUZ论坛中 “阅读权限10“这几个字的修改教程以及后台目录路径修改后的管理路径
第一篇:修改“阅读权限10”这几个字 首先找到目录: source\language\lang_message.php 找到这个文件 查找: thread_nopermission 首发地址:玖毅论坛 第二篇:后台管理路径 看到好多人在网上问discuz管理路径怎么…...
springboot 整合spring-boot-starter-data-elasticsearch
依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency> 配置 spring:elasticsearch:rest:uris: "http://localhost:9200" # Elastics…...
Element UI中el-dialog作为子组件如何由父组件控制显示/隐藏~
1、这里介绍的是将el-dialog作为组件封装便于复用,如何通过父组件控制子组件dialog的显示与隐藏。 2、思路:首先el-dialog是通过dialogVisible的值是否为true或false来控制显示与隐藏的。那么我们可以通过父传子props来将true(即showFlag的值࿰…...
【vue讲解:es6导入导出语法、 vue-router简单使用、登录跳转案例、scoped的使用、elementui使用】
1 es6导入导出语法 # 做项目:肯定要写模块--》导入使用# 默认导出和导入 在某个js中 # 命名导出和导入1.1 默认导出和导入 // #########导出语法########### // export default name // 只导出变量 // export default add // 只导出函数// export default {nam…...
#beego的orm一直引入失败#
在导入beego的orm的时候,一直导入失败,orm显示红色,表示导入失败 解决办法: 1:升级go,由1.7升级到1.8 2:执行以下命令 go clean go get github.com/astaxie/beego/orm go mod tidy go mod vendor 3:测试在vendor中可以看到…...
Vue插值:双大括号标签、v-text、v-html、v-bind 指令
创建应用程序实例后,需要通过插值进行数据绑定。数据绑定是 Vue.js 最核心的一个特性。建立数据绑定后,数据和视图会相互关联,当数据发生变化时,视图会自动进行更新。这样就无须手动获取 DOM 的值,使代码更加简洁&…...
实验五之用Processing绘画
1.案例代码如下: import generativedesign.*; import processing.pdf.*; import java.util.Calendar; Tablet tablet; boolean recordPDF false; float x 0, y 0; float stepSize 5.0; PFont font; String letters "Sie hren nicht die folgenden Gesnge…...
Apache CloudStack Official Document 翻译节选(七)
关于 Apache CloudStack 的 最佳实践 (一) Best Practices 部署Apache CloudStack是极具挑战性的,在整个部署过程中需要你做出形形色色的技术性选择。Apache CloudStack的配置条目是相当灵活的,这是因为在组合和配置具体条目时有…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
