赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。