pygame:超级玛丽

模块写入:就是单纯的写py文件,调用方法from 模块儿名 import *

本体源码

import pygame,sys#模块导入
from player import *#导入所有本模块的内容
from bullet import *#导入所有本模块的内容
from 乌龟模块 import  *
#将代码修改成面向对象的形式
pygame.init()#初始化
窗体=pygame.display.set_mode((1330,728))#背景多大窗口多大
FRAME_PER_SECONDS=21#每秒刷新率
pygame.display.set_caption("马里奥打乌龟")#标题
bg=pygame.image.load("素材/background.png")   #背景图片

font=pygame.font.SysFont("Consolas",30,True)
#加载背景音乐
pygame.mixer.init()
pygame.mixer.music.load("素材/background.ogg")
pygame.mixer.music.set_volume(0.2)
pygame.mixer.music.play(-1,0)
#播放音效
def play_sound(src):
    sound=pygame.mixer.Sound(src)
    sound.play()

def colliseion_check(a,b):#碰撞检测
    temp1=(b.x<=a.x+a.width<=b.x+b.width)
    temp2=(b.y<=a.y+a.height<=b.y+b.height)#检测x轴和y轴是否同时重合,就是命中的意思
    return temp1 and temp2#return表示从被调函数返回到主调函数继续进行


def drawimge():#刷新玛丽奥角色
    窗体.blit(bg, (0, 0))  # 绘制背景图片

    text = font.render("Score:" + str(score), 1, (222, 255, 0))  # 渲染
    窗体.blit(text, (1000, 20))  # 绘制
    if player.life<=0:
        player.life=0
    life_text=font.render("Life:"+str(player.life),1,(255,0,0))#生命值字体
    窗体.blit(life_text, (20, 20))  # 绘制
    #循环绘制子弹以防消失


    you_win=font.render("YOU WIN",1,(0,0,255))
    you_lost=font.render("YOU LOST",1,(255,0,0))
    #敌人消灭
    if tortoise.life<=0:
        窗体.blit(you_win,(600,230))
        pygame.display.update()
        return
    if player.life<=0:
        窗体.blit(you_lost, (600, 230))
        pygame.display.update()
        return

    player.draw(窗体)
    tortoise.draw(窗体)
    for bullet in bullets:#子弹绘制,单独绘制会消失,循环绘制不消失,
        bullet.draw(窗体)#子弹绘制
    pygame.display.update()#刷新窗口
player=Player(50,600,70,90)
tortoise= Enemy(200,620,0,1330)#实例化乌龟
clock=pygame.time.Clock()#防止cpu占用率过高
run=True
bullets=[]
score=0#初始分数
while run:
    clock.tick(FRAME_PER_SECONDS)
    pygame.time.delay(20)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            run=False
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_SPACE:
                if player.left:
                    direction=-1
                else:
                    direction=1
                if len(bullets)<7:#列表限制,限制子弹的数量
                    bullet=Bullet(int(player.x+player.width//2),int(player.y+player.height//2),direction=direction)
                    bullets.append(bullet)#添加子弹到列表
                    play_sound("素材/bullet.wav")

    #主角被打减生命值
    if colliseion_check(player,tortoise) or colliseion_check(tortoise,player):#如果重叠
        player.jump=True
        player.life-=1
    for bullet in bullets:
        if colliseion_check(bullet,tortoise) or colliseion_check(tortoise,bullet):#如果重叠
            bullets.remove(bullet)#列表去除被碰撞的子弹
            score+=1
            play_sound("素材/exlposion.wav")
            tortoise.life-=1
        if bullet.x>0 and bullet.x<1330:
            bullet.x+=bullet.speed
        else:
            #移除子弹
            bullets.remove(bullet)
    keys=pygame.key.get_pressed()
    if keys[pygame.K_LEFT]and player.x>0:
        player.x-=player.speed
        player.left=True
        player.right=False
        player.stand=False
    elif keys[pygame.K_RIGHT] and player.x<窗体.get_size()[0]-player.width:
        player.x+=player.speed
        player.left = False
        player.right = True
        player.stand = False
    else:
        player.stand = True
        player.walk_count=0
    if not player.jump:#如果没跳起,按下空格管用
        if keys[pygame.K_UP]:
            player.jump=True
            player.walk_count=0
    else:
        if player.t>=-10:
            a=1
            if player.t<0:
                a=-1
            player.y-=0.5*a*(player.t**2)
            player.t-=1
        else:
            player.jump=False
            player.t=10
    drawimge()#绘制背景
sys.exit()
"""多行注释
pygame.init()#初始化
窗体=pygame.display.set_mode((1330,728))#背景多大窗口多大
FRAME_PER_SECONDS=21#每秒刷新率
pygame.display.set_caption("马里奥打乌龟")#标题

walk_left=[]#存储面向左的行走图片

walk_right=[]#存储面向右的行走图片
for pic_num in range(0,22):#添加图片
    walk_left.append(pygame.image.load("素材/人物/marioL/"+str(pic_num)+".png"))
    walk_right.append(pygame.image.load("素材/人物/marioR/" + str(pic_num) + ".png"))
bg=pygame.image.load("素材/background.png")
#站立图片
stand_l=pygame.image.load("素材/人物/marioL/stand.png")
stand_r=pygame.image.load("素材/人物/marioR/stand.png")
#跳起图片
jump_l=pygame.image.load("素材/人物/marioL/jump.png")
jump_r=pygame.image.load("素材/人物/marioR/jump.png")
x,y=50,600#首次出现的坐标
width,height=70,90#大小
speed=5
walk_count=0
left,right,stand,jump=False,False,False,False#向左像右站立初始值跳跃
t=10

def drawimge():    #渲染背景图片/绘制
    global walk_count#允许对全局变量进行赋值
    窗体.blit(bg,(0,0))#绘制背景图片
    if walk_count>=FRAME_PER_SECONDS:#判断图片数量是否超出
        walk_count=0
    if left and not stand and not jump:#如果left=真 并且没有站立
        窗体.blit(walk_left[walk_count],(x,y))#绘制像左的图片
        walk_count+=1
    elif right and not stand and not jump:
        窗体.blit(walk_right[walk_count], (x, y))  # 绘制像右的图片
        walk_count += 1
    else:
        if left:
            if not jump:
                窗体.blit(stand_l,(x,y))
            else:
                窗体.blit(jump_l,(x,y))
        else:
            if not jump:
                窗体.blit(stand_r, (x, y))
            else:
                窗体.blit(jump_r,(x,y))
clock=pygame.time.Clock()#防止cpu占用率过高
run=True
while run:
    clock.tick(FRAME_PER_SECONDS)
    pygame.time.delay(20)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            run=False
    keys=pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x-=speed
        left=True
        right=False
        stand=False
    elif keys[pygame.K_RIGHT]:
        x+=speed
        left = False
        right = True
        stand = False
    else:
        stand = True
        walk_count=0
    if not jump:#如果没跳起,按下空格管用
        if keys[pygame.K_UP]:
            jump=True
            walk_count=0
    else:
        if t>=-10:
            a=1
            if t<0:
                a=-1
            y-=0.5*a*(t**2)
            t-=1
        else:
            jump=False
            t=10
    drawimge()#绘制背景
    pygame.display.update()#刷新窗口
sys.exit()
"""

模块1子弹源码

import pygame
class Bullet(object):#子弹类
    bullet_l = pygame.image.load("素材/fire/fireL/4.png")
    bullet_r = pygame.image.load("素材/fire/fireR/4.png")
    def __init__(self,x,y,direction):#子弹坐标
        self.x=x
        self.y=y
        self.width=37
        self.height=36#子弹的长宽
        self.direction=direction#方向,1为某个图片。-1为另一个,与下列速度起到呼应作用
        self.speed=10*direction#子弹移动速度
        self.hit_box = (self.x, self.y, 37, 36)  # 绘制
    def draw(self,窗体):#绘制子弹
        if self.direction==1:
            窗体.blit(self.bullet_r,(self.x,self.y))#子弹从玛丽身上出现,向左向右由上面判断进行
        else:
            窗体.blit(self.bullet_l, (self.x, self.y))
        # self.hit_box = (self.x, self.y, 37, 36)  # 绘制
        #
        # pygame.draw.rect(窗体, (255, 0, 0), self.hit_box, 2)  # hit_box位置大小,2为宽度

模块2人物源码

import pygame
FRAME_PER_SECONDS=21
class Player(object):
    walk_left = []  # 存储面向左的行走图片
    walk_right = []  # 存储面向右的行走图片
    for pic_num in range(0, 22):  # 添加图片
        walk_left.append(pygame.image.load("素材/人物/marioL/" + str(pic_num) + ".png"))
        walk_right.append(pygame.image.load("素材/人物/marioR/" + str(pic_num) + ".png"))
    # 站立图片
    stand_l = pygame.image.load("素材/人物/marioL/stand.png")
    stand_r = pygame.image.load("素材/人物/marioR/stand.png")
    # 跳起图片
    jump_l = pygame.image.load("素材/人物/marioL/jump.png")
    jump_r = pygame.image.load("素材/人物/marioR/jump.png")
    def __init__(self,x,y,width,height):#构造函数,图片导入等问题
        self.x=x
        self.y=y
        self.width=width
        self.height=height
        self.speed=5
        self.left=False
        self.right=True#默认向右
        self.jump=False
        self.stand=True#默认站立
        self.walk_count=0#切换走路图片
        self.t=10#跳跃状态判断
        self.hit_box=(self.x,self.y,70,90)#外框
        self.life=10#默认生命值
    def draw(self,窗体):#创建窗口
        global walk_count  # 允许对全局变量进行赋值

        if self.walk_count >= FRAME_PER_SECONDS:  # 判断图片数量是否超出
            self.walk_count = 0
        if self.left and not self.stand and not self.jump:  # 如果left=真 并且没有站立
            窗体.blit(self.walk_left[self.walk_count], (self.x, self.y))  # 绘制像左的图片
            self.walk_count += 1
        elif self.right and not self.stand and not self.jump:
            窗体.blit(self.walk_right[self.walk_count], (self.x, self.y))  # 绘制像右的图片
            self.walk_count += 1
        else:
            if self.left:
                if not self.jump:
                    窗体.blit(self.stand_l, (self.x, self.y))
                else:
                    窗体.blit(self.jump_l, (self.x, self.y))
            else:
                if not self.jump:
                    窗体.blit(self.stand_r, (self.x, self.y))
                else:
                    窗体.blit(self.jump_r, (self.x, self.y))
        #绘制边框
        # self.hit_box=(self.x,self.y,70,90)#绘制
        #
        # pygame.draw.rect(窗体,(255,0,0),self.hit_box,2)#hit_box位置大小,2为宽度

        pygame.draw.rect(窗体,(0,150,0),(self.x,self.y-10,70,8))#绘制绿色长方体

        #模拟掉血
        if self.life<10:
            if self.life < 0: self.life = 0
            pygame.draw.rect(窗体,(150,0,0),(self.x+self.life*7,self.y-10,70-self.life*7,8))#红条

模块3乌龟源码

import pygame
class Enemy(object):
    walk_left=[]
    walk_right=[]
    for pic_num in range(0,12):#导入12张乌龟图片
        walk_right.append(pygame.image.load("素材/tortoise/tortoiseR/" + str(pic_num) + ".png"))
        walk_left.append(pygame.image.load("素材/tortoise/tortoiseL/"+str(pic_num)+".png"))
    def __init__(self,x,y,start,end):
        self.x=x
        self.y=y#乌龟出现的位置
        self.area=[start,end]#乌龟可移动范围
        self.walk_count=0#图片切换
        self.speed=3#移动速度
        self.__hit_box=(self.x,self.y,50,70)#边框
        self.width=50
        self.height=70
        self.life=10
    def draw(self,窗体):#绘制
        self.move()#移动
        if self.walk_count>=11:#图片循环
            self.walk_count=0
        if self.speed>0:#意思是加还是减
            窗体.blit(self.walk_right[self.walk_count],(self.x,self.y))#绘制像右图片
            self.walk_count+=1
        else:
            窗体.blit(self.walk_left[self.walk_count], (self.x, self.y))  # 绘制像左图片
            self.walk_count += 1
        self.hit_box = (self.x, self.y, 50, 70)  # 绘制
        pygame.draw.rect(窗体, (0, 150, 0), (self.x, self.y - 10, 50, 8))  # 绘制绿色长方体
        if self.life<10:
            if self.life<0:self.life=0
            pygame.draw.rect(窗体,(150,0,0),(self.x+self.life*5,self.y-10,50-self.life*5,8))#红条

        #pygame.draw.rect(窗体, (255, 0, 0), self.hit_box, 2)  # hit_box位置大小,2为宽度
    def move(self):
        if self.speed>0:
            if self.x<self.area[1]+self.speed:#判断走没走到边缘#area[]为列表,实例化会赋值,就是范围的意思[1]的意思是第二个参数
                self.x+=self.speed#移动
            else:
                self.speed=-self.speed#掉头
                self.x+=self.speed#移动
                self.walk_count=0#重新绘制右边的图片
        else:
            if self.x>self.area[0]+self.speed:
                self.x += self.speed  # 移动

            else:
                self.speed=-self.speed#掉头
                self.x+=self.speed#移动
                self.walk_count=0#重新绘制右边的图片

超级玛丽矩形演示源码

import pygame,sys#模块导入
pygame.init()#初始化模块
窗口=pygame.display.set_mode([640,480])#窗体大小
pygame.display.set_caption("演示矩形控制")#标题
x,y=50,50#初始位置
width,height=30,30#长高
speed=5#速递

#标志方块是否跳起
jump=False
t=10

run=True
while run:
    pygame.time.delay(20)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            run=False
    keys=pygame.key.get_pressed()#获取按键
    if not(jump):#如果方块没跳起
        if keys[pygame.K_LEFT]:#按下左键
            x-=speed#x-
        if keys[pygame.K_RIGHT]:#按下左键
            x+=speed#x+

        if keys[pygame.K_DOWN]:#按下下键
            y+=speed
        if keys[pygame.K_UP]:#按下上键
            y-=speed
        if keys[pygame.K_SPACE]:#空格是指jump值达到起跳效果
            jump=True
        if x>窗口.get_size()[0]-width:#大于窗口宽,获取宽高,0为宽,1为高 width是正方型的宽
            x=窗口.get_size()[0]-width#先获取宽高,如果大出,重置为宽的位置,也就是边缘位置
        if x<0:
            x=0
        if y>窗口.get_size()[1]-height:#大于窗口宽,获取宽高,0为宽,1为高 ht是正方型的宽
            y=窗口.get_size()[1]-height#先获取宽高,如果大出,重置为高的位置,也就是边缘位置
        if y<0:
            y=0
    else:
        #方块跳起
        if t>=-10:#正在跳
            a=1#减速上跳
            if t<0:
                a=-1#加速下落
            #匀加速直线运动的位移公式
            y-=0.5*a*(t**2)#上升下降
            if y<0:
                y=0#不能和跳出窗体
            t-=1
        else:
            jump=False#跳完结束
            t=10



    窗口.fill((0,0,0))#背景色
    pygame.draw.rect(窗口,(255,0,0),(x,y,width,height))#画方块
    pygame.display.update()#刷新
sys.exit()#退出

素材打包

百度云资源:https://pan.baidu.com/s/13G1vnQktUrNyaTigrYeoZA

你可能感兴趣的:(python)