zoukankan      html  css  js  c++  java
  • Python 之pygame飞机游戏

    一、效果图

      下载地址:https://github.com/yangsphp/airplane-game-master

    二、代码

    import pygame
    from pygame.locals import *
    import time
    import random
    
    
    # 我机
    class HeroPlane(object):
        def __init__(self, screen):
            # 设置飞机默认的位置
            self.x = 230
            self.y = 550
            # 设置要显示内容的窗口
            self.screen = screen
            # 用来保存英雄飞机需要的图片名字
            self.imageName = "./feiji/hero.gif"
            # 根据名字生成飞机图片
            self.image = pygame.image.load(self.imageName)
            # 用来保存英雄飞机发射出的所有子弹
            self.bullet = []
    
            # 爆炸效果用的如下属性
            self.hit = False  # 表示是否要爆炸
            self.bomb_list = []  # 用来存储爆炸时需要的图片
            self.__crate_images()  # 调用这个方法向bomb_list中添加图片
            self.image_num = 0  # 用来记录while True的次数,当次数达到一定值时才显示一张爆炸的图,然后清空,,当这个次数再次达到时,再显示下一个爆炸效果的图片
            self.image_index = 0  # 用来记录当前要显示的爆炸效果的图片的序号
    
        def __crate_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 bomb(self):
            self.hit = True
    
        def display(self):
            if self.hit:
                self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))
                self.image_num += 1
                if self.image_num == 7:
                    self.image_num = 0
                    self.image_index += 1
                if self.image_index > 3:
                    time.sleep(1)
                    exit()  # 调用exit让游戏退出
            else:
                self.screen.blit(self.image, (self.x, self.y))
            # 用来存放需要删除的对象信息
            needDelItemList = []
            for b in self.bullet:
                b.display()
                b.move()
                if b.judge():
                    needDelItemList.append(b)
            # 删除self.bulletL中需要删除的对象
            for i in needDelItemList:
                self.bullet.remove(i)
    
        def moveLeft(self):
            self.x -= 10
    
        def moveRight(self):
            self.x += 10
    
        def sheBullet(self):
            newBullet = Bullet(self.x, self.y, self.screen)
            self.bullet.append(newBullet)
    
    
    # 子弹
    class Bullet(object):
        def __init__(self, x, y, screen):
            self.x = x + 40
            self.y = y - 20
            self.screen = screen
            self.image = pygame.image.load("./feiji/bullet-3.gif")
    
        def move(self):
            self.y -= 20
    
        def display(self):
            self.screen.blit(self.image, (self.x, self.y))
    
        # 判断子弹是否越界
        def judge(self):
            if self.y < 0:
                return True
            return False
    
    
    # 敌机
    class EnemyPlane(object):
    
        def __init__(self, screen):
            # 设置飞机默认的位置
            self.x = 0
            self.y = 0
            # 设置要显示内容的窗口
            self.screen = screen
            self.imageName = "./feiji/enemy-1.gif"
            self.image = pygame.image.load(self.imageName)
            # 用来存储敌人飞机发射的所有子弹
            self.bulletList = []
            self.direction = "right"
    
        def display(self):
            self.screen.blit(self.image, (self.x, self.y))
            # 存储待删除的子弹
            needDelItemList = []
            for b in self.bulletList:
                b.display()
                b.move()
                if b.judge():
                    needDelItemList.append(b)
            # 删除self.bulletL中需要删除的对象
            for i in needDelItemList:
                self.bulletList.remove(i)
    
        def move(self):
            if self.direction == "right":
                self.x += 5
            elif self.direction == "left":
                self.x -= 5
            if self.x > 480 - 50:
                self.direction = "left"
            elif self.x < 0:
                self.direction = "right"
    
        # 敌机发射子弹
        def shot(self):
            random_num = random.randint(1, 100)
            if random_num == 10 or random_num == 20:
                EnemyNewBullet = EnemyBullet(self.x, self.y, self.screen)
                self.bulletList.append(EnemyNewBullet)
    
    
    # 敌机子弹
    class EnemyBullet(object):
        def __init__(self, x, y, screen):
            self.x = x + 22
            self.y = y + 40
            self.screen = screen
            self.image = pygame.image.load("./feiji/bullet1.png")
    
        # 移动子弹
        def move(self):
            self.y += 20
    
        # 显示子弹
        def display(self):
            self.screen.blit(self.image, (self.x, self.y))
    
        # 判断子弹是否越界
        def judge(self):
            if self.y > 650:
                return True
            return False
    
    
    # 键盘监听
    def key_control(plane):
        # 获取事件,比如按键等
        for event in pygame.event.get():
            # 判断是否是点击了退出按钮
            if event.type == QUIT:
                exit()
            # 判断是否是按下了键
            elif event.type == KEYDOWN:
                # 检测按键是否是a或者left
                if event.key == K_a or event.key == K_LEFT:
                    plane.moveLeft()
                # 检测按键是否是d或者right
                elif event.key == K_d or event.key == K_RIGHT:
                    plane.moveRight()
    
                # 检测按键是否是空格键
                elif event.key == K_SPACE:
                    plane.sheBullet()
                elif event.key == K_b:
                    plane.bomb()
    
    
    def main():
        # 创建一个游戏窗口
        screen = pygame.display.set_mode((480, 650), 0, 32)
        # 创建背景图片
        background = pygame.image.load("./feiji/background.png")
        # 创建一个飞机对象
        plane = HeroPlane(screen)
        # 创建一个敌人飞机
        enemyPlane = EnemyPlane(screen)
        while True:
            # 将图片放到屏幕上
            screen.blit(background, (0, 0))
            # 显示我的飞机到屏幕
            plane.display()
            # 显示敌机到屏幕
            enemyPlane.display()
            # 移动敌机
            enemyPlane.move()
            # 敌机发射子弹
            enemyPlane.shot()
            # 更新显示
            pygame.display.update()
            # 监听键盘,控制我机
            key_control(plane)
            time.sleep(0.08)
        pass
    
    
    if __name__ == '__main__':
        main()
    

      

  • 相关阅读:
    表达式执行工具方法
    Mysql表创建外键报错
    JVM打印加载类的详情信息
    Shell脚本查询进程存活信息
    旋转数组的最小数字
    斐波那契数列(水题)
    用两个栈实现队列
    变态跳台阶
    跳台阶
    9*9乘法表(5种输出格式)
  • 原文地址:https://www.cnblogs.com/yang-2018/p/10888457.html
Copyright © 2011-2022 走看看