In my spare time, I learned the basics of Python, and then I updated the Python crawler series. The code is boring, I added a lot of fun emojis, hahaha!

Introduction: It is not difficult to master The object oriented thought of Pyhton. Grasp the object oriented can try to write this project, consolidate learning object oriented!

References:

  • B battle of the Turtle planes

Source code and materials (pictures, audio) can be downloaded from the following Baidu web disk:

  • Link: pan.baidu.com/s/1E3kk5g0K… Extraction code: 2DkR

Forever!

@TOC

1. Effect Display:

Run the program in the main function page to achieve the effect

2. Game Description:

  1. The enemy has a total of three types of aircraft, divided into high, middle and low speed;
  2. The range of the bullet is not full screen, but about 80% of the screen length;
  3. It takes 1 bullet to kill a small plane, 8 bullets to kill a medium plane, and 20 bullets to kill a large plane.
  4. 1000 points for each small aircraft destroyed, 6000 points for medium aircraft, 10000 points for large aircraft;
  5. There is a random item supply every 30 seconds, divided into two items, full screen bombs and double bullets;
  6. Full screen bombs can hold a maximum of three, and double bullets last 18 seconds;
  7. The game will gradually increase the difficulty based on the score, with the increase in the number of planes and the increase in speed.

3. Main program

Combine multiple modules to combine bullet, enemy, supply, and aircraft Settings written together

# Import several common libraries and modules as well as my own bullet module, supplies such as...
import pygame
import sys
import traceback
from pygame.locals import *
import myplane
import enemy
import bullet
import supply
import random

pygame.init()
bg_size = width, height = 400.700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("Plane wars.")

background = pygame.image.load("plane/images/background.png").convert()

BLACK = (0.0.0)
GREEN = (0.255.0)
RED = (255.0.0)
WHITE = (255.255.255)

