最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整代碼

 更新時(shí)間:2025年11月10日 10:46:45   作者:你才是向陽(yáng)花  
不知道大家是否曾體驗(yàn)過(guò)打飛機(jī)的樂(lè)趣,或者是否曾與朋友們一起較量過(guò)這款游,這篇文章主要介紹了用Python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

飛機(jī)大戰(zhàn)是個(gè)什么樣的小游戲呢?

  • 首先我們需要有一個(gè)自己的飛機(jī),它可以在畫(huà)面上進(jìn)行上下左右移動(dòng),我們通過(guò)方向鍵來(lái)控制它的移動(dòng),我們的飛機(jī)要發(fā)射子彈,用來(lái)?yè)舸驍硻C(jī),我們用空格鍵來(lái)控制子彈的發(fā)射

  • 然后需要設(shè)置敵機(jī),隨機(jī)出現(xiàn)在畫(huà)面上,以一定的速度向下移動(dòng) 敵機(jī)和我們自己的飛機(jī)相撞時(shí)游戲結(jié)束

  • 游戲結(jié)束時(shí)統(tǒng)計(jì)得分,擊落一只敵機(jī)得10分

    至此,我們一個(gè)飛機(jī)大戰(zhàn)的小游戲就設(shè)計(jì)完成了!那么,要如何實(shí)現(xiàn)呢?

上完整代碼:

# air_shoot.py
# 飛機(jī)大戰(zhàn)小游戲

import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 屏幕大小
WIDTH, HEIGHT = 480, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("plane war")

# 顏色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 時(shí)鐘(控制幀率)
clock = pygame.time.Clock()

# 字體
font = pygame.font.SysFont("simhei", 32)  # 如果報(bào)錯(cuò),改為 None 或 "Arial"
small_font = pygame.font.SysFont("simhei", 24)

# 玩家飛機(jī)
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 10
        self.speed = 5

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

# 敵機(jī)
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.speed = random.randint(2, 5)

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.kill()  # 移出屏幕后刪除

# 子彈
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speed = -10

    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()

# 顯示文字
def draw_text(surf, text, font, x, y, color=WHITE):
    img = font.render(text, True, color)
    rect = img.get_rect()
    rect.midtop = (x, y)
    surf.blit(img, rect)

# 游戲結(jié)束畫(huà)面
def show_game_over(score):
    screen.fill(BLACK)
    draw_text(screen, "GAME OVER", font, WIDTH//2, HEIGHT//2 - 50, RED)
    draw_text(screen, f"SCORE: {score}", small_font, WIDTH//2, HEIGHT//2)
    draw_text(screen, "press R restart, Q quit", small_font, WIDTH//2, HEIGHT//2 + 50)
    pygame.display.flip()

    waiting = True
    while waiting:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    waiting = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

# 主游戲函數(shù)
def game():
    global all_sprites, bullets, enemies

    all_sprites = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
    enemies = pygame.sprite.Group()

    player = Player()
    all_sprites.add(player)

    score = 0
    enemy_spawn_rate = 30  # 幀數(shù)(越小越密集)
    running = True

    while running:
        clock.tick(60)
        current_frame = pygame.time.get_ticks() // 1000 * 60  # 當(dāng)前幀數(shù)(粗略)

        # 事件處理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # 按鍵射擊(長(zhǎng)按連續(xù)發(fā)射)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            if len(bullets) < 5:  # 限制子彈數(shù)量
                player.shoot()

        # 生成敵機(jī)
        if random.randint(1, enemy_spawn_rate) == 1:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)

        # 更新所有精靈
        all_sprites.update()

        # 子彈擊中敵機(jī)
        hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
        for hit in hits:
            score += 10

        # 玩家與敵機(jī)碰撞
        if pygame.sprite.spritecollide(player, enemies, False):
            running = False

        # 繪制
        screen.fill(BLACK)
        all_sprites.draw(screen)
        draw_text(screen, f"score: {score}", small_font, 60, 10)

        pygame.display.flip()

    # 游戲結(jié)束
    show_game_over(score)

# 主循環(huán)(支持重玩)
while True:
    game()

游戲整體結(jié)構(gòu)

這個(gè)游戲使用了 Pygame 框架面向?qū)ο缶幊蹋∣OP) 的方式來(lái)組織代碼。主要分為以下幾個(gè)部分:

  1. 初始化設(shè)置
  2. 定義游戲?qū)ο箢?lèi)(玩家、敵機(jī)、子彈)
  3. 游戲主循環(huán)
  4. 碰撞檢測(cè)與得分
  5. 游戲結(jié)束界面
  6. 支持重玩機(jī)制

