微信小程序> Python微信小程序飞机大战(类实现)

Python微信小程序飞机大战(类实现)

浏览量:458 时间: 来源:LVGreenary

以下代码个人原创,在需要说明的地方我在后面加了注释,当然我的代码是希望给大家一个思想,还有很多很多不足之处,希望大佬们发现后私信我哦,咱们一起探讨(嘻嘻,说得有点小装逼呀,其实是老师发个模版,让我们去加内容的):

需要注意的一个地方是,如果你用的版本是3.6的,那么下面的用到的所有从外界接收信息所用到的input()用input()就行了,如果是2.7版本,那么如果接收的是字符串要用raw_input()(将接收到的信息自动转化为字符串,即使你输入的是12345那也是字符串12345)

以下是代码,备注还是很详细的(代码中用到的文件可以点https://download.csdn.net/download/sand8o8time/10635172下载)

# -*- coding:utf-8 -*-import pygameimport sysfrom pygame.locals import *from pygame.font import *import timeimport randomclass Hero(object):    #玩家 英雄类    def __init__(self, screen_temp):        self.x = 210        self.y = 700        self.life = 21        # self.life = 100        self.image = pygame.image.load("./feiji/hero1.png")        self.screen = screen_temp        self.bullet_list = []#用来存储子弹对象的引用        #爆炸效果用的如下属性        self.hit = False #表示是否要爆炸        self.bomb_list = [] #用来存储爆炸时需要的图片        self.__create_images() #调用这个方法向bomb_list中添加图片        self.image_num = 0 #用来记录while True的次数,当次数达到一定值时才显示一张爆炸的图,然后清空,,当这个次数再次达到时,再显示下一个爆炸效果的图片        self.image_index = 0#用来记录当前要显示的爆炸效果的图片的序号    def __create_images(self):        #添加爆炸图片        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n1.png"))        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n2.png"))        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n3.png"))        self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n4.png"))    def display(self):        #显示玩家的飞机        #如果被击中,就显示爆炸效果,否则显示普通的飞机效果        if self.hit == True:            self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))#(self.x, self.y)是指当前英雄的位置            #blit方法 (一个对象,左上角位置)            self.image_num += 1            print(self.image_num)            if self.image_num == 7:                self.image_num = 0                self.image_index += 1                print(self.image_index) #这里子弹打住英雄时没有被清除掉,所以打一下,就死了            if self.image_index > 3:                time.sleep(1)                exit()#调用exit让游戏退出                #self.image_index = 0        else:            if self.x< 0:   #控制英雄,不让它跑出界面                self.x = 0            elif self.x > 382:                self.x = 382            if self.y < 0:                self.y = 0            elif self.y > 750:                self.y = 750            self.screen.blit(self.image,(self.x, self.y))#z这里是只要没有被打中,就一直是刚开始的样子        #不管玩家飞机是否被击中,都要显示发射出去的子弹        for bullet in self.bullet_list:            bullet.display()            bullet.move()    def move(self, move_x,move_y):        self.x += move_x        self.y += move_y    def fire(self):        #通过创建一个子弹对象,完成发射子弹        bullet = Bullet(self.screen, self.x, self.y)#创建一个子弹对象        self.bullet_list.append(bullet)    def bomb(self):        self.hit = True    def judge(self):        global life        if life == 0:            self.bomb()class Bullet(object):    #玩家子弹类    def __init__(self, screen_temp, x_temp, y_temp):        self.x = x_temp + 40        self.y = y_temp - 20        self.image = pygame.image.load("./feiji/bullet.png")        self.screen = screen_temp            def display(self):        self.screen.blit(self.image, (self.x, self.y))    def move(self):        self.y -= 10class Bullet_Enemy(object):    #敌机子弹类    def __init__(self, screen_temp, x_temp, y_temp):        self.x = x_temp + 25        self.y = y_temp + 30        self.image = pygame.image.load("./feiji/bullet1.png")        self.screen = screen_temp            def display(self):        self.screen.blit(self.image,(self.x,self.y))           def move(self, hero):        self.y += 10        global life        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):            life -= 10            #self.bullet_list.remove()            print("---judge_enemy---")            return True            if life<=0:                hero.bomb()        return Falseclass Bullet_Boss(object):    #boss子弹类1    def __init__(self, screen_temp, x_temp, y_temp):        self.x = x_temp + 80        self.y = y_temp + 230        self.image = pygame.image.load("./feiji/bullet2.png")        self.screen = screen_temp    def display(self):        self.screen.blit(self.image, (self.x, self.y))    def move(self, hero):        self.y += 6        self.x += 2        global life        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):            life -= 20            #self.bullet_list.remove()            print("---judge_boss---")            return True            if life<=0:                hero.bomb()        return Falseclass Bullet_Boss1(object):    #boss子弹类2    def __init__(self, screen_temp, x_temp, y_temp):        self.x = x_temp + 80        self.y = y_temp + 230        self.image = pygame.image.load("./feiji/bullet2.png")        self.screen = screen_temp    def display(self):        self.screen.blit(self.image, (self.x, self.y))    def move(self, hero):        self.y += 6        self.x -= 2        global life        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):            life -= 20            #self.bullet_list.remove()            print("---judge_boss---")            return True            if life<=0:                hero.bomb()        return Falseclass Bullet_Boss2(object):    #boss子弹类3    def __init__(self, screen_temp, x_temp, y_temp):        self.x = x_temp + 80        self.y = y_temp + 230        self.image = pygame.image.load("./feiji/bullet2.png")        self.screen = screen_temp    def display(self):        self.screen.blit(self.image, (self.x, self.y))    def move(self, hero):        self.y += 6        global life        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):        #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):            life -= 20             #self.bullet_list.remove()            print("---judge_boss---")            return True            if life<=0:                hero.bomb()        return Falseclass Base(object):    #基类  类似于抽象类    def __init__(self, screen_temp, x, y, image_name):        self.x = x        self.y = y         self.screen = screen_temp        self.image = pygame.image.load(image_name)        self.alive = True    def display(self):        if self.alive == True:            self.screen.blit(self.image, (self.x, self.y))    def move(self):        self.y += 5class bomb_bullet(Base):    #炸弹类    def __init__(self, screen_temp):        Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb.png")    def judge(self, hero):        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):            self.alive = False            hero.bomb()        if self.y >= 850:            #self.alive = False            self.y = 0            self.x = random.randint(45, 400)            #print("bomb.y = %d"%self.y)class supply(Base):    #补给类    def __init__(self, screen_temp):        Base.__init__(self, screen_temp, random.randint(45, 400), -300, "./feiji/bomb-1.gif")    def judge(self, hero):        global life        if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):            self.alive = False            life += 10        if self.y >= 1500:            self.y = 0            self.x = random.randint(45, 400)            self.alive = Trueclass EnemyPlane(object):    #敌机类    def __init__(self, screen_temp):        self.x = random.randint(15, 480)        self.y = 0        self.image = pygame.image.load("./feiji/enemy0.png")        self.screen = screen_temp        self.bullet_list = []#用来存储子弹对象的引用        #self.direction = "right"#用来设置这个飞机默认的移动方向        self.hit = False        self.bomb_list = []        self.__create_images()        self.image_num = 0        self.image_index = 0        #利用产生的随机数,随机确定飞机初始移动方向        self.k = random.randint(1, 20)        if self.k <= 10:            self.direction = "right"        elif self.k > 10:            self.direction = "left"    def display(self, hero):        #显示敌人的飞机        if not self.hit:            self.screen.blit(self.image, (self.x,self.y))        else:            self.screen.blit(self.bomb_list[self.image_index], (self.x,self.y))            self.image_num += 1            if self.image_num == 3 and self.image_index < 3:                self.image_num = 0                self.image_index += 1                #print(self.image_index)            # if self.image_index > 2:            #     time.sleep(0.1)        for bullet in self.bullet_list:            bullet.display()            if(bullet.move(hero)):                self.bullet_list.remove(bullet)    def move(self):        #利用随机数来控制飞机移动距离,以及移动范围        d1 = random.uniform(1,3)        d2 = random.uniform(0.2,3)        p1 = random.uniform(50,100)        p2 = random.uniform(-200,0)        if self.direction == "right":            self.x += d1        elif self.direction == "left":            self.x -= d1        if self.x > 480 - p1:            #480 - 50            self.direction="left"        elif self.x < p2:            self.direction = "right"        self.y += d2    def bomb(self):        self.hit = True    def __create_images(self):        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down1.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down2.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down3.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy0_down4.png"))    def fire(self):        #利用随机数来控制敌机的开火,1/80的概率        s = random.randint(0,800)        bullet1 = Bullet_Enemy(self.screen, self.x, self.y)        if s < 10:            self.bullet_list.append(bullet1)class EnemyPlanes(EnemyPlane):    #敌机群类  继承自EnemyPlane类      def __init__(self, screen_temp):        EnemyPlane.__init__(self, screen_temp)        self.num = 0        self.enemy_list = []  #用列表存储产生的多架敌机        self.screen = screen_temp    def add_enemy(self, num):      #产生多架敌机的函数        self.num = num        for i in range(num):            enemy = EnemyPlane(self.screen)            self.enemy_list.append(enemy)    def display(self, hero):        for i in range(self.num):            self.enemy_list[i].display(hero)        def move(self):        for i in range(self.num):             self.enemy_list[i].move()    def fire(self):        #s = random.randint(0,1000)        for i in range(self.num):            self.enemy_list[i].fire()class Boss(EnemyPlane):    #boss敌机类 继承自EnemyPlane类    def __init__(self,screen_temp):        EnemyPlane.__init__(self,screen_temp)        self.x = 150        self.y = 0        self.bomb_list = []        self.__create_images()        self.image = pygame.image.load("./feiji/enemy2.png")        self.screen = screen_temp        self.bullet_list = []    def __create_images(self):        #self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down1.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down2.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down3.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down4.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down5.png"))        self.bomb_list.append(pygame.image.load("./feiji/enemy2_down6.png"))    def display(self, hero):        #显示敌人的飞机        global g        #print(g)        self.screen.blit(self.bomb_list[g], (self.x,self.y))        for bullet in self.bullet_list:            bullet.display()            if(bullet.move(hero)):                self.bullet_list.remove(bullet)    def move(self):        d1 = 0        self.y += 0    def fire(self):        global s        s +=1        bullet1 = Bullet_Boss(self.screen, self.x, self.y)        bullet2 = Bullet_Boss1(self.screen, self.x, self.y)        bullet3 = Bullet_Boss2(self.screen, self.x, self.y)        if s == 20:            s = 0             self.bullet_list.append(bullet1)            self.bullet_list.append(bullet2)            self.bullet_list.append(bullet3)def judge1(hero,enemy):    #判断敌机的炸毁    for bullet1 in hero.bullet_list:        if bullet1.y in range(int(enemy.y),int(enemy.y + 30)) and bullet1.x in range(int(enemy.x-10),int(enemy.x + 50)):            hero.bullet_list.remove(bullet1)            enemy.bomb()        if bullet1.y < 0 or bullet1.x < 0 or bullet1.x > 480: #删除越界的玩家子弹            hero.bullet_list.remove(bullet1) def judge3(hero,boss):    #判断boss的炸毁    global goal, g, goal0    for bullet3 in hero.bullet_list:        if bullet3.y in range(int(boss.y), int(boss.y + 60)) and bullet3.x in range(int(boss.x), int(boss.x + 100)):            hero.bullet_list.remove(bullet3)            g += 1            boss.image = boss.bomb_list[g]            print("g = %d"%g)            if g >= 6:                boss.y, g, goal = 0, 0, 0                boss.bomb()                goal0 += 10                 def clear_enemy(enemies):    #清除敌机群类中被炸毁的敌机    global goal, goal0    for enemy in enemies.enemy_list:        if enemy.hit == True and enemy.image_index == 3:            enemies.enemy_list.remove(enemy)            enemies.num -= 1            goal += 1            goal0 += 5            print("goal = %d"%goal)        if enemy.y >= 850:            enemies.enemy_list.remove(enemy)            enemies.num -= 1def judge_num(enemies):    #判断频幕上敌人的数量,如果为零,继续添加敌人    n = random.randint(1,5)    if len(enemies.enemy_list) == 0:        enemies.add_enemy(n)def show_text(screen_temp):    #在屏幕上显示文字    text = "GOAL:" + str(goal0) + "Life:" + str(life)     font_size = 50    pos = (0,0)    color = (0,255,0)    cur_font = pygame.font.SysFont("宋体",font_size)    text_fmt = cur_font.render(text, 1, color)    screen_temp.blit(text_fmt, pos)def creat_bomb(screen_temp):    bomb = bomb_bullet(screen_temp)    bomb_list = []    bomb_list.apend(bomb)#定义的全局变量goal = 0  #玩家得分goal0 = 0g = 0 #击中boss的次数life = 100#生命值s = 0 #判断大boss是否发射子弹def main():    #主函数执行    #获取事件,比如按键等    bb = False    move_x = 0    move_y = 0    pygame.init()    screen = pygame.display.set_mode((480,852),0,32)    #                                 210,400    background = pygame.image.load("./feiji/background.png")    pygame.display.set_caption("飞机大战")    atlas = pygame.image.load("./feiji/New Atlas.png")    #创建玩家飞机    hero = Hero(screen)    #创建敌机群    enemis = EnemyPlanes(screen)    enemis.add_enemy(5)    #创建boss对象    boss = Boss(screen)    #创建炸弹对象    bomb = bomb_bullet(screen)    #创建补给对象    supply0 = supply(screen)    left_key, right_key, up_key, down_key, done = 0, 0, 0, 0, 0    # mark = 0#用来判断boss发射子弹    while True:        if done:            if done % 8 == 0:                done = 1                hero.fire()            else:                done += 1        for event in pygame.event.get():            #判断是否是点击了退出按钮            if event.type == QUIT:                print("exit")                exit()            #判断是否是按下了键            if event.type == KEYDOWN :                #down                #检测按键是否是a或者left                if event.key == K_a or event.key == K_LEFT:                    #print('left')                    move_x = -5                    left_key += 1                 #检测按键是否是d或者right                elif event.key == K_d or event.key == K_RIGHT:                    #print('right')                    move_x = 5                    right_key += 1                elif event.key == K_w or event.key == K_UP:                    move_y = -5                    up_key += 1                elif event.key == K_s or event.key == K_DOWN:                    move_y = 5                    down_key += 1                #检测按键是否是空格键                elif event.key == K_SPACE:                    #print('space')                    hero.fire()                    done = 1                    #enemis.fire()                elif event.key == K_b:                    print('b')                    hero.bomb()            if event.type == KEYUP:                if event.key == K_a or event.key == K_LEFT:                    left_key -= 1                    if right_key == 0:                        move_x = 0                    else:                        move_x = 5                if event.key == K_d or event.key == K_RIGHT:                    right_key -= 1                    if left_key == 0:                        move_x = 0                    else:                        move_x = -5                if event.key == K_w or event.key == K_UP:                    up_key -= 1                    if down_key == 0:                        move_y = 0                    else:                        move_y = 5                  if event.key == K_s or event.key == K_DOWN:                    down_key -= 1                    if up_key == 0:                        move_y = 0                    else:                        move_y = -5                if event.key == K_SPACE:                    done = 0         screen.blit(background, (0, 0))        hero.move(move_x, move_y)        hero.display()        hero.judge()        enemis.display(hero)        enemis.move()        enemis.fire()        bomb.display()        bomb.judge(hero)        bomb.move()        supply0.display()        supply0.judge(hero)        supply0.move()        for i in range(enemis.num):            judge1(hero, enemis.enemy_list[i])            #enemis.enemy_list[i].judge(hero)        clear_enemy(enemis)        judge_num(enemis)        show_text(screen)        if goal >= 15:            boss.display(hero)            boss.move()            # mark+=1            # if mark==8:            boss.fire()                # mark = 0            #boss.judge            judge3(hero, boss)        pygame.display.update()if __name__ == "__main__":    main()

 

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