Load the game music
pygame.mixer.music.load("plane/sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("plane/sound/bullet.wav")
bullet_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("plane/sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("plane/sound/supply.wav")
supply_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("plane/sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("plane/sound/get_bullet.wav")
get_bullet_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("plane/sound/upgrade.wav")
upgrade_sound.set_volume(0.2)
enemy3_fly_sound = pygame.mixer.Sound("plane/sound/enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("plane/sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("plane/sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("plane/sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound("plane/sound/me_down.wav")
me_down_sound.set_volume(0.2)


# Define three functions to increase enemy aircraft
def add_small_enemies(group1, group2, num) :
    for i in range(num):
        e1 = enemy.SmallEnemy(bg_size)
        group1.add(e1)
        group2.add(e1)


def add_mid_enemies(group1, group2, num) :
    for i in range(num):
        e1 = enemy.MidEnemy(bg_size)
        group1.add(e1)
        group2.add(e1)


def add_big_enemies(group1, group2, num) :
    for i in range(num):
        e1 = enemy.BigEnemy(bg_size)
        group1.add(e1)
        group2.add(e1)


def inc_speed(target, inc) :
    for each in target:
        each.speed += inc



def main() :
    global each
    pygame.mixer.music.play(-1)

    clock = pygame.time.Clock()

    # Index of shot pictures
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

    me = myplane.MyPlane(bg_size)

    enemies = pygame.sprite.Group()

    Spawn enemy small planes
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 15)

    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 5)

    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 1)

    running = True
    switch_image = True
    delay = 100
    score = 0
    score_font = pygame.font.Font("plane/font/font.ttf".36)

    bullets = []

    Spawn normal bullets
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 4
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    # Lives
    life_image = pygame.image.load("plane/images/life.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    # End of game screen
    gameover_font = pygame.font.Font("plane/font/font.ttf".48)
    again_image = pygame.image.load("plane/images/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("plane/images/gameover.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    DOUBLE_BULLET_TIME = USEREVENT + 1

    # Remove the invincible status of our aircraft
    INVINCEBLE_TIME = USEREVENT + 2

    # Spawn super bullets
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 8
    for i in range(BULLET2_NUM // 2):
        bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))
        bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))

    # Flag if super bullets are used
    is_double_bullet = False

    level = 1

    # Fullscreen bomb
    bomb_image = pygame.image.load("plane/images/bomb.png").convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font("plane/font/font.ttf".48)
    bomb_num = 3

    Release a supply pack every 30 seconds
    bullet_supply = supply.Bullet_Supply(bg_size)
    bomb_supply = supply.Bomb_Supply(bg_size)
    SUPPLY_TIME = USEREVENT
    pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)

    # Prevent repeated reading of the score file
    recorded = False

    # flag whether to pause the game
    paused = False
    paused_nor_image = pygame.image.load("plane/images/pause_nor.png").convert_alpha()
    pause_pressed_image = pygame.image.load("plane/images/pause_pressed.png").convert_alpha()
    resume_nor_image = pygame.image.load("plane/images/resume_nor.png").convert_alpha()
    resume_pressed_image = pygame.image.load("plane/images/resume_pressed.png").convert_alpha()
    paused_rect = paused_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10.10
    paused_image = paused_nor_image

    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and paused_rect.collidepoint(event.pos):
                    paused = not paused
                    if paused:
                        pygame.time.set_timer(SUPPLY_TIME, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                        paused_image = resume_pressed_image
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()
                        paused_image = pause_pressed_image
            elif event.type == MOUSEMOTION:
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = pause_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = paused_nor_image
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    if bomb_num:
                        bomb_num -= 1
                        bomb_sound.play()
                        for each in enemies:
                            if each.rect.bottom > 0:
                                each.active = False
            elif event.type == SUPPLY_TIME:
                supply_sound.play()
                if random.choice([True.False]):
                    bomb_supply.reset()
                else:
                    bullet_supply.reset()
            elif event.type == DOUBLE_BULLET_TIME:
                is_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)
            elif event.type == INVINCEBLE_TIME:
                me.invincible = False
                pygame.time.set_timer(INVINCEBLE_TIME, 0)

        # Increase difficulty based on the user's score
        if level == 1 and score > 50000:
            level = 2
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            inc_speed(small_enemies, 1)
        elif level == 2 and score > 300000:
            level = 3
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 3 and score > 500000:
            level = 4
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 4 and score > 1000000:
            level = 5
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)

        screen.blit(background, (0.0))

        if life_num and not paused:
            Draw full screen bomb supply and check if it is obtained
            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(bomb_supply, me):
                    get_bomb_sound.play()
                    if bomb_num < 3:
                        bomb_num += 1
                    bomb_supply.active = False

            # Fire bullets
            if not (delay % 10):
                bullet_sound.play()
                if is_double_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset((me.rect.centerx - 33, me.rect.centery))
                    bullets[bullet2_index + 1].reset((me.rect.centerx + 33, me.rect.centery))
                    bullet2_index = (bullet2_index + 2) % BULLET2_NUM
                else:
                    bullets = bullet1
                    bullets[bullet1_index].reset(me.rect.midtop)
                    bullet1_index = (bullet1_index + 1) % BULLET1_NUM

            Check if bullets hit enemy planes
            for b in bullets:
                if b.active:
                    b.move()
                    screen.blit(b.image, b.rect)
                    enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)
                    if enemy_hit:
                        b.active = False
                        for e in enemy_hit:
                            if e in mid_enemies or e in big_enemies:
                                e.hit = True
                                e.energy -= 1
                                if e.energy == 0:
                                    e.active = False
                            else:
                                e.active = False

            Draw full screen bomb supply and check if it is obtained
            if bullet_supply.active:
                bullet_supply.move()
                screen.blit(bullet_supply.image, bullet_supply.rect)
                if pygame.sprite.collide_mask(bullet_supply, me):
                    get_bullet_sound.play()
                    is_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
                    bullet_supply.active = False

            # Draw large enemy aircraft
            for each in big_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        if switch_image:
                            screen.blit(each.image1, each.rect)
                        else:
                            screen.blit(each.image2, each.rect)
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play(-1)

                    # Draw blood tank
                    pygame.draw.line(screen, BLACK,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     2)

                    energy_remain = each.energy / enemy.BigEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.left + each.rect.width * energy_remain,
                                      each.rect.top - 5),
                                     2)

                else:
                    if not (delay % 3) :if e3_destroy_index == 0:
                            enemy3_down_sound.play()
                        screen.blit(each.destroy_images[e3_destroy_index], each.rect)
                        e3_destroy_index = (e3_destroy_index + 1) % 6
                        if e3_destroy_index == 0:
                            me_down_sound.stop()
                            score += 10000
                            each.reset()

            Draw medium enemy aircraft
            for each in mid_enemies:
                if each.active:
                    each.move()

                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image1, each.rect)

                    # Draw blood tank
                    pygame.draw.line(screen, BLACK,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     2)

                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.left + each.rect.width * energy_remain,
                                      each.rect.top - 5),
                                     2)
                else:
                    if not (delay % 3) :if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index], each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        if e2_destroy_index == 0:
                            score += 5000
                            each.reset()

            Draw small enemy planes
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image1, each.rect)
                else:
                    if not (delay % 3) :if e1_destroy_index == 0:
                            enemy1_down_sound.play()
                        screen.blit(each.destroy_images[e1_destroy_index], each.rect)
                        e1_destroy_index = (e1_destroy_index + 1) % 4
                        if e1_destroy_index == 0:
                            score += 1000
                            each.reset()

            key_pressed = pygame.key.get_pressed()
            if key_pressed[K_w] or key_pressed[K_UP]:
                me.moveUp()
            if key_pressed[K_s] or key_pressed[K_DOWN]:
                me.moveDown()
            if key_pressed[K_a] or key_pressed[K_LEFT]:
                me.moveLeft()
            if key_pressed[K_d] or key_pressed[K_RIGHT]:
                me.moveRight()

            # Check whether our plane has been hit
            enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
            if enemies_down and not me.invincible:
                me.active = False
                for e in enemies_down:
                    e.active = False

            # Draw our aircraft
            if me.active:
                if switch_image:
                    screen.blit(me.image1, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                me_down_sound.play()
                if not (delay % 3):
                    screen.blit(each.destroy_images[me_destroy_index], each.rect)
                    me_destroy_index = (me_destroy_index + 1) % 4
                    # Number of lives left
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCEBLE_TIME, 3 * 1000)

            # Draw the number of remaining bombs
            bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE)
            text_rect = bomb_text.get_rect()
            screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
            screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))

            if life_num:
                for i in range(life_num):
                    screen.blit(life_image,
                                (width - 10 - (i + 1) * life_rect.width,
                                 height - 10 - life_rect.height))

            score_text = score_font.render(str("Score: %s" % score), True, WHITE)
            screen.blit(score_text, (10.5))
        elif life_num == 0:
            pygame.mixer.music.stop()
            pygame.mixer.stop()

            # Stop distributing supplies
            pygame.time.set_timer(SUPPLY_TIME, 0)

            if not recorded:
                recorded = True
                # Get the highest score in history
                with open("plane/record/record.txt"."r") as f:
                    record_score = int(f.read())

                if score > record_score:
                    with open("plane/record/record.txt"."w") as f:
                        f.write(str(score))

            # Draw the end screen
            record_score_text = score_font.render("Best: %d" % record_score, True, WHITE)
            screen.blit(record_score_text, (50.50))

            gameover_text1 = gameover_font.render("Your Score: ".True, WHITE)
            gameover_text1_rect = gameover_text1.get_rect()
            gameover_text1_rect.left, gameover_text1_rect.top = \
                (width - gameover_text1_rect.width) // 2, height // 2
            screen.blit(gameover_text1, gameover_text1_rect)

            gameover_text2 = gameover_font.render(str(score), True, WHITE)
            gameover_text2_rect = gameover_text2.get_rect()
            gameover_text2_rect.left, gameover_text2_rect.top = \
                (width - gameover_text2_rect.width) // 2, \
                gameover_text1_rect.bottom + 10
            screen.blit(gameover_text2, gameover_text2_rect)

            again_rect.left, again_rect.top = \
                (width - again_rect.width) // 2, \
                gameover_text2_rect.bottom + 50
            screen.blit(again_image, again_rect)

            gameover_rect.left, gameover_rect.top = \
                (width - again_rect.width) // 2, \
                again_rect.bottom + 10
            screen.blit(gameover_image, gameover_rect)

            # Detect user mouse actions
            # If the user presses the left mouse button
            if pygame.mouse.get_pressed()[0]:
                pos = pygame.mouse.get_pos()
                if again_rect.left < pos[0] < again_rect.right and \
                        again_rect.top < pos[1] < again_rect.bottom:
                    main()
                elif gameover_rect.left < pos[0] < gameover_rect.right and \
                        gameover_rect.top < pos[1] < gameover_rect.bottom:
                    pygame.quit()
                    sys.exit()

        screen.blit(paused_image, paused_rect)

        # Toggle images
        if not (delay % 5):
            switch_image = not switch_image

        delay -= 1
        if not delay:
            delay = 100

        pygame.display.flip()
        clock.tick(60)