第一部分:導(dǎo)入模塊和初始化

import pygame
import random
import sys
  • pygame:核心游戲庫(kù)。
  • random:用于生成隨機(jī)位置、速度等。
  • sys:用于安全退出程序。
pygame.init()

初始化所有 Pygame 的模塊(如聲音、顯示、字體等),這是使用 Pygame 的第一步。

WIDTH, HEIGHT = 480, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飛機(jī)大戰(zhàn)")
  • 設(shè)置窗口大小為 480×600 像素。
  • 創(chuàng)建一個(gè)顯示窗口,并設(shè)置標(biāo)題為“飛機(jī)大戰(zhàn)”。
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

定義顏色常量。Pygame 中顏色用 RGB 元組表示:

  • (255, 255, 255) 是白色
  • (0, 0, 0) 是黑色
  • (255, 0, 0) 是紅色(敵機(jī))
  • (0, 255, 0) 是綠色(玩家)
clock = pygame.time.Clock()

創(chuàng)建一個(gè)時(shí)鐘對(duì)象,用來(lái)控制游戲幀率(FPS),防止運(yùn)行過(guò)快或過(guò)慢。

font = pygame.font.SysFont("simhei", 32)
small_font = pygame.font.SysFont("simhei", 24)

創(chuàng)建字體對(duì)象,用于在屏幕上繪制文字。

  • "simhei" 是黑體,支持中文。
  • 如果系統(tǒng)沒(méi)有這個(gè)字體,可以用 'Arial'None 替代。

第二部分:定義游戲角色類(lèi)

1. 玩家飛機(jī)類(lèi)Player

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 10
        self.speed = 5
  • 繼承自 pygame.sprite.Sprite —— 這是 Pygame 中所有可移動(dòng)對(duì)象的基礎(chǔ)類(lèi)。
  • image:角色的外觀,這里是一個(gè)綠色矩形(50寬 × 40高)。
  • rect:角色的位置和邊界框。
  • 初始位置:水平居中,底部距離屏幕底邊 10 像素。
  • speed:移動(dòng)速度。
    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed

每一幀調(diào)用一次 update() 方法:

  • 獲取當(dāng)前按下的按鍵狀態(tài)。
  • 控制方向鍵移動(dòng)。
  • 加入邊界判斷,不讓飛機(jī)飛出窗口。
    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

發(fā)射子彈的方法:

  • 在飛機(jī)頂部中心創(chuàng)建一顆子彈。
  • 把它加入總精靈組 all_sprites 和子彈組 bullets,以便更新和繪制。

2. 敵機(jī)類(lèi)Enemy

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.speed = random.randint(2, 5)
  • 紅色矩形代表敵機(jī)。
  • 出現(xiàn)在屏幕上方(y 為負(fù)值),從不同 x 位置隨機(jī)出現(xiàn)。
  • 下落速度隨機(jī)(2~5像素/幀)。
    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.kill()  # 移出屏幕后刪除

敵機(jī)持續(xù)下落,一旦完全移出屏幕底部就自動(dòng)銷(xiāo)毀(kill()),避免內(nèi)存泄漏。

3. 子彈類(lèi)Bullet

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speed = -10  # 負(fù)數(shù)表示向上飛
  • 白色小矩形表示子彈。
  • 從玩家飛機(jī)頂部發(fā)射。
  • 向上飛行(speed = -10)。
    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()  # 子彈飛出屏幕頂端就銷(xiāo)毀

第三部分:輔助函數(shù)

顯示文字函數(shù)

def draw_text(surf, text, font, x, y, color=WHITE):
    img = font.render(text, True, color)
    rect = img.get_rect()
    rect.midtop = (x, y)
    surf.blit(img, rect)

