和超级玛丽有点像的接金币小游戏,以下是部分代码预览:
"""跳跳猫接金币多关卡解迷游戏,本程序给上一个版本加上Coin类。 本程序设计有10多个关卡,有些金币需要动脑筋才能接收到。""" __author__ = "李兴球" __date__ = "2018/12/18" import os import pygame from pygame.locals import * class Coin(): def __init__(self,images,position,player,level_number,sound): self.images = [pygame.image.load(image).convert_alpha() for image in images] self.images = [pygame.transform.scale(image,(int(20 * image.get_width()/image.get_height()),40)) for image in self.images] self.position = position self.current_costume = self.images[0] # 当前造型 self.costume_amounts = len(self.images) # 造型数量,注意每个图片的矩形对象不一样 self.rects = [ costume.get_rect() for costume in self.images] # 所有造型的矩形对象 self.rect = self.current_costume.get_rect() # 第一个造型的矩形对象 self.rect.center = position # 第一个造型的设定坐标 self.player = player # 可访问玩家对象 self.level_number = level_number # 每枚金币能记住自己的关卡号,不是它的关卡,则自我死亡 self.screen = self.player.screen # 屏幕对象 self.sound = sound # 金币声 self.dead = False self.index = 0 self.switch_costume_interval = 2 # 切换造型间隔 self.switch_costume_counter = 0 # 切换造型计数器 def next_costume(self): if not self.dead: self.switch_costume_counter = self.switch_costume_counter + 1 if self.switch_costume_counter > self.switch_costume_interval: self.index = self.index + 1 self.index = self.index % self.costume_amounts self.switch_costume_counter = 0 self.current_costume = self.images[self.index] self.rect = self.rects[self.index] # 矩形对象 self.rect.center = self.position # 重新设定坐标 def level_check(self,current_level_number): """关卡号不对,则自杀""" if self.level_number != current_level_number: self.dead = True def draw(self): if not self.dead: self.screen.blit(self.current_costume,self.rect) def collide_player_check(self): if self.rect.colliderect(self.player.rect) and not self.dead: self.player.coins += 1 self.dead = True try: self.sound.play() except: pass class Detector(pygame.sprite.Sprite): def __init__(self,screen): pygame.sprite.Sprite.__init__(self) self.screen = screen self.image = pygame.Surface((20,20)).convert_alpha() self.image.fill((0,155,123)) self.rect = self.image.get_rect() self.mask = pygame.mask.from_surface(self.image) class Player(pygame.sprite.Sprite): """玩家类""" def __init__(self,image,screen,level,detectors): """image:图像 screen:屏幕 level:关卡对象 detectors:左,右,上,下碰撞检测器 """ pygame.sprite.Sprite.__init__(self) self.lifes = 3 # 有三条生命 self.image = pygame.image.load(image).convert_alpha() # 小猫的造型 self.image.set_colorkey((255,255,255)) # 设置不渲染的颜色 self.rect = self.image.get_rect() # 设置矩形对象,表示坐标与大小的 self.screen = screen # 设置这个属性以便能访问screen self.levels = levels # 所有关卡 self.levels_index = 0 # 当前关卡索引号,可以在这里直接设定起始关卡 self.current_level = levels[self.levels_index] # 当前关卡 self.level_amounts = len(levels) # 关卡总数量 self.detectors = detectors # 4个侦测器,是个列表 self.screen_width = screen.get_width() # 以便能访问屏幕宽度 self.screen_height = screen.get_height() # 设这个属性以便能访问屏幕高度 self.xspeed = 0 # 水平速度 self.yspeed = 0 # 垂直速度 self.aspeed = 0.5 # 加速度 self.rect.centerx = self.screen_width//2 # 小猫初始的x中间坐标 self.rect.centery = self.screen_height//2 - 100 # 小猫初始的y中间坐标 self.__is_in_the_air = True # 描述是否在空中的变量 self.mask = pygame.mask.from_surface(self.image) # 新建掩膜mask,用于碰撞检测 self.cantoleft = True self.cantoright = True "新增加的金币数量属性" self.coins = 0 def update(self): """模拟重力的坐标更新""" self.rect.move_ip(self.xspeed,self.yspeed) self.yspeed = self.yspeed + self.aspeed def dead_check(self): if self.rect.top > self.screen_height: self.lifes -= 1 self.rect.centerx = 50 self.rect.centery = self.screen_height//2 - 100 self.xspeed = 0 self.yspeed = 0 return self.lifes def bump_obstacle_check(self): """碰地形(障碍物)检测,小猫自带4个侦测器,用它们进行检测即可。""" pass def jump(self): if not self.__is_in_the_air: self.__is_in_the_air = True self.yspeed = -11.5 def move_left(self): if self.cantoleft:self.xspeed = -5 def move_right(self): if self.cantoright:self.xspeed = 5 def stop_move(self): self.xspeed = 0 def draw(self): self.screen.blit(self.image,self.rect) def level_check(self): """过关检测,坐标判断""" if self.rect.right > self.screen_width: # 超过右边缘,下一关 self.levels_index = self.levels_index + 1 if self.levels_index >= self.level_amounts: # 关卡结束 return False,self.levels_index else: self.next_level(self.levels[self.levels_index]) return True,self.levels_index if self.rect.left < 0 : # 超过左边缘,上一关 self.levels_index = self.levels_index - 1 if self.levels_index < 0: # 关卡结束 return False,self.levels_index else: self.previous_level(self.levels[self.levels_index]) return True,self.levels_index return True,self.levels_index def next_level(self,level): self.rect.left = 10 self.current_level = level def previous_level(self,level): self.rect.right = self.screen_width self.current_level = level class Level(pygame.sprite.Sprite): def __init__(self,image,screen): self.image = pygame.image.load(image).convert_alpha() self.rect = self.image.get_rect() self.mask = pygame.mask.from_surface(self.image) self.rect.top = screen.get_height() - self.image.get_height() def detectors_follow_cat(): """跟随小猫有左右上下四个小方块,用来对小猫的移动进行检测""" detectors[0].rect.left = cat.rect.left # 左侦测器x坐标 detectors[0].rect.centery = cat.rect.centery detectors[1].rect.right = cat.rect.right # 右侦测器x坐标 detectors[1].rect.centery = cat.rect.centery detectors[2].rect.centerx = cat.rect.centerx # 上侦测器x坐标 detectors[2].rect.top = cat.rect.top detectors[3].rect.centerx = cat.rect.centerx # 下侦测器x坐标 detectors[3].rect.bottom = cat.rect.bottom if __name__ == "__main__": game_title = "跳跳猫接金币多关卡解迷游戏_作者:李兴球,风火轮编程出品 www.scratch8.net" backgrounds_png = ["BG" + str(i+1) + ".png" for i in range(14)] levels_png = ["Level" + str(i+1) + ".png" for i in range(14)] cat_image = "catx.png" width,height = 960,720 pass
下载完整源代码与素材,请
需要浏览更多吗?
成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)
发表评论