if __name__ == "__main__":
    try:
        main()
    except SystemExit:
        pass
    except:
        traceback.print_exc()
        pygame.quit()
        input(a)Copy the code

4. Bullet module

import pygame


class Bullet1(pygame.sprite.Sprite) :    # Define a Bullet1 Sprite that inherits the PyGame module, the Sprite class
    def __init__(self, position) :   # define the constructor and inherit the constructor from the Sprite.Sprite class
        pygame.sprite.Sprite.__init__(self)
# Define your genus
        self.image = pygame.image.load("plane/images/bullet1.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = position
        self.speed = 12
        self.active = True
        self.mask = pygame.mask.from_surface(self.image)

# Define bullet movement
    def move(self) :
        self.rect.top -= self.speed

        if self.rect.top < 0:
            self.active = False

    def reset(self, position) :
        self.rect.left, self.rect.top = position
        self.active = True

# Define a second bullet class and inherit the PyGame.sprite.Sprite class
class Bullet2(pygame.sprite.Sprite) :
    def __init__(self, position) :   # define the constructor
        pygame.sprite.Sprite.__init__(self) # and inherit the constructor from the Sprite.Sprite class

# instantiate the second bullet type
        self.image = pygame.image.load("plane/images/bullet2.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = position
        self.speed = 14
        self.active = True
        self.mask = pygame.mask.from_surface(self.image)
# same as above
    def move(self) :
        self.rect.top -= self.speed

        if self.rect.top < 0:
            self.active = False
# same as above
    def reset(self, position) :
        self.rect.left, self.rect.top = position
        self.active = True
Copy the code

5. Enemy aircraft module

import pygame
from random import * Import all modules in the random library


SmallEnemy = pyGame.sprite; SmallEnemy = PyGame.sprite
class SmallEnemy(pygame.sprite.Sprite) :
    def __init__(self, bg_size) :    # define the constructor, passing in the bg_size argument
        pygame.sprite.Sprite.__init__(self)     # inherit the constructor of PyGame.sprite

# instantiate the genus type, that is, assign
        self.image1 = pygame.image.load("plane/images/enemy1.png").convert_alpha()
        self.destroy_images = []
        # After the enemy plane exploded
        self.destroy_images.extend([
            pygame.image.load("plane/images/enemy1_down1.png").convert_alpha(),
            pygame.image.load("plane/images/enemy1_down2.png").convert_alpha(),
            pygame.image.load("plane/images/enemy1_down3.png").convert_alpha(),
            pygame.image.load("plane/images/enemy1_down4.png").convert_alpha(),
        ])
        self.rect = self.image1.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.speed = 2
        self.active = True
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-5 * self.height, 0)
        self.mask = pygame.mask.from_surface(self.image1)

    def move(self) :
        if self.rect.top < self.height:
            self.rect.top += self.speed
        else:
            self.reset()

    def reset(self) :
        self.active = True
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-5 * self.height, 0)