封裝了一個(gè)通用的文字繪制函數(shù):

  • surf:要畫(huà)在哪(通常是 screen
  • text:要顯示的文字
  • font:字體對(duì)象
  • (x, y):文字左上角坐標(biāo)
  • blit():把文字圖像畫(huà)到屏幕上

游戲結(jié)束畫(huà)面

def show_game_over(score):
    screen.fill(BLACK)
    draw_text(screen, "游戲結(jié)束", font, WIDTH//2, HEIGHT//2 - 50, RED)
    draw_text(screen, f"得分: {score}", small_font, WIDTH//2, HEIGHT//2)
    draw_text(screen, "按 R 重新開(kāi)始,Q 退出", small_font, WIDTH//2, HEIGHT//2 + 50)
    pygame.display.flip()

    waiting = True
    while waiting:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    waiting = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

顯示“游戲結(jié)束”界面并等待用戶(hù)選擇:

  • 填黑背景,顯示得分。
  • 提示按 R 重玩,Q 退出。
  • 使用一個(gè)循環(huán)等待輸入,直到用戶(hù)決定。

第四部分:主游戲函數(shù)game()

def game():
    global all_sprites, bullets, enemies

    all_sprites = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
    enemies = pygame.sprite.Group()

    player = Player()
    all_sprites.add(player)

    score = 0
    enemy_spawn_rate = 30  # 每30幀左右生成一架敵機(jī)
    running = True

初始化游戲狀態(tài):

  • 創(chuàng)建三個(gè)精靈組:
    • all_sprites:所有要繪制和更新的對(duì)象
    • bullets:所有子彈
    • enemies:所有敵機(jī)
  • 添加玩家
  • 得分從 0 開(kāi)始
    while running:
        clock.tick(60)  # 鎖定60 FPS

        # 事件處理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

主循環(huán)每秒運(yùn)行約 60 次(由 clock.tick(60) 控制)。
處理退出事件。

        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            if len(bullets) < 5:  # 限制最多5發(fā)子彈
                player.shoot()

檢測(cè)是否按下空格鍵,如果是且子彈不多于5個(gè),則發(fā)射。

        # 生成敵機(jī)
        if random.randint(1, enemy_spawn_rate) == 1:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)

隨機(jī)生成敵機(jī)(大約每 30 幀生成一架)。

        all_sprites.update()

更新所有精靈的位置(包括玩家、敵機(jī)、子彈)。

        # 子彈擊中敵機(jī)
        hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
        for hit in hits:
            score += 10

groupcollide() 自動(dòng)檢測(cè)兩組精靈之間的碰撞:

  • 子彈打中敵機(jī) → 雙方都銷(xiāo)毀(True, True
  • 每消滅一個(gè)敵機(jī)加 10 分
        # 玩家與敵機(jī)碰撞
        if pygame.sprite.spritecollide(player, enemies, False):
            running = False

如果玩家碰到任何敵機(jī)(即使只是擦邊),游戲結(jié)束。

        # 繪制畫(huà)面
        screen.fill(BLACK)
        all_sprites.draw(screen)
        draw_text(screen, f"得分: {score}", small_font, 60, 10)
        pygame.display.flip()

清屏 → 畫(huà)所有精靈 → 顯示得分 → 刷新屏幕

    show_game_over(score)  # 游戲結(jié)束后顯示結(jié)束畫(huà)面

第五部分:支持重復(fù)游戲

while True:
    game()

主循環(huán)外再套一層 while True,這樣每次游戲結(jié)束后都可以重新開(kāi)始。

總結(jié):游戲運(yùn)行流程圖

開(kāi)始游戲
   ↓
初始化 Pygame 和變量
   ↓
進(jìn)入 game() 函數(shù)
   ↓
創(chuàng)建玩家和精靈組
   ↓
主循環(huán):
   → 處理事件(退出、按鍵)
   → 玩家移動(dòng)/射擊
   → 隨機(jī)生成敵機(jī)
   → 更新所有精靈位置
   → 檢測(cè)碰撞(子彈打敵機(jī)、玩家撞敵機(jī))
   → 繪制畫(huà)面和得分
   ↓
玩家被撞 → 結(jié)束主循環(huán)
   ↓
調(diào)用 show_game_over()
   ↓
等待用戶(hù)按 R 或 Q
   → 按 R:回到 game() 重新開(kāi)始
   → 按 Q:退出程序

后續(xù)擴(kuò)展建議

你可以基于這個(gè)框架繼續(xù)添加功能:

功能實(shí)現(xiàn)思路
添加音效使用 pygame.mixer.Sound() 播放射擊、爆炸音效
使用圖片代替方塊pygame.image.load("player.png")
添加爆炸動(dòng)畫(huà)碰撞時(shí)播放一系列圖片
生命值系統(tǒng)玩家可承受多次撞擊
道具掉落敵機(jī)死亡時(shí)隨機(jī)掉落加速、多子彈等道具

到此這篇關(guān)于用Python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的文章就介紹到這了,更多相關(guān)Python飛機(jī)大戰(zhàn)小游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理

    python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理

    這篇文章主要介紹了python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python導(dǎo)入同級(jí)模塊的實(shí)現(xiàn)

    python導(dǎo)入同級(jí)模塊的實(shí)現(xiàn)

    這篇文章主要介紹了python導(dǎo)入同級(jí)模塊的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 關(guān)于Python-faker的函數(shù)效果一覽

    關(guān)于Python-faker的函數(shù)效果一覽

    今天小編就為大家分享一篇關(guān)于Python-faker的函數(shù)效果一覽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • 用Python自動(dòng)下載網(wǎng)站所有文件

    用Python自動(dòng)下載網(wǎng)站所有文件

    這篇文章主要介紹了如何用Python自動(dòng)下載網(wǎng)站所有文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • 使用python解析MDX詞典數(shù)據(jù)并保存為Excel文件

    使用python解析MDX詞典數(shù)據(jù)并保存為Excel文件

    MDX(Mobile Dictionary eXchange)是一種常見(jiàn)的詞典文件格式,通常用于在移動(dòng)設(shè)備和電腦之間共享辭典數(shù)據(jù),本文深入探討了從MDX詞典數(shù)據(jù)提取、處理到最終保存為Excel文件的全過(guò)程,需要的朋友可以參考下
    2023-12-12
  • 利用Python計(jì)算圓周率π的實(shí)例代碼

    利用Python計(jì)算圓周率π的實(shí)例代碼

    圓周率沒(méi)有精確的計(jì)算公式,所以只能用近似的方式計(jì)算它的近似值。這篇文章主要介紹了利用Python計(jì)算圓周率π的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • Python Queue模塊詳解

    Python Queue模塊詳解

    這篇文章主要介紹了Python Queue模塊詳解,需要的朋友可以參考下
    2014-11-11
  • 跟老齊學(xué)Python之使用Python查詢(xún)更新數(shù)據(jù)庫(kù)

    跟老齊學(xué)Python之使用Python查詢(xún)更新數(shù)據(jù)庫(kù)

    前面我們講述了使用python操作數(shù)據(jù)庫(kù),今天我們來(lái)更進(jìn)一步,介紹下python查詢(xún)、更新數(shù)據(jù)庫(kù)的相關(guān)操作。有需要的小伙伴自己參考下吧。
    2014-11-11
  • python中extend功能用法舉例

    python中extend功能用法舉例

    這篇文章主要給大家介紹了關(guān)于python中extend功能的相關(guān)資料,Python中的extend()方法是一種非常有用的列表操作,它可以將一個(gè)列表中的元素添加到另一個(gè)列表的末尾,需要的朋友可以參考下
    2023-08-08
  • 利用Python+OpenCV三步去除水印

    利用Python+OpenCV三步去除水印

    去水印需要用到的庫(kù):cv2、numpy,cv2是基于OpenCV的圖像處理庫(kù),可以對(duì)圖像進(jìn)行腐蝕,膨脹等操作.numpy這是一個(gè)強(qiáng)大的處理矩陣和維度運(yùn)算的庫(kù),,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

昆明市| 石狮市| 洞口县| 焦作市| 阿坝县| 桐柏县| 石渠县| 雅安市| 伊春市| 邮箱| 东兰县| 卢氏县| 桓台县| 左贡县| 高碑店市| 天全县| 海盐县| 香格里拉县| 子长县| 天长市| 英超| 莱芜市| 炎陵县| 出国| 格尔木市| 秭归县| 商洛市| 佳木斯市| 临颍县| 仁怀市| 中西区| 苗栗县| 东辽县| 沽源县| 巨鹿县| 长兴县| 高邮市| 昌邑市| 喀喇沁旗| 新河县| 靖远县|