當我給表弟用python寫了個雷霆戰機后...


雷霆戰機大家都玩過吧,就這種的

在這里插入圖片描述
 
才讀小學的表弟,一到周末就打擾我上分,別人都是三年高考五年模擬,那我不一樣,我直接給他寫了個游戲自己到一邊玩去,總不能教他爬蟲吧,小小年紀不合適~

在這里插入圖片描述

 

一、准備工作

使用的軟件版本:

  • Python3.6
  • pycharm2019 專業版

你們用其它的也可以,沒有軟件的話我放在最后面了

這兩個模塊安裝一下

  • pygame
  • random

win+r打開運行框輸入cmd,按回車打開命令提示符窗口,輸入pip install 空格加上你要安裝的模塊,下載慢的話就換一下國內鏡像源,因為它默認下載的是國外的,所以會慢一點。

 

在這里插入圖片描述

 

我們要准備這些東西


1、字體文件


在這里插入圖片描述

2、背景音樂文件


在這里插入圖片描述

3、背景圖片

在這里插入圖片描述

可以自己設計,自己准備,名字改成一樣的就好了。


當然,你也可以改成其他名字,但是代碼里的名字你也得改,就挺麻煩的。

 

但是我呢也給大家都准備好了,直接保存就好了↓↓↓

網盤提取碼:qwer

 

在這里插入圖片描述

二、代碼展示

算了我直接放代碼吧,有點長,你們肯定堅持不下去看,我都放注釋里去講,這樣你們才看的下去。

在這里插入圖片描述

 
#導入模塊
import pygame, os
import time
import random
from pygame.sprite import Sprite
from pygame.sprite import Group


def fire_music():
    pass
    # 設置開火音樂
    # effect = pygame.mixer.Sound('sounds/fire.wav')
    # pygame.mixer.Sound.play(effect)

class Boss(Sprite):
    def __init__(self,boss_img_name):
        super().__init__()
        # 加載BOSS圖片
        self.image = pygame.image.load('圖片/'+boss_img_name+'.png').convert_alpha()
        # 轉換BOSS大小
        # self.image = pygame.transform.scale(self.image, (1, 12))
        # 生成BOSS矩形框架
        self.rect = self.image.get_rect()
        self.blood = 1000
        # boss左右移動的速度
        self.speed = 3.5

    def move(self):
        if self.rect.centerx>=512:
            self.speed =-self.speed
        if self.rect.centerx<=0:
            self.speed = -self.speed
        self.rect.centerx +=self.speed



class Enemy(Sprite):
    def __init__(self,screen):
        # 必須設置繼承精靈 不然在使用精靈函數時會報錯
# 我還給大家准備了這些資料,直接在群里就可以免費領取了。
     # 一群:872937351 (群滿了的話加二群)
# 二群:924040232
# python學習路線匯總
# 精品Python學習書籍100本
# Python入門視頻合集
# Python實戰案例
# Python面試題
# Python相關軟件工具/pycharm永久激活
    
        super().__init__()
        # 獲取屏幕對象
        self.screen = screen
        # 隨機 生成5個編號
        alien_num = random.randint(1,5)
        # 隨機 加載五個飛機中的某個
        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))
        # 獲取飛機的 rect
        self.rect = self.image.get_rect()
        # 擊落本機獲得的分數
        self.score = 10
        # 加載子彈的圖片
        self.bullet_img = pygame.image.load("圖片/alien_bullet.png").convert_alpha()
        self.bullet_img = pygame.transform.scale(self.bullet_img, (12, 12))
        # 以下為可以調節子彈尺寸的代碼
        # picture = pygame.transform.scale(picture, (1280, 720))
        #飛機的移動速度
        self.speed = random.randint(3,5)

        #生成子彈精靈組合
        self.bullets = Group()
        # 敵機射擊頻率
        self.shoot_frequency = 0

    # 飛機出現
    def move(self):
        self.rect.top += 5
        #暫時不用射擊
        # self.shoot()
        # self.moveBullet()
    # 發射子彈
    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
    # 刪除子彈
    def moveBullet(self):
        for bullet in self.bullets:
            bullet.move()
            if bullet.rect.bottom < 0:
                self.bullets.remove(bullet)
    # 繪制子彈
    def drawBullets(self, scr):
        self.bullets.draw(scr)


class Enemy_Bullet(pygame.sprite.Sprite):
    def __init__(self, init_pos):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("圖片/alien_bullet.png").convert_alpha()
        self.image = pygame.transform.scale(self.image, (12, 12))
        self.rect = self.image.get_rect()
        # 敵機子彈初始位置設置
        self.rect.midbottom = init_pos
        self.rect.centery +=36
        self.speed = 8

    def move(self):
        self.rect.top += self.speed
