python快速实现简易超级玛丽小游戏

news2024/11/24 16:44:28

《超级玛丽》是一款超级马里奥全明星的同人作品,也是任天堂公司出品的著名横版游戏。

《超级马里奥》是一款经典的像素冒险过关游戏。最早在红白机上推出,有多款后续作品,迄今多个版本合共销量已突破4000万套。其中的主角马里奥、路易、碧琪公主、奇诺比奥等等已成为任天堂的招牌人物。主角马里奥日文原名マリオ,英文译作Mario,在译成中文时因时代不同,华语圈地区不同而译作"马力欧""玛丽"等情况也确有存在。根据任天堂公布的官方中文译名和牛津词典,一般称为"马里奥"。 

完整代码如下:

import numpy as np
import random, sys
import pgzrun
class Brick(Actor):
    def react(self):
        if np.abs(mario.center[1]+mario.size[1]/2-self.center[1]+self.size[1]/2)<15: # z gory
            mario.vy = 0
            mario.bottom = self.top
        elif np.abs(mario.center[1]-mario.size[1]/2-self.center[1]-self.size[1]/2)<15: # z dolu
            mario.vy = 0
            mario.top = self.bottom
        elif np.abs(mario.center[0]+mario.size[0]/2-self.center[0]+self.size[0]/2)<15: # z prawej
            moveall(6)
        elif np.abs(mario.center[0]-mario.size[0]/2-self.center[0]-self.size[0]/2)<15: # z lewej
            moveall(-6)
    def move(self):
        pass

class Coin(Actor):
    def react(self):
        if mario.colliderect(self):
            #sounds.coin.play()
            objs.remove(self)
            mario.points=mario.points+1
    def move(self):
        pass

class Block(Actor):
    def react(self):
        if np.abs(mario.center[1]+mario.size[1]/2-self.center[1]+self.size[1]/2)<15: # z gory
            mario.vy = 0
            mario.bottom = self.top
        elif np.abs(mario.center[1]-mario.size[1]/2-self.center[1]-self.size[1]/2)<15: # z dolu
            mario.vy = 0
            mario.top = self.bottom
            animate(self, pos=(self.center[0], -10000))
        elif np.abs(mario.center[0]+mario.size[0]/2-self.center[0]+self.size[0]/2)<15: # z prawej
            moveall(6)
        elif np.abs(mario.center[0]-mario.size[0]/2-self.center[0]-self.size[0]/2)<15: # z lewej
            moveall(-6)
    def move(self):
        pass

class Mushroom(Actor):
    def react(self):
        if self.colliderect(mario):
            mario.small=False
            objs.remove(self)
    def move(self):
        for obj in objs:
            if obj!=self and self.colliderect(obj) and not obj.image in ["bush.png","brick.png","hill.png"]:
                self.dir=-self.dir

        self.x=self.x+self.dir

        uy=self.vy
        self.vy=self.vy+2000.0*0.015
        self.y=self.y+(uy+self.vy)*0.5*0.015

        for obj in objs:
            if self.colliderect(obj) and np.abs(self.center[1]+self.size[1]/2-obj.center[1]+obj.size[1]/2)<15:
                self.vy = 0
                self.bottom = obj.top

class Question(Actor):
    def react(self):
        if np.abs(mario.center[1]+mario.size[1]/2-self.center[1]+self.size[1]/2)<15: # z gory
            mario.vy = 0
            mario.bottom = self.top
        elif np.abs(mario.center[1]-mario.size[1]/2-self.center[1]-self.size[1]/2)<15: # z dolu
            mario.vy = 0
            mario.top = self.bottom
            if self.image=="question.png":
                self.image = "question2.png"
                objs.append(Mushroom("mushroom.png",(self.center[0],self.center[1]-50)))
                objs[-1].dir=1
                objs[-1].vy=0
                animate(objs[-1],pos=(self.center[0],self.center[1]-objs[-1].size[1]+2))
        elif np.abs(mario.center[0]+mario.size[0]/2-self.center[0]+self.size[0]/2)<15: # z prawej
            moveall(6)
        elif np.abs(mario.center[0]-mario.size[0]/2-self.center[0]-self.size[0]/2)<15: # z lewej
            moveall(-6)
    def move(self):
        pass

class Cloud(Actor):
    def react(self):
        pass
    def move(self):
        self.x=(self.x-1)%7000

class Monster(Actor):
    def react(self):
        if np.abs(mario.center[1]+mario.size[1]/2-self.center[1]+self.size[1]/2)<15: # z gory
            mario.vy = 0
            mario.bottom = self.top
            animate(self, pos=(self.right+50, HEIGHT+50))
        elif np.abs(mario.center[1]-mario.size[1]/2-self.center[1]-self.size[1]/2)<15: # z dolu
            mario.vy = 0
            mario.top = self.bottom
        elif np.abs(mario.center[0]+mario.size[0]/2-self.center[0]+self.size[0]/2)<15: # z prawej
            if mario.small:
                mario.dead = True
                newgame()
            else:
                animate(self, pos=(self.right+50, HEIGHT+50))
                mario.small=True
        elif np.abs(mario.center[0]-mario.size[0]/2-self.center[0]-self.size[0]/2)<15: # z lewej
            if mario.small:
                mario.dead = True
                newgame()
            else:
                animate(self, pos=(self.right+50, HEIGHT+50))
                mario.small=True

    def move(self):
        for obj in objs:
            if obj!=self and self.colliderect(obj) and not obj.image in ["bush.png","brick.png","hill.png"]:
                self.dir=-self.dir

        if self.dir==1 and self.image in ["turtle.png","turtleleft.png"]:
            self.image = "turtle.png"
        elif self.dir==-1 and self.image in ["turtle.png","turtleleft.png"]:
            self.image = "turtleleft.png"

        self.x=self.x+self.dir

class Bush(Actor):
    def react(self):
        pass
    def move(self):
        pass

def newgame():
    mario.pos=(200,HEIGHT-120)
    mario.vy=0
    mario.time=0
    mario.dir="right"
    mario.dead=False
    mario.small=True
    mario.s="s"
    mario.points=0
    mario.win=False

    for i in range(len(objs)):
        objs.remove(objs[0])
    file = open(sys.path[0] + "\\level1.dat")

    i = 0
    for line in file:
        for j in range(len(line)):
            if line[j]=="O":
                objs.append(Brick("brick.png",(j*32,32*i)))
            elif line[j]=="B":
                objs.append(Brick("brick2.png",(j*32,32*i)))
            elif line[j]=="D":
                objs.append(Block("block.png",(j*32,32*i)))
            elif line[j]=="Q":
                objs.append(Question("question.png",(j*32,32*i)))
            elif line[j]=="c":
                objs.append(Cloud("cloud.png",(j*32,32*i)))
            elif line[j]=="h":
                objs.append(Bush("hill.png",(j*32,32*i-22)))
            elif line[j]=="b":
                objs.append(Bush("bush.png",(j*32,32*i-12)))
            elif line[j]=="E":
                objs.append(Monster("enemy1.png",(j*32,32*i)))
                objs[-1].dir = 1
            elif line[j]=="T":
                objs.append(Monster("turtle.png",(j*32,32*i)))
                objs[-1].dir = 1
            elif line[j]=="p":
                objs.append(Coin("coin.png",(j*32,32*i)))

        i = i + 1

        music.play("theme.mp3")

def draw():
    screen.fill((148, 146, 255))
    for obj in objs:
        obj.draw()
    mario.draw()
    screen.draw.text(str(mario.points),color="black",midtop=(WIDTH/8*7,10),fontsize=70,shadow=(0,0))
    if mario.win:
        screen.draw.text("You win!",color="black",midtop=(WIDTH/2,10),fontsize=170,shadow=(0,0))

def moveall(x):
    if x>0:
        if 0<=mario.x:
            mario.x=mario.x-x
        elif mario.x<0:
            mario.x=0
    else:
        if 0<=mario.x<WIDTH/2:
            mario.x=mario.x-x
        elif mario.x>WIDTH/2:
            mario.x=WIDTH/2
        elif mario.x>=WIDTH/2:
            for obj in objs:
                obj.x=obj.x+x

def move(dt):
    if mario.dir=="right":
        mario.image= mario.s + "mario.png"
    else:
        mario.image= mario.s + "marioleft.png"

    uy=mario.vy
    mario.vy=mario.vy+2000.0*dt
    mario.y=mario.y+(uy+mario.vy)*0.5*dt

    if keyboard.right:
        if mario.small:
            moveall(-2)
        else:
            moveall(-3)
        mario.dir="right"
        if mario.time<8:
            mario.image= mario.s + "mariomove.png"
        else:
            mario.image= mario.s + "mariomove2.png"
    if keyboard.left:
        if mario.small:
            moveall(2)
        else:
            moveall(3)
        mario.dir="left"
        if mario.time<8:
            mario.image= mario.s + "mariomoveleft.png"
        else:
            mario.image= mario.s + "mariomoveleft2.png"

    for obj in objs:
        if  mario.colliderect(obj):
            obj.react()

    if mario.vy !=0 and mario.dir=="right":
        mario.image= mario.s + "mariojump.png"
    elif mario.vy !=0 and mario.dir=="left":
        mario.image= mario.s + "mariojumpleft.png"

    if mario.bottom>HEIGHT:
        mario.dead = True

def update(dt):
    if mario.small:
        mario.s="s"
    else:
        mario.s=""
    mario.time=(mario.time+1)%16
    if not mario.win:
        move(dt)
        for obj in objs:
            obj.move()
            if obj.image=="castle.png":
                if np.abs(obj.center[0]-mario.center[0])<20:
                    mario.win=True
    if mario.dead:
        #music.pause()
        #sounds.gameover.play()
        #from pygame import time
        #mario.dead = False
        #time.wait(3000)
        newgame()

def on_key_down(key):
    if key==keys.SPACE and mario.vy==0:
        mario.vy=-800


HEIGHT=640
WIDTH=1024
TITLE="Mario"

mario=Actor("smario.png",(200,HEIGHT-120))
mario.vy=0
mario.time=0
mario.dir="right"
mario.dead=False
mario.small=True
mario.s="s"
mario.points=0
mario.win=False
objs = []
newgame()
pgzrun.go()

运行效果如下:

 关于项目运行的说明:

操作方式:键盘方向键左右移动,空格键跳跃

一、完整项目(游戏素材+代码)获取方式如下:

阿里云盘分享

其中music文件夹和sounds文件夹为空,music文件夹下为mp3格式的游戏背景音乐,可根据需要自行应用,放置在music文件夹下重命名为 theme 即可

如,直接在qq音乐中搜索下载游戏的经典背景音乐

sounds文件夹应该是吃金币的音效文件,暂未补充,可以将22行的代码注释以此消除吃金币时产生的闪退问题

 二、pyzrun导入失败问题

需要安装pyzero包,pip install pyzero即可

三、地图问题

地图根据项目资源中的level1.dat构建

c代表云朵,p代表金币,D代表可撞碎的方块,Q代表包含变大蘑菇的问号方块,B代表地图中帮助跳跃的不可撞碎的方块,h为小山背景,b为灌木丛背景,E为蘑菇怪敌人,T为乌龟敌人,O为地面

 对比图:

自行在level1.dat中最后部分增加的地图:

 

 

主要参考来源

Python编写超级玛丽竟如此简单?不信你试试_qianer的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计JAVAjsp闲置物品线上交易系统

[附源码]计算机毕业设计JAVAjsp闲置物品线上交易系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

tensor和numpy相互转换

tensor转成numpy b a.numpy()import torcha torch.arange(5) b a.numpy() print(a) print(type(a)) print(b) print(type(b))numpy转成tensor b torch.tensor(a)import torch import numpy as npa np.ones(5) b torch.tensor(a) print(a) print(type(a)) print(b) prin…

Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)基础入门篇 ---- 搭建环境

springcloud官方文档&#xff08;Hoxton SR5&#xff09;&#xff1a;https://cloud.spring.io/spring-cloud-static/Hoxton.SR5/reference/htmlsingle/ springcloud中文文档&#xff1a;https://www.springcloud.cc/ springcloud中国社区文档&#xff1a;http://docs.springcl…

【C++】栈~~(很详细哦)

在前几天&#xff0c;我们刚一起学过顺序表&#xff0c;链表&#xff08;无头单向不循环&#xff0c;有头双向循环&#xff09;&#xff0c;这两种都属于线性表因为是一系列存储的。而以后的哈希表则是散列表 今天我们看一下栈 目录 1.栈的介绍 2.实现 3.题目 1.栈的介绍 …

mindspore::dataset::GetAffineTransform的输出与cv2的输出不同

在使用C进行推理时用到了函数mindspore::dataset::GetAffineTransform&#xff0c;但是输入相同的数据后&#xff0c;与Python的cv2中的同名函数cv2.getAffineTransform所输出的结果不同。 C Ascend310端测试核心代码 #include <iostream> #include <vector>#…

synchronized 关键字背后的锁升级流程

文章目录前言一、基本特点二、加锁过程总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 一、基本特点 结合多线程锁的策略, 我们就可以总结出, Synchronized 具有以下特性(只考虑 J…

基于51单片机的智能台灯设计

一.硬件方案 本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。即在不改变PWM方波周期的前提下&#xff0c;利用单片机控制PWM的占空比&#xff0c;从而来改变电压的大小实现灯光亮度的调节。 当人体在台灯的范围内且环…

linux驱动设备节点失踪之迷雾围城

前言 参考文章&#xff1a;无法生成设备节点 最后证实&#xff1a;是bootargs配置错误导致的&#xff0c;不过中间发现也是可以通过mdev -s间接解决的&#xff0c;算是学习经验吧。 misc驱动框架是linux内核驱动中最简单实用的框架了。记录一下今天调试misc驱动的问题。misc驱动…

笔试强训48天——day19

文章目录一. 单选1.二分查找的时间复杂度&#xff08;&#xff09;2. 有一个单向链表中有一个A、B两个相邻元素&#xff0c;有一个指针p指向元素A&#xff0c;现将一个指针r指向的S元素要插入3. 双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点…

spark底层原理理解--高级进阶

概念概念理解和解释备注窄依赖窄依赖指1个父RDD分区数据只被1个子RDD的分区使用&#xff0c;即一对一或多对一的关系。 分为两种映射情况&#xff1a;一个父RDD的分区对应于一个子RDD的分区&#xff0c;或者多个父RDD的分区对应于一个子RDD的分区。 1个子RDD的分区对应于1个父R…

深入理解JS作用域链与执行上下文

变量提升&#xff1a; 变量提升&#xff08; hoisting &#xff09;。 我可恨的 var 关键字&#xff1a; 你读完下面内容就会明白标题的含义&#xff0c;先来一段超级简单的代码&#xff1a; <script type"text/javascript">var str Hello JavaScript hoi…

【K8S】初探Kubernetes

文章目录什么是容器编排什么是KubernetesK8s 和 Docker 之间的关系Kubernetes的整体架构Master 里的组件构成Work Node 里的组件构成总结K8s 组件工作流程结束语什么是容器编排 在《Docker 进阶指南&#xff08;下&#xff09;- 使用Docker Compose编排多个容器》文章当中&…

文件缓冲区

本期介绍&#x1f356; 主要介绍&#xff1a;什么是文件缓冲区&#xff0c;文件缓冲区存在的意义是什么&#xff0c;文件缓冲区的证明&#x1f440;。 一、什么是文件缓冲区 每一个正在使用的文件&#xff0c;操作系统都会为其在内存中开辟一块区域&#xff0c;称之为&#xff…

【数据结构】带头双向链表的简单实现

目录前言链表的实现List.hList.c**ListCreate()****LTInit()****ListPushBack()****ListPopBack()****ListPrint()****ListPushFront()****ListPopFront()****ListFind()****ListInsert()****ListErase()**ListErase()test.c前言 该篇博客主要讲解了带头双向链表的实现和一些细…

Cadence Allegro DXF结构图的导入详细教程

很多消费类板卡的结构都是异形的&#xff0c;由专业的CAD结构工程师对其进行精准的设计&#xff0c;PCB布线工程师可以根据结构工程师提供的2D图&#xff08;DWG或DXF格式&#xff09;进行精准的导入操作&#xff0c;在PCB中定义板型结构。 同时&#xff0c;对于一些工控板或者…

Ajax--跨域与JSONP--案例-淘宝搜索

要实现的UI效果 获取用户输入的搜索关键词 为了获取到用户每次按下键盘输入的内容&#xff0c;需要监听输入框的 keyup 事件&#xff0c;示例代码如下&#xff1a; // 监听文本框的 keyup 事件$(#ipt).on(keyup, function() {// 获取用户输入的内容var keywords $(this).val…

支撑向量机

1、支持向量机算法原理 支持向量机&#xff08;Support Vetor Machine&#xff0c;SVM&#xff09;由Vapnik等人于1995年首先提出&#xff0c;在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并推广到人脸识别、行人检测和文本分类等其他机器学习问题中…

HTML期末作业:基于html+css+javascript+jquery实现古诗词网页 学生网页设计作品 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

初学C语言有什么建议?

什么&#xff1f;开玩笑&#xff0c;新手学C语言&#xff1f; 确实新手不学C语言学什么呢&#xff1f;为什么这么推荐新手学C语言呢具体看看下面的解释吧&#xff1f; C的重要性 我总结了网上很多人的说法如下&#xff1a; C语言是计算机界公认的有史以来最重要的语言。C语…

R语言偏相关和典型相关

本文首发于公众号&#xff1a;医学和生信笔记&#xff0c;完美观看体验请至公众号查看本文。 文章目录偏相关&#xff08;partial correlation&#xff09;偏相关散点图典型相关&#xff08;Canonical Correlation&#xff09;使用R语言实现偏相关分析和典型相关分析&#xff0…