[Python game] Use Python to make a Thunder fighter game (with material and original code)

foreword

hello, everyone

Many friends have been asking me for some game codes before

So here comes this article

module preparation

import pygame, os
import time
import random

material preparation

Please add a picture description

Need source code. Material. Click to get it (Note: Su)

Implementation code

Preparation

  • set fire music
 effect = pygame.mixer.Sound('sounds/fire.wav')
 pygame.mixer.Sound.play(effect)
  • Load BOSS picture
  self.image = pygame.image.load('图片/'+boss_img_name+'.png').convert_alpha()
  • Convert boss size
self.image = pygame.transform.scale(self.image, (1, 12))
  • Generate BOSS rectangular frame
self.rect = self.image.get_rect()
self.blood = 1000
  • The speed at which the boss moves left and right
self.speed = 3.5
  • Set the inherited sprite
    The inherited sprite must be set, otherwise an error will be reported when using the sprite function
super().__init__()
  • get screen object
self.screen = screen
  • Randomly generate 5 numbers
alien_num = random.randint(1,5)
  • Randomly load one of five aircraft
self.image = pygame.image.load('图片/alien_' + str(alien_num) + '.png')
# picture = pygame.transform.scale(picture, (1280, 720))
self.image = pygame.transform.scale(self.image,(62,62))
  • Get the rect of the plane
self.rect = self.image.get_rect()
  • Scores for shooting down this unit
  self.score = 10

bullet part

  • picture of loaded bullet
self.bullet_img = pygame.image.load("图片/alien_bullet.png").convert_alpha()
self.bullet_img = pygame.transform.scale(self.bullet_img, (12, 12))
  • Code to adjust bullet size
picture = pygame.transform.scale(picture, (1280, 720))
  • Generating bullet sprite combinations
self.bullets = Group()
  • frequency of enemy aircraft firing
self.shoot_frequency = 0
  • the plane appeared
def move(self):
    self.rect.top += 5
  • don't shoot for now
 self.shoot()
 self.moveBullet()
  • fire bullets
def shoot(self):
    if self.shoot_frequency % 200 == 0:
        bullet = Enemy_Bullet(self.bullet_img, self.rect.midbottom)
        self.bullets.add(bullet)
    self.shoot_frequency += 1
    if self.shoot_frequency > 200:
        self.shoot_frequency = 1
  • delete bullet
def moveBullet(self):
    for bullet in self.bullets:
        bullet.move()
        if bullet.rect.bottom < 0:
            self.bullets.remove(bullet)
  • draw bullet
def drawBullets(self, scr):
    self.bullets.draw(scr)
  • Initial position setting of enemy aircraft bullets
self.rect.midbottom = init_pos
self.rect.centery +=36
self.speed = 8

airplane pictures

  • get screen object
self.screen = screen
  • get the whole picture
self.image_big = pygame.image.load('图片/hero.png').convert_alpha()
# subsurface 形成大图的子表面框架
  • Get the picture of the front of the plane
self.image = self.image_big.subsurface(pygame.Rect(120, 0, 318 - 240, 87))
  • Get the dimensions of the plane's front rectangular frame
self.rect = self.image.get_rect()
  • Get screen object rectangle
self.screen_rect = screen.get_rect()
  • Get the x-coordinate of the center of the screen
self.rect.centerx = self.screen_rect.centerx
  • Get the y coordinate of the bottom of the screen
self.rect.centery = self.screen_rect.bottom - self.rect.height
  • Set the initial position of the aircraft
self.centerX = float(self.rect.centerx)
self.centerY = float(self.rect.centery)
  • aircraft plume
self.air = None
  • Set the position of the aircraft exhaust
self.air_rect = pygame.Rect(self.centerX - 20,self.centerY+int((self.rect.height+72)/2)-10-36,40,72)
  • The collection of all bullets fired by the player
self.bullets = Group()
self.bullet_image = pygame.image.load('图片/bullet_1.png').convert_alpha()
  • bullet shooting
def shoot(self):
  • Generate a bullet instance
bullet = Bullet(self.bullet_image,self.rect.midtop)
  • Add bullets to the group bullet sprite collection
self.bullets.add(bullet)
  • bullet delete
def moveBullet(self):
  • Check the bullet sprite collection one by one to reach the top of the screen bullet delete
for bullet in self.bullets:
    bullet.move()
    if bullet.rect.bottom < 0:
        self.bullets.remove(bullet)
  • bullet display
def drawBullets(self, scr):
  • Draws bullets from the sprite collection to the screen
self.bullets.draw(scr)
  • When flying upwards, increased jet flame
def set_air(self, case):
    if case == 'up':
        air = pygame.image.load('图片/air.png').convert_alpha()
        img = air.subsurface(pygame.Rect(80, 0, 50, 87))
        self.air = img
    elif case == 'remove':
        self.air = None
  • Get the picture of the aircraft's moving state according to the moving direction
    def set_image(self, case):
        if case=='left':
            rect = pygame.Rect(195,0,318-248,87)
            image = self.image_big.subsurface(rect)
        elif case =='right':
            rect = pygame.Rect(195,0,318-248,87)
            image = pygame.transform.flip(self.image_big.subsurface(rect), True, False)
        elif case == 'up' or case == 'down':
            rect = pygame.Rect(120, 0, 318 - 240, 87)
            image = self.image_big.subsurface(rect)
        self.image = image

class Bullet(pygame.sprite.Sprite):
    def __init__(self, bullet_img, init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.rect = bullet_img.get_rect()
        self.rect.midbottom = init_pos
        self.speed = 25

    def move(self):
        self.rect.top -= self.speed

Initialize pygame

pygame.init()
# pygame.mixer.init()
# pygame.mixer_music.load('sounds/enviro.mp3') # 加载播放音乐
# pygame.mixer.music.play(-1) #-1 为循环播放

Set game theme

pygame.display.set_caption('雷电飞机')
  • Initialize screen size
screen = pygame.display.set_mode((512,768))

Set game background image

  • Background image at the beginning of the game
bg_img0 = pygame.image.load('图片/start_bg.jpg').convert()
  • load game start icon
start_img = pygame.image.load('图片/start.png').convert_alpha()
start_rect = start_img.get_rect()
start_rect.centerx = 262
start_rect.centery = 455
  • background image in game
bg_img1 = pygame.image.load('图片/map1.jpg').convert()
bg_img2 = bg_img1.copy()
  • Background image at the end of the game
bg_img3 = pygame.image.load('图片/map3.jpg').convert()
  • loading game over icon
gameover_img = pygame.image.load('图片/gameover.png').convert_alpha()
  • load game success icon
gamesuccess = pygame.image.load('图片/success.png').convert_alpha()
  • load replay icon
restart_img = pygame.image.load('图片/restart.png').convert_alpha()
restart_rect = restart_img.get_rect()
restart_rect.centerx = 249
restart_rect.centery = 420
  • background image initial position
pos_y1 = -768
pos_y2 = 0
  • Instantiate BOSS
boss = Boss('boss_1')
bosses = Group()
bosses.add(boss)
  • Test the protagonist picture
 air = pygame.image.load('图片/air.png').convert_alpha()
 img = air.subsurface(pygame.Rect(80, 0, 50, 87))
 image_big = pygame.image.load('图片/hero.png').convert_alpha()
 image = image_big.subsurface(pygame.Rect(195,0,318-248,87))

generate aircraft

  • generate our aircraft
student_plane = MyHero(screen)
  • spawn enemy aircraft
enemies = Group()
  • Generate enemy bullets
enemy_bullets = Group()
max_enemies = 9  # 设置敌机数量总数为9
  • The randint parameter below the rhythm of the random appearance of enemy planes is 43,55
ran1,ran2 = 30,40

...I'm a little tired

Directly put the source code behind with comments, if you encounter any errors or problems, you can click the business card at the end of the article

remaining code

# 生成计时频率变量
sec = 0
# 生成分数
score = 0
# 设置系统字体
my_font = pygame.font.Font('fonts/msyh.ttf', 18)

# 游戏主循环
# 设置游戏状态  开始 结束
game = 'wait'

while True:
    # 游戏在等待状态
    if game =='wait':
        # 最小游戏框架一个都不能省略
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

        # 检测鼠标是否按下 重新开始按钮
            if event.type == pygame.MOUSEBUTTONDOWN:
                # 检测鼠标点击位置是否与重启rect重叠
                if start_rect.collidepoint(event.pos):
                    student_plane.__init__(screen)
                    game = 'ing'
        # 游戏结束游戏画面暂停
        screen.blit(bg_img0, (0, 0))
        screen.blit(start_img, start_rect)
        # 测试尾焰位置
        pygame.display.flip()
        time.sleep(0.05)

    # 游戏进行状态
    elif game == 'ing':
        # 设置这3行 监听事件 并且内部设定了延迟防止游戏卡死
        # 屏幕滚动-----------------------------------------------------
        screen.blit(bg_img1, (0, pos_y1))
        screen.blit(bg_img2, (0, pos_y2))
        # 测试尾焰位置
        # screen.blit(img, (100, 100))
        pos_y1 += 1
        pos_y2 += 1
        # 屏幕背景滚动完毕后重置位置
        if pos_y1 >= 0:
            pos_y1 = -768
        if pos_y2 >= 768:
            pos_y2 = 0

python学习交流Q群:770699889 ### 源码领取

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            # 监听键盘事件
            # 按键弹起取消飞机向上尾焰 矫正飞机姿势
            if event.type == pygame.KEYUP:
                student_plane.set_image('down')
                student_plane.air = None
            # 发射子弹
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE and len(student_plane.bullets) <6: # 检查子弹集合的数量限制子弹最大数量
                    fire_music()
                    # 产生一颗子弹实例
                    # 在group子弹精灵集合中加入子弹
                    student_plane.shoot()
        # 将精灵集合中的子弹绘制到屏幕上
        student_plane.drawBullets(screen)
        # 逐个检查子弹精灵集合 到达屏幕顶端的子弹删除
        student_plane.moveBullet()

        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            # 设置飞机状态图片
            student_plane.set_image('left')
            if student_plane.rect.centerx>=40:
                student_plane.rect.centerx -=8.5

        elif keys[pygame.K_d]:
            # 设置飞机状态图片
            student_plane.set_image('right')
            if student_plane.rect.centerx <= 478:
                student_plane.rect.centerx +=8.5

        elif keys[pygame.K_w]:
            #设置飞机状态图片
            student_plane.set_image('up')
            student_plane.set_air('up')

            if student_plane.rect.centery >= 45:
                student_plane.rect.centery -=8.5

        elif keys[pygame.K_s]:
            # 设置飞机状态图片
            student_plane.set_image('down')
            if student_plane.rect.centery <= 727:
                student_plane.rect.centery +=8.5

        # 显示飞机
        screen.blit(student_plane.image,student_plane.rect)
        if student_plane.air != None:
            screen.blit(student_plane.air, (student_plane.rect.centerx-30, student_plane.rect.centery+33))

        # 敌机 ---------------------------------------------------------------------------------------

        # 敌机移动
        # 控制时间节奏 sec变量
        sec +=1
        #随机控制生成敌机的节奏
        rhy = random.randint(ran1,ran2)
        # 敌机最多数量

        if sec%rhy ==0 and len(enemies) < max_enemies or sec ==1: # 设置敌机数量总数为9
            # 生成一只敌机
            enemy = Enemy(screen)
            enemy.rect.centerx=random.randint(0,512)
            # 生成上述敌机的子弹
            enemy_bullet = Enemy_Bullet((enemy.rect.centerx,enemy.rect.centery))
            # 敌机group 和 敌机子弹group加载敌机和子弹
            enemies.add(enemy)
            enemy_bullets.add(enemy_bullet)
        # 敌机出现 和 敌机子弹出现
        enemies.draw(screen)
        enemy_bullets.draw(screen)
        # 迭代敌机集合
        for enemy in enemies:
            # 让每个对象移动起来
            enemy.move()
            # 敌机超出屏幕边界后 自动删除敌机
            collision_over1 = pygame.sprite.collide_rect(student_plane, enemy)

            if collision_over1:
                # 为了重启游戏时 防止有旧子弹和飞机存在
                enemies.remove(enemy)
                game = 'over'
            if enemy.rect.bottom >768:
                enemies.remove(enemy)
        for enemy_bullet in enemy_bullets:
            # 让每个对象移动起来
            enemy_bullet.move()

            collision_over2 = pygame.sprite.collide_rect(student_plane, enemy_bullet)
            if collision_over2:
                # 为了重启游戏时 防止有旧子弹和飞机存在
                enemy_bullets.remove(enemy_bullet)
                game = 'over'
            # 敌机子弹超出屏幕边界后 自动删除敌机
            if enemy_bullet.rect.bottom >768:
                enemy_bullets.remove(enemy_bullet)


        #  -----------------------Boss --------------------------
        if score >=140:
            # 小敌机出现的节奏
            ran1,ran2 = 15,25
            max_enemies = 17
            screen.blit(boss.image,boss.rect)
            boss.move()
            for my_bullet in student_plane.bullets:
                hit_boss = pygame.sprite.collide_rect(boss,my_bullet)
                if hit_boss:
                    boss.blood -=1.2
                    score+=1
                if boss.blood <=0:
                    game = 'success'


        # 处理碰撞    ---------------------------碰撞检测--------------------------------------------------
        #   参数:
        #   group1:精灵组1。
        #   group2:精灵组2。
        #   dokill1:发生碰撞时,是否销毁精灵组1中的发生碰撞的精灵。
        #   dokill2:发生碰撞时,是否销毁精灵组2中的发生碰撞的精灵。
        collisions = pygame.sprite.groupcollide(student_plane.bullets, enemies, True, True)
        if collisions:
            score+=10

        # -----------游戏结束------------

        # 分数和奖励的显示-------------------------------------------------------------------------
        surface1 = my_font.render(u"当前得分:%s"%(score),True,[255,0,0])
        screen.blit(surface1,[20,20])

        # 更新画面
        pygame.display.flip()
        # 设置帧数和延迟
        time.sleep(0.05)

    #游戏结束状态
    elif game == 'over':
        score = 0
        # 最小游戏框架一个都不能省略
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

        # 检测鼠标是否按下 重新开始按钮
            if event.type == pygame.MOUSEBUTTONDOWN:
                # 检测鼠标点击位置是否与重启rect重叠
                if restart_rect.collidepoint(event.pos):
                    student_plane.__init__(screen)
                    game = 'ing'

        # 游戏结束游戏画面暂停
        screen.blit(bg_img1, (0, pos_y1))
        screen.blit(bg_img2, (0, pos_y2))

        screen.blit(gameover_img, (163, 310))
        screen.blit(restart_img, restart_rect)
        # 测试尾焰位置
        # screen.blit(img, (100, 100))
        pos_y1 += 0
        pos_y2 += 0
        pygame.display.flip()
        time.sleep(0.05)
        # surface2 = my_font.render("Game Over" , True, [255, 0, 0])
        # screen.blit(surface1, [250, 350])
    elif game == 'success':
        score = 0
        boss.blood = 1000
        # 最小游戏框架一个都不能省略
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

        # 检测鼠标是否按下 重新开始按钮
            if event.type == pygame.MOUSEBUTTONDOWN:
                # 检测鼠标点击位置是否与重启rect重叠
                if restart_rect.collidepoint(event.pos):
                    student_plane.__init__(screen)
                    game = 'ing'

        # 游戏结束游戏画面暂停
        screen.blit(bg_img1, (0, pos_y1))
        screen.blit(bg_img2, (0, pos_y2))

        screen.blit(gamesuccess, (170, 220))
        screen.blit(restart_img, restart_rect)
        # 测试尾焰位置
        # screen.blit(img, (100, 100))
        pos_y1 += 0
        pos_y2 += 0
        pygame.display.flip()
        time.sleep(0.05)

Effect

Please add a picture description

at last

Today's sharing ends here

If you have any questions about the article, or other questions about python, you can leave a message in the comment area or private message me. If you think the
article I shared is good, you can follow me or give the article a thumbs up (/≧▽≦)/

Guess you like

Origin blog.csdn.net/sunanpython/article/details/128272497