class MyHero(Sprite):
    _rate = 100 # 每幀停留的毫秒數
    def __init__(self,screen,size = 1):
        super().__init__()
        # 獲取屏幕對象
        self.screen = screen
        # 獲取整張圖片
        self.image_big = pygame.image.load('圖片/hero.png').convert_alpha()
        # subsurface 形成大圖的子表面框架
        # 獲取飛機正面圖片
        self.image = self.image_big.subsurface(pygame.Rect(120, 0, 318 - 240, 87))
        # 獲取飛機正面矩形框架尺寸
        self.rect = self.image.get_rect()
        # 獲取屏幕對象矩形
        self.screen_rect = screen.get_rect()
        # 獲取屏幕正中x坐標
        self.rect.centerx = self.screen_rect.centerx
        # 獲取屏幕底部y坐標
        self.rect.centery = self.screen_rect.bottom - self.rect.height
        # 設置飛機初始位置
        self.centerX = float(self.rect.centerx)
        self.centerY = float(self.rect.centery)
        # 飛機尾焰
        self.air = None
        # 設置飛機尾焰位置
        self.air_rect = pygame.Rect(self.centerX - 20,self.centerY+int((self.rect.height+72)/2)-10-36,40,72)

        #玩家所有發射子彈的集合
        self.bullets = Group()
        self.bullet_image = pygame.image.load('圖片/bullet_1.png').convert_alpha()

    # 子彈射擊
    def shoot(self):
        # 產生一顆子彈實例
        bullet = Bullet(self.bullet_image,self.rect.midtop)
        # 在group子彈精靈集合中加入子彈
        self.bullets.add(bullet)
    # 子彈刪除
    def moveBullet(self):
        # 逐個檢查子彈精靈集合 到達屏幕頂端的子彈刪除
        for bullet in self.bullets:
            bullet.move()
            if bullet.rect.bottom < 0:
                self.bullets.remove(bullet)
    # 子彈顯示
    def drawBullets(self, scr):
        # 將精靈集合中的子彈繪制到屏幕上
        self.bullets.draw(scr)



    # 向上飛時,增加噴射火焰
    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

    # 根據移動方向獲取飛機移動狀態的圖片
    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


# 初始化pygame
pygame.init()
# pygame.mixer.init()
# pygame.mixer_music.load('sounds/enviro.mp3') # 加載播放音樂
# pygame.mixer.music.play(-1) #-1 為循環播放
# 設置游戲主題
pygame.display.set_caption('雷電飛機')
# 初始化屏幕大小
screen = pygame.display.set_mode((512,768))

# 設置游戲背景圖片
# 游戲剛開始時的背景圖
bg_img0 = pygame.image.load('圖片/start_bg.jpg').convert()
# 加載游戲開始圖標
start_img = pygame.image.load('圖片/start.png').convert_alpha()
start_rect = start_img.get_rect()
start_rect.centerx = 262
start_rect.centery = 455
#  游戲進行中的背景圖
bg_img1 = pygame.image.load('圖片/map1.jpg').convert()
bg_img2 = bg_img1.copy()
# 游戲結束時的背景圖
bg_img3 = pygame.image.load('圖片/map3.jpg').convert()
# 加載游戲結束圖標
gameover_img = pygame.image.load('圖片/gameover.png').convert_alpha()
# 加載游戲成功圖標
gamesuccess = pygame.image.load('圖片/success.png').convert_alpha()

# 加載重玩圖標
restart_img = pygame.image.load('圖片/restart.png').convert_alpha()
restart_rect = restart_img.get_rect()
restart_rect.centerx = 249
restart_rect.centery = 420
# 背景圖片初始位置
pos_y1 = -768
pos_y2 = 0

# 實例化BOSS
boss = Boss('boss_1')
bosses = Group()
bosses.add(boss)
# 測試主角圖片
# 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))

# 生成我方飛機
student_plane = MyHero(screen)

# 生成敵方飛機
# 生成敵機group
enemies = Group()
# 生成敵機子彈
enemy_bullets = Group()
max_enemies = 9  # 設置敵機數量總數為9
# 敵機隨機出現的節奏 下方randint參數 為43,55
ran1,ran2 = 30,40


# 生成計時頻率變量
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


        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)

 

三、效果展示

我們來看看運行效果,玩的有點菜

 

在這里插入圖片描述

兄弟們,代碼我都直接給你們了,看完點個贊轉發一下唄~

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM