iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0
自我挑戰組

順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作系列 第 30

第三十天:成果的展現:《奇幻卡牌競技場》的打包與最終測試

  • 分享至 

  • xImage
  •  

歡迎來到「順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作」的最終章!在過去的 29 天裡,我們從 Python 的基礎語法開始,一路探索了 ClassListDictionary 等核心概念,並透過 Pygame 打造出《奇幻卡牌競技場》的核心機制。我們始終秉持 「Vibe Coding」 的核心精神,專注於創意與整體架構,讓開發過程能 「完全順著感覺走」,甚至達到「忘記程式碼本身存在」的境界。

今天,當遊戲的主體完成,我們將面對最後,也是最關鍵的一步:如何將這個 Python 專案打包成一個獨立的可執行檔,並進行最終測試,確保它能在任何玩家的電腦上流暢運行,將我們的「Vibe」無縫傳遞出去。

為何需要打包?

想像一下,當您興奮地想和朋友分享您的遊戲時,卻要求他們先安裝特定版本的 Python、透過 pip 安裝 Pygame 等多個套件,甚至還要處理複雜的資料夾路徑,這無疑會大大降低他們體驗遊戲的意願與「Vibe」。

為了解決這個問題,將 Python 專案打包成獨立的可執行檔(例如 Windows 上的 .exe 檔案)就顯得至關重要。打包後,玩家無需安裝任何 Python 環境,只需雙擊檔案即可立即開始遊戲,這極大地降低了遊玩門檻,讓您的創意能更廣泛地傳播。

PyInstaller:打包 Python 專案的利器

在眾多打包工具中,PyInstaller 因其強大且易於使用的特性而備受青睞。安裝過程非常簡單,只需在終端機中執行 pip install 指令即可。

pip install pyinstaller

安裝完成後,切換到您專案的根目錄(包含 main.py 的資料夾),執行以下指令即可開始打包:

pyinstaller --onefile --noconsole --name "FantasyCardArena" main.py
  • --onefile:將所有依賴項和程式碼打包成一個單一的可執行檔
  • --noconsole:在 Windows 環境下,執行遊戲時不會彈出黑色的命令提示字元視窗,提供更佳的使用者體驗。
  • --name "FantasyCardArena":指定生成的可執行檔名稱。
  • main.py:指定專案的主入口腳本。

核心挑戰:打包後的資源路徑問題與解決方案

然而,打包過程中最常見的陷阱是:打包後的遊戲找不到圖片、音效或字體等資源檔案。這是因為在開發環境中,我們常使用相對路徑(例如 "image/HP.PNG"),但當 PyInstaller 將所有東西打包後,程式的執行環境變成了一個臨時解壓縮的資料夾,原來的相對路徑便失效了。

為了解決這個跨環境的路徑問題,我們在專案中(如 main.pygamemanager.pyhomepage.py)導入了一個通用的 resource_path 函式。

關鍵程式碼:resource_path 函式
import sys
import os

def resource_path(relative_path):
    """ 取得資源的絕對路徑,不論是在開發環境還是打包後的 .exe。 """
    try:
        # PyInstaller 建立一個臨時資料夾並將路徑儲存在 _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        # 未打包時(開發環境),取得腳本所在目錄的絕對路徑
        base_path = os.path.abspath(".")
    
    # 安全地拼接基底路徑和資源的相對路徑
    return os.path.join(base_path, relative_path)

# 將 base_path 設為指向根目錄
base_path = resource_path(".")
程式碼解釋
  1. sys._MEIPASS:這是 PyInstaller 在打包模式下運行時,動態注入到 sys 模組中的一個特殊屬性。它指向一個臨時解壓縮資料夾的根路徑,所有資源檔案(圖片、音效等)都被放置在這裡。我們的函式首先會嘗試存取這個屬性。
  2. os.path.abspath("."):如果在開發環境中直接執行 Python 腳本(例如在 PyCharm 或 VS Code 中),sys._MEIPASS 屬性將不存在,從而觸發 except 區塊。此時,我們使用 os.path.abspath(".") 來獲取當前腳本所在的目錄,作為資源的基底路徑。
  3. os.path.join(base_path, relative_path):這個函式是跨平台、安全拼接路徑的標準做法。它會根據 base_path(無論是臨時路徑還是開發路徑)和我們傳入的相對路徑(如 "audio/win_bg.wav"),生成一個在任何環境下都正確的絕對路徑

