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()
"""
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为宽度
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))#红条
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