# same as above
class MidEnemy(pygame.sprite.Sprite) :
    energy = 8

    def __init__(self, bg_size) :
        pygame.sprite.Sprite.__init__(self)

        self.image1 = pygame.image.load("plane/images/enemy2.png").convert_alpha()
        self.image_hit = pygame.image.load("plane/images/enemy2_hit.png").convert_alpha()
        self.destroy_images = []
        self.destroy_images.extend([
            pygame.image.load("plane/images/enemy2_down1.png").convert_alpha(),
            pygame.image.load("plane/images/enemy2_down2.png").convert_alpha(),
            pygame.image.load("plane/images/enemy2_down3.png").convert_alpha(),
            pygame.image.load("plane/images/enemy2_down4.png").convert_alpha(),
        ])
        self.rect = self.image1.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.speed = 1
        self.active = True
        self.hit = False
        self.energy = MidEnemy.energy
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-5 * self.height, -self.height)
        self.mask = pygame.mask.from_surface(self.image1)

    def move(self) :
        if self.rect.top < self.height:
            self.rect.top += self.speed
        else:
            self.reset()

    def reset(self) :
        self.active = True
        self.energy = MidEnemy.energy
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-8 * self.height, -self.height)
# same as above

class BigEnemy(pygame.sprite.Sprite) :
    energy = 20

    def __init__(self, bg_size) :
        pygame.sprite.Sprite.__init__(self)

        self.image1 = pygame.image.load("plane/images/enemy3_n1.png").convert_alpha()
        self.image2 = pygame.image.load("plane/images/enemy3_n2.png").convert_alpha()
        self.image_hit = pygame.image.load("plane/images/enemy3_hit.png").convert_alpha()
        self.destroy_images = []
        self.destroy_images.extend([
            pygame.image.load("plane/images/enemy3_down1.png").convert_alpha(),
            pygame.image.load("plane/images/enemy3_down2.png").convert_alpha(),
            pygame.image.load("plane/images/enemy3_down3.png").convert_alpha(),
            pygame.image.load("plane/images/enemy3_down4.png").convert_alpha(),
            pygame.image.load("plane/images/enemy3_down5.png").convert_alpha(),
            pygame.image.load("plane/images/enemy3_down6.png").convert_alpha(),
        ])
        self.rect = self.image1.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.speed = 1
        self.active = True
        self.hit = False
        self.energy = BigEnemy.energy
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-10 * self.height, -5 * self.height)
        self.mask = pygame.mask.from_surface(self.image1)

    def move(self) :
        if self.rect.top < self.height:
            self.rect.top += self.speed
        else:
            self.reset()

    def reset(self) :
        self.energy = BigEnemy.energy
        self.active = True
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-10 * self.height, -5 * self.height)

Copy the code

6. Custom aircraft modules

import pygame

# Define your own plane, very similar to the previous ones
class MyPlane(pygame.sprite.Sprite) :
    def __init__(self, bg_size) :
        pygame.sprite.Sprite.__init__(self)

        self.image1 = pygame.image.load("plane/images/me1.png").convert_alpha()
        self.image2 = pygame.image.load("plane/images/me2.png").convert_alpha()
        self.destroy_image = []
        self.destroy_image.extend([
            pygame.image.load("plane/images/me_destroy_1.png").convert_alpha(),
            pygame.image.load("plane/images/me_destroy_2.png").convert_alpha(),
            pygame.image.load("plane/images/me_destroy_3.png").convert_alpha(),
            pygame.image.load("plane/images/me_destroy_4.png").convert_alpha(),
        ])
        self.active = True
        self.rect = self.image1.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.rect.left, self.rect.top = \
            (self.width - self.rect.width) // 2, \
            self.height - self.rect.height - 60
        self.speed = 10
        self.mask = pygame.mask.from_surface(self.image1)
        self.invincible = False

    def moveUp(self) :
        if self.rect.top > 0:
            self.rect.top -= self.speed
        else:
            self.rect.top = 0

    def moveDown(self) :
        if self.rect.bottom < self.height - 60:
            self.rect.top += self.speed
        else:
            self.rect.bottom = self.height - 60

    def moveLeft(self) :
        if self.rect.left > 0:
            self.rect.left -= self.speed
        else:
            self.rect.left = 0

    def moveRight(self) :
        if self.rect.right < self.width:
            self.rect.left += self.speed
        else:
            self.rect.right = self.width

    def reset(self) :
        self.rect.left, self.rect.top = \
            (self.width - self.rect.width) // 2, \
            self.height - self.rect.height - 60
        self.active = True
        self.invincible = True
Copy the code

7. Supply module

import pygame
from random import *

# define the supply class, and the previous several are also very similar, are inherited assignment
class Bullet_Supply(pygame.sprite.Sprite) :
    def __init__(self, bg_size) :
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("plane/images/bullet_supply.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.rect.left, self.rect.bottom = \
            randint(0, self.width - self.rect.width), -100
        self.speed = 5
        self.active = False
        self.mask = pygame.mask.from_surface(self.image)

    def move(self) :
        if self.rect.top < self.height:
            self.rect.top += self.speed
        else:
            self.active = False

    def reset(self) :
        self.active = True
        self.rect.left, self.rect.bottom = \
            randint(0, self.width - self.rect.width), -100


class Bomb_Supply(pygame.sprite.Sprite) :
    def __init__(self, bg_size) :
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("plane/images/bomb_supply.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.rect.left, self.rect.bottom = \
            randint(0, self.width - self.rect.width), -100
        self.speed = 5
        self.active = False
        self.mask = pygame.mask.from_surface(self.image)

    def move(self) :
        if self.rect.top < self.height:
            self.rect.top += self.speed
        else:
            self.active = False

    def reset(self) :
        self.active = True
        self.rect.left, self.rect.bottom = \
            randint(0, self.width - self.rect.width), -100
Copy the code

8. Some details

  • Paths are prone to error, and the easiest way to do this is to write absolute paths!
  • The rest is pretty simple. It’s all about mastering the whole idea