栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python飞机大战

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python飞机大战

plane.py

import pygame
class Plane:#管理飞机的类
    def __init__(self,pw):
        self.screen=pw.screen#获得屏幕
        self.screen_rect =pw.screen.get_rect()

        self.image = pygame.image.load('images/myplane.png')
        self.rect = self.image.get_rect()

        self.rect.midbottom = self.screen_rect.midbottom

        self.moving_left = False
        self.moving_right = False
        self.moving_up = False
        self.moving_down = False


    def update(self):
        if self.moving_left and self.rect.left > 0:
            self.rect.x -= 2
        elif self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.x += 2
        if self.moving_up and self.rect.top > 0:
            self.rect.y -= 2
        elif self.moving_down and self.rect.bottom < self.screen_rect.bottom:
            self.rect.y += 2

    def draw_place(self):
        self.screen.blit(self.image,self.rect)

bullet.py

import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
    def __init__(self,pw):
        super().__init__()
        self.screen=pw.screen
        self.image=pygame.image.load('images/bullet.png')
        self.rect=self.image.get_rect()
        self.speed=5
        self.rect.midtop=pw.plane.rect.midtop

    def update(self):
        self.rect.y-=self.speed

enemy.py

import random
import pygame
from pygame.sprite import Sprite


class Enemy(Sprite):
    def __init__(self, pw):
        super().__init__()
        self.screen = pw.screen
        self.screen_rect = pw.screen.get_rect()
        self.frame = None
        self.image = None
        self.rect = None
        self.life = None
        self.speed = None
        self.bullet_num = None
        self.direction = None

        self.dead = False
        self.curr_frame = None
        self.count = 0

    def burning(self):
        pass

    def beshot(self):
        print(self.life)
        if not self.dead:
            self.life -= 1
            if self.life <= 0:
                self.dead = True

    def update(self):

        if self.direction:
            self.rect.x += self.speed
            if self.rect.right >= self.screen_rect.right:
                self.direction = False
        else:
            self.rect.x -= self.speed
            if self.rect.left <= 0:
                self.direction = True
        self.rect.y += 1


class Enemy_small(Enemy):
    def __init__(self, pw):
        super().__init__(pw)
        # 加载爆炸动画图集
        self.frame = pygame.image.load('images/small_frame.png').convert_alpha()
        self.curr_frame = 0
        # 显示第一帧
        self.image = self.frame.subsurface(0, 0, 25, 20)
        # pygame.image.load('images/small.png')
        self.rect = self.image.get_rect()
        self.rect.x = random.random() * (self.screen_rect.width - 100) + 50
        self.life = 2
        self.speed = 3
        self.bullet_num = 1
        self.direction = True if random.random() > 0.5 else False

    def burning(self):
        # 因为主程序刷新太快,这里使用计数
        self.count += 1
        if self.count >= 6:
            self.count = 0
            if self.curr_frame <= 4:
                self.curr_frame += 1
                self.image = self.frame.subsurface(0, self.curr_frame * 20, 25, 20)


class Enemy_middle(Enemy):
    def __init__(self, pw):
        super().__init__(pw)
        self.frame = pygame.image.load('images/middle_frame.png').convert_alpha()
        self.curr_frame = 0
        self.image = self.frame.subsurface(0, 0, 40, 50)
        # pygame.image.load('images/middle.png')
        self.rect = self.image.get_rect()
        self.rect.x = random.random() * (self.screen_rect.width - 100) + 50
        self.life = 5
        self.speed = 2
        self.bullet_num = 1
        self.direction = True if random.random() > 0.5 else False

    def burning(self):
        # 因为主程序刷新太快,这里使用计数
        self.count += 1
        if self.count >= 6:
            self.count = 0
            if self.curr_frame <= 5:
                self.curr_frame += 1
                self.image = self.frame.subsurface(0, self.curr_frame * 50, 40, 50)

class Enemy_big(Enemy):
    def __init__(self, pw):
        super().__init__(pw)
        self.frame = pygame.image.load('images/big_frame.png').convert_alpha()
        self.curr_frame = 0
        self.image = self.frame.subsurface(0, 0, 50, 80)
        # pygame.image.load('images/big.png')
        self.rect = self.image.get_rect()
        self.rect.x = random.random() * (self.screen_rect.width - 100) + 50
        self.life = 10
        self.speed = 1
        self.bullet_num = 1
        self.direction = True if random.random() > 0.5 else False

    def burning(self):
        # 因为主程序刷新太快,这里使用计数
        self.count += 1
        if self.count >= 6:
            self.count = 0
            if self.curr_frame <= 6:
                self.curr_frame += 1
                self.image = self.frame.subsurface(0, self.curr_frame * 80, 50, 80)

main.py

import sys
import time
import pygame
from plane import Plane
from enemy import *
from bullet import *

class PlaneWar:
    # 主场景的类
    def __init__(self):
        pygame.init()  # 游戏环境的初始化
        self.screen = pygame.display.set_mode((480, 800))
        self.screen.fill('#C2C7C8')
        pygame.display.set_caption('**保卫祖国**')
        # 定义背景图和初始位置
        self.background = pygame.image.load('images/bg.jpg')
        self.position = -1600

        self.shoot_sound = pygame.mixer.Sound('images/shoot.mp3')
        self.small_sound = pygame.mixer.Sound('images/explosion1.mp3')
        self.middle_sound = pygame.mixer.Sound('images/explosion2.wav')
        self.big_sound = pygame.mixer.Sound('images/explosion3.wav')

        self.plane = Plane(self)  # 定义飞机类

        self.enemies=pygame.sprite.Group()#定义敌机数组
        self.bullets=pygame.sprite.Group()
        self.time_count=0

        bullet=Bullet(self)
        self.bullets.add(bullet)

    def _create_enemy(self):
        if len(self.enemies)%10==9:
            big=Enemy_big(self)
            self.enemies.add(big)
        elif len(self.enemies)%5==4:
            middle=Enemy_middle(self)
            self.enemies.add(middle)
        else:
            small=Enemy_small(self)
            self.enemies.add(small)

    def run_game(self):
        while True:
            self.time_count+=1
            if self.time_count>=100 and len(self.enemies)<=50:
                self._create_enemy()
                self.time_count=0
            self.check_events()

            self.plane.update()
            self.update_screen()
            time.sleep(0.01)  # 每0.01s循环一次

    def check_events(self):
        for event in pygame.event.get():  # 检测用户的动作
            if event.type == pygame.QUIT:  # 用户点击退出
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.plane.moving_right = True
                elif event.key == pygame.K_LEFT:
                    self.plane.moving_left = True
                if event.key == pygame.K_UP:
                    self.plane.moving_up = True
                elif event.key == pygame.K_DOWN:
                    self.plane.moving_down = True
                elif event.key==pygame.K_SPACE:
                    bullet=Bullet(self)
                    self.bullets.add(bullet)
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.plane.moving_right = False
                elif event.key == pygame.K_LEFT:
                    self.plane.moving_left = False
                if event.key == pygame.K_UP:
                    self.plane.moving_up = False
                elif event.key == pygame.K_DOWN:
                    self.plane.moving_down = False
            # 游戏启动

    def update_screen(self):
        # 背景图向下移动,当图移到窗口位置,从头开始
        self.position = (self.position + 1) if self.position < 0 else -1600
        self.screen.blit(self.background, (0, self.position))
        self.plane.update()
        self.plane.draw_place()
        self.enemies.update()
        for b1 in self.bullets.copy():
            if b1.rect.y<=0:
                self.bullets.remove(b1)
        self.bullets.update()

        #pygame.sprite.groupcollide(self.bullets,self.enemies,True,True)
        for enemy in self.enemies:
            if not enemy.dead:
                if pygame.sprite.spritecollide(enemy,self.bullets,True):
                    enemy.beshot()
                    if enemy.life <= 0:
                        if enemy.__class__.__name__ == 'Enemy_small':
                            self.small_sound.play()
                        elif enemy.__class__.__name__ == 'Enemy_middle':
                            self.middle_sound.play()
                        elif enemy.__class__.__name__ == 'Enemy_big':
                            self.big_sound.play()
            else:
                enemy.burning()

        self.enemies.draw(self.screen)
        self.bullets.draw(self.screen)
        pygame.display.update()  # 窗口刷新


if __name__ == '__main__':
    pw = PlaneWar()
    pw.run_game()

文件提取:

 

打开后将整个文件夹放入一个目录

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/957879.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号