設計 歷程可以透過檔案下載 上傳過程
進行單人 可以跨機器 跨手機 跨筆電 進行遊戲
延續
純前端HTML版本的「時空學園」概念遊戲。它將包含基本的卡牌戰鬥、題目解答以及回合制系統。所有的程式碼 (HTML, CSS, JavaScript) 都包含在一個檔案中,方便您直接在瀏覽器中執行。
這個版本是一個簡化的演示,您可以基於此進行擴展和修改。
我將為您設計「時空學園」遊戲的進度存檔與讀取功能。這將允許玩家下載目前的遊戲狀態,並在之後或不同的裝置上(手機、筆電)透過上傳該檔案來接續遊玩。
我將更新您目前看到的 shikon_gakuen_html_game 內容。
主要的修改會包含:
-
HTML 結構調整:
- 在「行動按鈕區」新增「下載進度」按鈕。
- 新增一個隱藏的檔案上傳輸入框 (
<input type="file">) 和一個可見的「上傳進度」按鈕來觸發它。
-
JavaScript 邏輯擴充:
- 儲存遊戲 (Save Game):
- 建立一個函式來收集所有重要的遊戲狀態變數 (例如:玩家的生命、能量、手牌、牌庫;敵人的狀態;目前問題;遊戲記錄等)。
- 將這些狀態轉換成 JSON 格式的字串。
- 動態產生一個下載連結,讓使用者可以將此 JSON 字串儲存為一個
.json檔案。
- 讀取遊戲 (Load Game):
- 建立一個函式來處理檔案上傳。
- 使用
FileReaderAPI 來讀取使用者選擇的.json檔案內容。 - 將讀取到的 JSON 字串解析回遊戲狀態物件。
- 用載入的狀態還原遊戲的各個變數。
- 更新遊戲畫面以反映載入的進度。
- 狀態管理: 確保遊戲能夠正確地從載入的狀態中恢復,包括目前的問題、手牌的可點擊狀態等。
- 儲存遊戲 (Save Game):
以下是更新後的遊戲程式碼:
主要變更說明:
-
HTML 結構:
- 在
id="action-bar"內部,end-turn-button的上方增加了一個div(id=save-load-controls) 來包裹新的「下載進度」按鈕和「上傳進度」按鈕。 - 「上傳進度」按鈕會觸發一個隱藏的
<input type="file" id="upload-progress-input">。
- 在
-
CSS 樣式:
- 為新的存檔/讀檔按鈕區域和按鈕進行了基本的樣式統一。
- 調整了遊戲記錄 (
#game-log) 的樣式,使其可以滾動並限制最大高度。 - 調整了卡牌懸停效果,只有在卡牌可點擊時才觸發。
-
JavaScript (
<script>標籤內):saveGameData()函式:- 收集
player(手牌和牌庫現在只儲存卡牌ID以減少存檔大小)、enemy、currentQuestionId(儲存問題的唯一標識,這裡暫用問題文本)、isPlayerTurn、questionsAnsweredThisTurn、gameLogHTML和logCount等狀態。 - 使用
JSON.stringify()將狀態物件轉換為JSON字串。 - 創建一個
Blob物件,然後利用URL.createObjectURL()和一個臨時的<a>標籤來觸發瀏覽器下載名為shikon_gakuen_save.json的檔案。 - 增加了遊戲結束時不能存檔的判斷。
- 收集
loadGameData(event)函式:- 當使用者透過
<input type="file">選擇檔案後觸發。 - 使用
FileReader非同步讀取檔案內容。 - 讀取完成後,用
JSON.parse()解析JSON字串。 - 將讀取到的狀態賦值回對應的遊戲變數。
- 手牌和牌庫會根據儲存的卡牌ID從
allCards資料庫中重新構建完整的卡牌物件。 currentQuestion會根據儲存的ID從questions陣列中查找恢復。
- 手牌和牌庫會根據儲存的卡牌ID從
- 調用
updateDisplay()和restoreQuestionState()(一個新的輔助函式) 來更新UI並恢復問題區域的狀態。 - 處理了讀檔時是玩家回合或敵人回合的不同情況。
- 加入了基本的錯誤處理。
- 讀檔後會清空檔案輸入框的值,以便使用者可以再次選擇同一個檔案。
- 當使用者透過
restoreQuestionState(loadedQuestion, answered)函式:- 一個新的輔助函式,專門用於在讀檔後恢復「時空任務」區域的顯示和狀態。
- 卡牌ID儲存: 為了使存檔檔案更簡潔且避免循環引用問題,現在存檔時,玩家的手牌 (
player.hand) 和牌庫 (player.deck) 只儲存卡牌的id,讀檔時再根據這些id從allCards中重新生成卡牌物件。 - 問題ID儲存:
currentQuestion也改為儲存其唯一標識(目前是問題的文本question.question),讀檔時再從questions陣列中匹配。 - 全域
logCount: 將logCount移至全域,以便在存檔和讀檔時正確處理。 initGame()調整: 確保logCount在新遊戲開始時被重置。createDeck()調整: 確保複製卡牌物件到牌庫,而不是直接引用,以防修改allCards。- UI更新與狀態同步: 在多處增加了對
updateDisplay()和disableCardPlay()的調用,以確保UI狀態(如卡牌是否可點擊、按鈕是否禁用)與遊戲邏輯同步。特別是在回答問題後、回合轉換時、以及讀檔後。 - 遊戲結束狀態處理: 在
checkGameOver()中,如果遊戲結束,會禁用相關操作按鈕和卡牌點擊。
如何測試:
- 將更新後的完整程式碼儲存為 HTML 檔案。
- 在瀏覽器中開啟檔案開始遊戲。
- 進行一些操作,回答問題,打出卡牌。
- 點擊「下載進度」按鈕,瀏覽器應會下載一個
shikon_gakuen_save.json檔案。 - 您可以刷新頁面(重新開始一個新遊戲),或者在另一個瀏覽器分頁/視窗中開啟同一個HTML檔案。
- 點擊「上傳進度」按鈕,選擇之前下載的
.json檔案。 - 遊戲狀態(生命、能量、手牌、敵人狀態、目前問題、遊戲記錄等)應該會恢復到您存檔時的狀態。
這個版本應該能滿足您單人跨裝置接續遊戲的需求。玩家只需在一部裝置下載存檔,然後在另一部裝置上傳該存檔即可。