歡迎來到「順著感覺走!從零開始的 Python & Vibe Coding 遊戲創作」的最終章!在過去的 29 天裡,我們從 Python 的基礎語法開始,一路探索了 Class
、List
、Dictionary
等核心概念,並透過 Pygame 打造出《奇幻卡牌競技場》的核心機制。我們始終秉持 「Vibe Coding」 的核心精神,專注於創意與整體架構,讓開發過程能 「完全順著感覺走」,甚至達到「忘記程式碼本身存在」的境界。
今天,當遊戲的主體完成,我們將面對最後,也是最關鍵的一步:如何將這個 Python 專案打包成一個獨立的可執行檔,並進行最終測試,確保它能在任何玩家的電腦上流暢運行,將我們的「Vibe」無縫傳遞出去。
想像一下,當您興奮地想和朋友分享您的遊戲時,卻要求他們先安裝特定版本的 Python、透過 pip 安裝 Pygame 等多個套件,甚至還要處理複雜的資料夾路徑,這無疑會大大降低他們體驗遊戲的意願與「Vibe」。
為了解決這個問題,將 Python 專案打包成獨立的可執行檔(例如 Windows 上的 .exe
檔案)就顯得至關重要。打包後,玩家無需安裝任何 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.py
、gamemanager.py
、homepage.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(".")
sys._MEIPASS
:這是 PyInstaller 在打包模式下運行時,動態注入到 sys
模組中的一個特殊屬性。它指向一個臨時解壓縮資料夾的根路徑,所有資源檔案(圖片、音效等)都被放置在這裡。我們的函式首先會嘗試存取這個屬性。os.path.abspath(".")
:如果在開發環境中直接執行 Python 腳本(例如在 PyCharm 或 VS Code 中),sys._MEIPASS
屬性將不存在,從而觸發 except
區塊。此時,我們使用 os.path.abspath(".")
來獲取當前腳本所在的目錄,作為資源的基底路徑。os.path.join(base_path, relative_path)
:這個函式是跨平台、安全拼接路徑的標準做法。它會根據 base_path
(無論是臨時路徑還是開發路徑)和我們傳入的相對路徑(如 "audio/win_bg.wav"
),生成一個在任何環境下都正確的絕對路徑。透過在所有資源載入的地方使用 os.path.join(base_path, ...)
的寫法,我們確保了遊戲無論是在開發還是打包後,都能順利加載所有視覺與聽覺元素,讓玩家的沉浸感不因技術問題而中斷。
# 原本寫法 (打包後會出錯)
# 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")) #
打包完成後,最終測試是不可或缺的一環。我們需要將生成的 .exe
執行檔複製到一台乾淨的電腦(沒有安裝 Python 或任何相關套件)上進行測試,確保:
只有經過嚴格的最終測試,我們才能確信,用「Vibe Coding」創造出的遊戲,能夠在任何地方都展現其應有的魅力。
從 Python 基礎語法到複雜的遊戲邏輯,再到今天的遊戲打包與發布,這 30 天的鐵人賽是將創意轉化為現實的完整過程。「Vibe Coding」賦予我們開發的自由和直覺,而像 PyInstaller 這樣的工具,則為這份自由提供了堅實的技術後盾,讓我們能將完整的遊戲體驗無縫地送到玩家手中。
當玩家在他們的電腦上順利運行遊戲,激昂的戰鬥音樂響起,華麗的卡牌效果躍然眼前時,那份屬於創作者的「Vibe」便得以圓滿傳遞——這正是我們開發之旅最完美的終章。
https://drive.google.com/file/d/1xq5wExVsyyPAHa8d3KIByJgWn-B7vhRi/view?usp=sharing
參與「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 天的挑戰,不僅圓滿了我開發遊戲的夢想,也為我未來的程式設計之路奠定了堅實的基礎,並帶來了思維方式的轉變。