透過在所有資源載入的地方使用 os.path.join(base_path, ...) 的寫法,我們確保了遊戲無論是在開發還是打包後,都能順利加載所有視覺與聽覺元素,讓玩家的沉浸感不因技術問題而中斷。

應用範例 (main.py)
# 原本寫法 (打包後會出錯)
# background_img = pygame.image.load("image/game_background.png")

# 正確寫法
background_img = pygame.image.load(os.path.join(base_path, "image", "game_background.png")) #

# 載入字體
FONT_PATH = os.path.join(base_path, "msjh.ttf") #

# 載入音效
button_sound = pygame.mixer.Sound(os.path.join(base_path, "audio", "button_bg.wav")) #

最終測試:確保無縫的「Vibe」

打包完成後,最終測試是不可或缺的一環。我們需要將生成的 .exe 執行檔複製到一台乾淨的電腦(沒有安裝 Python 或任何相關套件)上進行測試,確保:

  • 啟動與運行:遊戲能夠順利啟動,首頁背景音樂正常播放。
  • 核心功能:卡牌配對、技能效果觸發、AI 行動邏輯、回合推進與勝負判斷等核心機制運作正常。
  • 資源載入:所有圖片、字體、音效和背景音樂都能正確加載與播放。
  • 穩定性:長時間遊玩後,遊戲依然穩定,沒有出現崩潰或性能顯著下降的問題。

只有經過嚴格的最終測試,我們才能確信,用「Vibe Coding」創造出的遊戲,能夠在任何地方都展現其應有的魅力。

總結

從 Python 基礎語法到複雜的遊戲邏輯,再到今天的遊戲打包與發布,這 30 天的鐵人賽是將創意轉化為現實的完整過程。「Vibe Coding」賦予我們開發的自由和直覺,而像 PyInstaller 這樣的工具,則為這份自由提供了堅實的技術後盾,讓我們能將完整的遊戲體驗無縫地送到玩家手中。

當玩家在他們的電腦上順利運行遊戲,激昂的戰鬥音樂響起,華麗的卡牌效果躍然眼前時,那份屬於創作者的「Vibe」便得以圓滿傳遞——這正是我們開發之旅最完美的終章。

遊戲執行檔連結:

https://drive.google.com/file/d/1xq5wExVsyyPAHa8d3KIByJgWn-B7vhRi/view?usp=sharing

參與本次 IT 鐵人賽的心得與收穫

參與「IT鐵人賽:我的Python遊戲開發之旅」是一次意義非凡且收穫豐碩的學習體驗。我深入掌握了Python強大且語法簡單易上手的特性,並將**「Vibe Coding」的理念付諸實踐**,專注於創意與整體架構,而非被繁瑣的技術細節所束縛。

此趟旅程,我紮實學習了Python基礎:從變數、多種資料型態(整數、浮點數、字串、布林)邏輯判斷(If-Else、elif、比較與邏輯運算子);再到清單(List)與字典(Dictionary)迴圈(For/While Loop)函式(Function)模組(Module)化管理與Class類別(例如Player、Card)設計遊戲物件,奠定堅實基礎。
我成功開發了**《奇幻卡牌競技場》這款回合制卡牌配對攻擊遊戲。開發過程中,實現了卡牌(Card類別與SkillEffect)、、等視覺呈現,並整合了音效與背景音樂提升沉浸感。最後,透過PyInstaller將專案打包成可執行檔**,解決資源路徑問題,實現作品發布。

未來遊戲可進一步優化:可增加玩家與敵方頭像(此為非來源資訊),強化出牌特效(此為非來源資訊);引入每回合行動時間限制(此為非來源資訊);持續優化敵方AI策略深度;以及進行全面測試與性能優化。

總結,這次「IT 鐵人賽」是一次高效且令人振奮的學習歷程。它不僅提升了我的 Python 程式設計技能,更重要的是,在 「Vibe Coding」的引導下,我得以將注意力集中在遊戲的創意與玩法上 ,而不是被繁瑣的技術細節所束縛。這種開發模式讓我深刻體會到,未來的程式設計師,將更需要具備與 AI 協作,以及用自然語言精確表達想法的能力。這 30 天的挑戰,不僅圓滿了我開發遊戲的夢想,也為我未來的程式設計之路奠定了堅實的基礎,並帶來了思維方式的轉變。


上一篇
第二十九天:打造堅實的基石:遊戲測試、除錯與性能優化
系列文
順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言