超级玛丽奥

游戏规则:按空格跳跃。按左向左。按右向右

地图: T是乌龟怪 E是蘑菇怪 Q是变大蘑菇问题箱 h是小山背景 p是金币 B是不可撞碎方块 D是可撞碎方块 O是地面

地图放在level1.dat

地图如下。可添加
                                                                                                                                                                                    c                                          c             

                                  c                                     c                                                                                                        c                                         c                 c
             c                                                                     c                                     c
                       c                    c             c c c                c                           c                       c                                c
                                                                                                  c                  c                              c



c
            p
                                                                                                                                                                                                                                                                                                                           BBBBBBBBBB
                       B                                                                                                         
           DQDD       B                                                                                                                                                                                                                                                       BBBBBBB
                     BBB                 B   B                     BBDDBB                           DDDBBDDB            DDDBBBBDDDB                           DDDDBBBQDDB                                                                            BBBBBBBBBBB
                    BBBB        p       BB   BB         p                                 B                                                    B                                                                                                     BBBBBB
                   BBBBB               BBB   BBB                                         BB                          B                        BB     B                                                                                BBBBBBBBBBB
  h       b  p p  BBBBBB    p     p   BBBB   BBBB     E    B                  B  T      BBB                         BB                       BBB    BB                                                                             BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
OOOOOOOOOOOOOOOOOOOOOOOO   OOOOOOOOOOOOOOO   OOOOOOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO   OOOOOOOOOOOOOOOOOOOOOOOO  OOOOOOOOOOOOOOOOOOOOOOOO   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOO   OOOOOOOOOOOOOOO   OOOOOOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO   OOOOOOOOOOOOOOOOOOOOOOOO  OOOOOOOOOOOOOOOOOOOOOOOO   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
代码如下

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()
    

运行前需要:下载pyzero 用

pip install pyzero

PyCarm可以直接点击下载


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值