document.addEventListener('DOMContentLoaded', function() { // 檢查是否有玩家資料 const currentPlayerId = localStorage.getItem('currentPlayerId'); const playerName = localStorage.getItem('playerName'); const playerProfession = localStorage.getItem('playerProfession'); // 如果沒有玩家資料,重定向到首頁 if (!currentPlayerId || !playerName || !playerProfession) { alert('請先登入遊戲!'); window.location.href = 'index.html'; return; } // 獲取DOM元素 const startChallengeBtn = document.getElementById('start-challenge'); const quizContainer = document.getElementById('quiz-container'); const resultContainer = document.getElementById('result-container'); const questionTitle = document.getElementById('question-title'); const formulaDisplay = document.getElementById('formula-display'); const formulaTemplate = document.getElementById('formula-template'); const dragItems = document.getElementById('drag-items'); const stage1Btn = document.getElementById('stage-1-btn'); const stage2Btn = document.getElementById('stage-2-btn'); const checkAnswerBtn = document.getElementById('check-answer'); const nextQuestionBtn = document.getElementById('next-question'); const currentQuestionSpan = document.getElementById('current-question'); const feedbackContainer = document.getElementById('feedback-container'); const resultTitle = document.getElementById('result-title'); const resultMessage = document.getElementById('result-message'); const retryBtn = document.getElementById('retry-challenge'); const backToMapBtn = document.getElementById('back-to-map'); const nextTrialBtn = document.getElementById('next-trial'); const doorsProgress = document.getElementById('doors-progress').children; const successButtons = document.getElementById('success-buttons'); const failButtons = document.getElementById('fail-buttons'); const bgmAudio = document.getElementById('bgm'); const correctSound = document.getElementById('correct-sound'); const wrongSound = document.getElementById('wrong-sound'); const toggleBgmBtn = document.getElementById('toggle-bgm'); const starResults = [ document.getElementById('star-1'), document.getElementById('star-2'), document.getElementById('star-3') ]; // 音樂控制 let isBgmPlaying = false; // 播放背景音樂 function playBgm() { bgmAudio.volume = 0.3; // 設置音量 bgmAudio.play().catch(e => console.log('自動播放被阻止:', e)); isBgmPlaying = true; toggleBgmBtn.textContent = '音樂關'; } // 嘗試自動播放背景音樂(大多數瀏覽器會阻止) playBgm(); // 音樂開關按鈕 toggleBgmBtn.addEventListener('click', function() { if (isBgmPlaying) { bgmAudio.pause(); isBgmPlaying = false; toggleBgmBtn.textContent = '音樂開'; localStorage.setItem('towerMusicPlaying', 'false'); } else { bgmAudio.play(); isBgmPlaying = true; toggleBgmBtn.textContent = '音樂關'; localStorage.setItem('towerMusicPlaying', 'true'); } }); // 問題資料 const questions = [ { title: "101² = (100 + 1)² = (100+1) × (100+1)", stage1: { template: "100² + ___ × ___ + ___ × ___ + 1²", dragItems: ["100", "99", "200", "1", "2"], answers: [["1", "100"], ["1", "100"]], // 順序不限 correctAnswer: "100² + 100 × 1 + 1 × 100 + 1²" }, stage2: { template: "100² + ___ × ___ × ___ + 1²", dragItems: ["100", "99", "200", "1", "2"], answers: [["2", "100", "1"]] // 除了2之外,順序不限 } }, { title: "99² = (100 - 1)² = (100-1) × (100-1)", stage1: { template: "100² - ___ × ___ - ___ × ___ + 1²", dragItems: ["1", "2", "100", "98", "200"], answers: [["1", "100"], ["1", "100"]], // 順序不限 correctAnswer: "100² - 100 × 1 - 1 × 100 + 1²" }, stage2: { template: "100² - ___ × ___ × ___ + 1²", dragItems: ["1", "2", "100", "98", "200"], answers: [["2", "100", "1"]] // 除了2之外,順序不限 } }, { title: "23² = (20 + 3)² = (20+3) × (20+3)", stage1: { template: "20² + ___ × ___ + ___ × ___ + 3²", dragItems: ["2", "20", "3", "23", "17"], answers: [["20", "3"], ["3", "20"]], // 順序不限 correctAnswer: "20² + 20 × 3 + 3 × 20 + 3²" }, stage2: { template: "20² + ___ × ___ × ___ + 3²", dragItems: ["2", "20", "3", "23", "17"], answers: [["2", "20", "3"]] // 除了2之外,順序不限 } }, { title: "38² = (40 - 2)² = (40-2) × (40-2)", stage1: { template: "40² - ___ × ___ - ___ × ___ + 2²", dragItems: ["1", "2", "40", "38", "42"], answers: [["2", "40"], ["40", "2"]], // 順序不限 correctAnswer: "40² - 40 × 2 - 2 × 40 + 2²" }, stage2: { template: "40² - ___ × ___ × ___ + 2²", dragItems: ["1", "2", "40", "38", "42"], answers: [["2", "40", "2"]] // 除了第一個2之外,順序不限 } }, { title: "203² = (200 + 3)² = (200 + 3) × (200 + 3)", stage1: { template: "200² + ___ × ___ + ___ × ___ + 3²", dragItems: ["2", "3", "200", "203", "197"], answers: [["3", "200"], ["200", "3"]], // 順序不限 correctAnswer: "200² + 200 × 3 + 3 × 200 + 3²" }, stage2: { template: "200² + ___ × ___ × ___ + 3²", dragItems: ["2", "3", "200", "203", "197"], answers: [["2", "200", "3"]] // 除了2之外,順序不限 } }, { title: "297² = (300 - 3)² = (300 - 3) × (300 - 3)", stage1: { template: "300² - ___ × ___ - ___ × ___ + 3²", dragItems: ["2", "300", "3", "297", "303"], answers: [["300", "3"], ["3", "300"]], // 順序不限 correctAnswer: "300² - 300 × 3 - 3 × 300 + 3²" }, stage2: { template: "300² - ___ × ___ × ___ + 3²", dragItems: ["2", "300", "3", "297", "303"], answers: [["2", "300", "3"]] // 除了2之外,順序不限 } } ]; // 遊戲狀態 let currentQuestionIndex = 0; let currentStage = 1; let correctAnswers = 0; let userAnswers = []; // 記錄用戶答案 let dropZones = []; // 當前問題的所有拖放區 let dragItemElements = []; // 當前問題的所有拖拽項 let wrongAttempts = 0; // 記錄當前問題錯誤嘗試次數 let sortableInstances = []; // 儲存所有Sortable實例 // 獲取遊戲進度 const gameProgress = JSON.parse(localStorage.getItem(`gameProgress_${currentPlayerId}`)) || { completedTrials: { "平方之泉": { completed: false, score: 0, challengesCompleted: [false, false, false, false, false, false] }, "變換山谷": { completed: false, score: 0, challengesCompleted: [false, false, false, false, false, false] }, "展開之塔": { completed: false, score: 0, challengesCompleted: [false, false, false, false, false, false] } }, currentLocation: "展開之塔", lastSaved: new Date().toISOString() }; // 開始挑戰按鈕點擊事件 startChallengeBtn.addEventListener('click', function() { startChallengeBtn.style.display = 'none'; quizContainer.style.display = 'block'; loadQuestion(0, 1); }); // 儲存每個階段的答案 let stage1Answers = Array(questions.length).fill(null).map(() => []); let stage2Answers = Array(questions.length).fill(null).map(() => []); // 載入問題 function loadQuestion(questionIndex, stageIndex) { currentQuestionIndex = questionIndex; currentStage = stageIndex; wrongAttempts = 0; // 重置錯誤嘗試次數 // 清除所有Sortable實例 sortableInstances.forEach(instance => { if (instance && typeof instance.destroy === 'function') { instance.destroy(); } }); sortableInstances = []; // 更新問題標題和進度 currentQuestionSpan.textContent = questionIndex + 1; questionTitle.textContent = `問題 ${questionIndex + 1}`; // 顯示題目,將標題分成兩行,並讓等號垂直對齊 const titleParts = questions[questionIndex].title.split('='); if (titleParts.length >= 3) { formulaDisplay.innerHTML = `${titleParts[0]} = ${titleParts[1]}
= ${titleParts[2]}`; } else { formulaDisplay.textContent = questions[questionIndex].title; } // 更新階段按鈕狀態 stage1Btn.classList.toggle('active', stageIndex === 1); stage2Btn.classList.toggle('active', stageIndex === 2); // 清空公式模板和拖拽項 formulaTemplate.innerHTML = ''; dragItems.innerHTML = ''; dropZones = []; // 移除所有現有的參考區域 const existingReferences = document.querySelectorAll('.stage1-reference'); existingReferences.forEach(ref => ref.remove()); // 移除提示圖片和提示容器 const existingHintContainers = document.querySelectorAll('.hint-container'); existingHintContainers.forEach(container => container.remove()); // 移除所有無作用的小框框 const emptyBoxes = document.querySelectorAll('.empty-box'); emptyBoxes.forEach(box => box.remove()); // 如果是第二階段,顯示第一階段的答案作為參考 if (stageIndex === 2 && stage1Answers[questionIndex].length > 0) { // 創建參考區域 const referenceDiv = document.createElement('div'); referenceDiv.className = 'stage1-reference'; referenceDiv.style.marginBottom = '15px'; referenceDiv.style.padding = '10px'; referenceDiv.style.backgroundColor = 'rgba(60, 60, 60, 0.7)'; referenceDiv.style.borderRadius = '8px'; referenceDiv.style.border = '1px solid rgba(255, 140, 0, 0.5)'; // 創建參考標題 const referenceTitle = document.createElement('div'); referenceTitle.textContent = '第一階段答案參考:'; referenceTitle.style.color = 'rgba(255, 165, 0, 0.9)'; referenceTitle.style.marginBottom = '5px'; referenceDiv.appendChild(referenceTitle); // 獲取第一階段的模板和答案 const stage1Template = questions[questionIndex].stage1.template; const stage1Values = stage1Answers[questionIndex]; // 創建完整算式 let fullFormula = stage1Template; stage1Values.forEach((value, index) => { fullFormula = fullFormula.replace('___', value); }); // 顯示完整算式 const formulaText = document.createElement('div'); formulaText.textContent = fullFormula; formulaText.style.color = 'white'; formulaText.style.fontSize = '1.1rem'; referenceDiv.appendChild(formulaText); // 插入到公式模板前面 formulaTemplate.parentNode.insertBefore(referenceDiv, formulaTemplate); } // 獲取當前階段的問題數據 const stageData = stageIndex === 1 ? questions[questionIndex].stage1 : questions[questionIndex].stage2; // 獲取已保存的答案 const savedAnswers = stageIndex === 1 ? stage1Answers[questionIndex] : stage2Answers[questionIndex]; // 創建公式模板 const templateParts = stageData.template.split('___'); for (let i = 0; i < templateParts.length; i++) { // 添加文本部分 const textSpan = document.createElement('span'); textSpan.textContent = templateParts[i]; textSpan.style.display = 'inline-block'; textSpan.style.verticalAlign = 'middle'; formulaTemplate.appendChild(textSpan); // 如果不是最後一部分,添加拖放區 if (i < templateParts.length - 1) { const dropZone = document.createElement('span'); dropZone.className = 'drop-zone sortable-container'; dropZone.dataset.index = i; dropZone.style.display = 'inline-flex'; dropZone.style.justifyContent = 'center'; dropZone.style.alignItems = 'center'; dropZone.style.verticalAlign = 'middle'; dropZone.style.height = '40px'; formulaTemplate.appendChild(dropZone); dropZones.push(dropZone); // 防止觸控滾動 dropZone.addEventListener('touchmove', function(e) { e.preventDefault(); }, { passive: false }); // 初始化每個拖放區的Sortable const dropZoneSortable = new Sortable(dropZone, { group: { name: 'formula', pull: 'clone', // 允許從答案區拖出,但會被移除 put: true }, animation: 100, delay: 0, touchStartThreshold: 5, ghostClass: "drag-ghost", forceFallback: true, fallbackTolerance: 3, sort: false, // 禁止在拖放區內排序 filter: '.disabled', // 禁止拖拽的元素 onAdd: function(evt) { const item = evt.item; // 如果拖放區已有內容,先清空 if (evt.to.children.length > 1) { // 保留最新添加的元素,移除其他元素 Array.from(evt.to.children).forEach(child => { if (child !== item) { evt.to.removeChild(child); } }); } // 設置樣式 evt.to.classList.add('filled'); evt.to.style.backgroundColor = 'rgba(255, 140, 0, 0.3)'; // 更新保存的答案 updateSavedAnswers(); }, onRemove: function(evt) { // 當元素被移出時,移除filled類 evt.from.classList.remove('filled'); evt.from.style.backgroundColor = 'rgba(100, 100, 100, 0.5)'; // 從答案格拖出的方塊直接移除,不回到拖拉區 if (evt.item && evt.item.parentNode) { evt.item.remove(); } // 更新保存的答案 updateSavedAnswers(); } }); sortableInstances.push(dropZoneSortable); } } // 創建拖拽項容器 const dragItemsContainer = document.createElement('div'); dragItemsContainer.className = 'sortable-container'; dragItemsContainer.style.display = 'flex'; dragItemsContainer.style.flexWrap = 'wrap'; dragItemsContainer.style.justifyContent = 'center'; dragItemsContainer.style.gap = '15px'; dragItems.appendChild(dragItemsContainer); // 防止觸控滾動 dragItemsContainer.addEventListener('touchmove', function(e) { e.preventDefault(); }, { passive: false }); // 創建拖拽項 stageData.dragItems.forEach((item, index) => { const dragItem = document.createElement('div'); dragItem.className = 'drag-item'; dragItem.id = `drag-item-${index}`; dragItem.textContent = item; dragItem.dataset.value = item; dragItem.style.willChange = 'transform'; dragItem.style.touchAction = 'none'; // 添加點擊事件,點擊可移除(如果在拖放區內) dragItem.addEventListener('click', function() { const parent = this.parentElement; if (parent && parent.classList.contains('drop-zone')) { parent.classList.remove('filled'); parent.style.backgroundColor = 'rgba(100, 100, 100, 0.5)'; // 移除元素 this.remove(); // 更新保存的答案 updateSavedAnswers(); } }); dragItemsContainer.appendChild(dragItem); dragItemElements.push(dragItem); }); // 初始化拖拽項容器的Sortable const dragItemsSortable = new Sortable(dragItemsContainer, { group: { name: 'formula', pull: 'clone', // 設置為clone模式,拖拽項不會消失 put: false // 不允許放回拖拽區 }, animation: 100, delay: 0, touchStartThreshold: 5, ghostClass: "drag-ghost", forceFallback: true, fallbackTolerance: 3, sort: false, // 禁止排序 filter: '.disabled', // 禁止拖拽的元素 onClone: function(evt) { // 克隆元素時添加相同的樣式和數據 evt.clone.className = evt.item.className; evt.clone.dataset.value = evt.item.dataset.value; evt.clone.style.willChange = 'transform'; evt.clone.style.touchAction = 'none'; // 添加點擊事件,點擊可移除(如果在拖放區內) evt.clone.addEventListener('click', function() { const parent = this.parentElement; if (parent && parent.classList.contains('drop-zone')) { parent.classList.remove('filled'); parent.style.backgroundColor = 'rgba(100, 100, 100, 0.5)'; // 移除元素 this.remove(); // 更新保存的答案 updateSavedAnswers(); } }); } }); sortableInstances.push(dragItemsSortable); // 如果有已保存的答案,恢復它們 if (savedAnswers && savedAnswers.length > 0) { savedAnswers.forEach((value, index) => { if (index < dropZones.length && value) { // 找到對應值的拖拽項 const matchingItem = Array.from(dragItemElements).find(item => item.dataset.value === value); if (matchingItem) { // 克隆拖拽項 const clone = matchingItem.cloneNode(true); clone.dataset.value = value; // 添加點擊事件,點擊可移除 clone.addEventListener('click', function() { const parent = this.parentElement; if (parent && parent.classList.contains('drop-zone')) { parent.classList.remove('filled'); parent.style.backgroundColor = 'rgba(100, 100, 100, 0.5)'; // 移除元素 this.remove(); // 更新保存的答案 updateSavedAnswers(); } }); // 添加到拖放區 dropZones[index].appendChild(clone); dropZones[index].classList.add('filled'); dropZones[index].style.backgroundColor = 'rgba(255, 140, 0, 0.3)'; } } }); } // 顯示檢查答案按鈕,隱藏下一題按鈕 checkAnswerBtn.style.display = 'inline-block'; nextQuestionBtn.style.display = 'none'; // 清空反饋容器 feedbackContainer.innerHTML = ''; feedbackContainer.style.display = 'none'; } // 更新保存的答案 function updateSavedAnswers() { const answers = []; // 獲取所有拖放區的值 dropZones.forEach(zone => { const items = zone.querySelectorAll('.drag-item'); if (items.length > 0) { answers.push(items[0].dataset.value); } else { answers.push(null); } }); // 保存答案 if (currentStage === 1) { stage1Answers[currentQuestionIndex] = answers; } else { stage2Answers[currentQuestionIndex] = answers; } } // 檢查答案 function checkAnswer() { // 獲取當前階段的問題數據 const stageData = currentStage === 1 ? questions[currentQuestionIndex].stage1 : questions[currentQuestionIndex].stage2; // 獲取用戶答案 const userAnswerValues = []; dropZones.forEach(zone => { const items = zone.querySelectorAll('.drag-item'); if (items.length > 0) { userAnswerValues.push(items[0].dataset.value); } else { userAnswerValues.push(null); } }); // 檢查是否有空白答案 if (userAnswerValues.includes(null)) { feedbackContainer.innerHTML = '

請填寫所有空格!

'; feedbackContainer.style.display = 'block'; return false; } // 檢查答案是否正確 let isCorrect = false; if (currentStage === 1) { // 第一階段:檢查兩組答案是否匹配 const group1 = [userAnswerValues[0], userAnswerValues[1]]; const group2 = [userAnswerValues[2], userAnswerValues[3]]; // 檢查每個答案組合是否匹配任何一個正確答案組合 isCorrect = stageData.answers.some(answer => { return ( (group1.includes(answer[0]) && group1.includes(answer[1])) && (group2.includes(answer[0]) && group2.includes(answer[1])) ); }); } else { // 第二階段:檢查三個值是否匹配 isCorrect = stageData.answers.some(answer => { // 第一個值必須是2 if (userAnswerValues[0] !== answer[0]) return false; // 其他兩個值順序不限 const otherValues = [userAnswerValues[1], userAnswerValues[2]]; return ( otherValues.includes(answer[1]) && otherValues.includes(answer[2]) ); }); } // 顯示反饋 feedbackContainer.innerHTML = ''; feedbackContainer.style.display = 'block'; if (isCorrect) { // 播放正確音效 correctSound.currentTime = 0; correctSound.play().catch(e => console.log('播放音效失敗:', e)); // 顯示正確反饋 const correctFeedback = document.createElement('p'); correctFeedback.className = 'success'; correctFeedback.textContent = '答對了!'; feedbackContainer.appendChild(correctFeedback); // 更新UI checkAnswerBtn.style.display = 'none'; if (currentStage === 1) { // 第一階段完成,進入第二階段 nextQuestionBtn.textContent = '進入第二階段'; nextQuestionBtn.onclick = function() { loadQuestion(currentQuestionIndex, 2); }; } else { // 第二階段完成,進入下一題或完成挑戰 if (currentQuestionIndex < questions.length - 1) { nextQuestionBtn.textContent = '下一題'; nextQuestionBtn.onclick = function() { loadQuestion(currentQuestionIndex + 1, 1); }; } else { nextQuestionBtn.textContent = '完成挑戰'; nextQuestionBtn.onclick = function() { showResult(); }; } } nextQuestionBtn.style.display = 'inline-block'; // 更新進度 if (currentStage === 2) { doorsProgress[currentQuestionIndex].classList.add('completed'); correctAnswers++; } return true; } else { // 播放錯誤音效 wrongSound.currentTime = 0; wrongSound.play().catch(e => console.log('播放音效失敗:', e)); // 增加錯誤嘗試次數 wrongAttempts++; // 第一階段特殊處理 if (currentStage === 1) { // 創建提示容器(如果不存在) let hintContainer = document.querySelector('.hint-container'); if (!hintContainer) { hintContainer = document.createElement('div'); hintContainer.className = 'hint-container'; hintContainer.style.marginBottom = '15px'; hintContainer.style.padding = '10px'; hintContainer.style.backgroundColor = 'rgba(60, 60, 60, 0.7)'; hintContainer.style.borderRadius = '8px'; hintContainer.style.border = '1px solid rgba(255, 0, 0, 0.5)'; hintContainer.style.textAlign = 'center'; // 插入到公式模板前面 formulaTemplate.parentNode.insertBefore(hintContainer, formulaTemplate); } // 清空提示容器 hintContainer.innerHTML = ''; // 添加提示圖片 const hintImage = document.createElement('img'); hintImage.src = `towerhint${currentQuestionIndex + 1}1.jpg`; hintImage.style.maxWidth = '50%'; hintImage.style.display = 'block'; hintImage.style.margin = '0 auto 10px'; hintContainer.appendChild(hintImage); // 添加提示文字 const hintText = document.createElement('p'); hintText.style.color = 'white'; hintText.style.margin = '5px 0'; if (wrongAttempts === 1) { // 第一次錯誤 hintText.textContent = '請仔細觀察上方提示圖,按照分配律的方式展開填入正確答案。'; } else { // 第二次或更多次錯誤 hintText.textContent = `正確答案應為:\n「${stageData.correctAnswer}」\n請依照此答案填入,才能進入第二階段。`; } hintContainer.appendChild(hintText); // 顯示錯誤反饋 const errorFeedback = document.createElement('p'); errorFeedback.className = 'error'; errorFeedback.textContent = '答錯了,請參考上方提示修正答案!'; feedbackContainer.appendChild(errorFeedback); } else { // 第二階段錯誤 const errorFeedback = document.createElement('p'); errorFeedback.className = 'error'; errorFeedback.textContent = '答錯了,請再試一次!'; feedbackContainer.appendChild(errorFeedback); } return false; } } // 顯示結果 function showResult() { quizContainer.style.display = 'none'; resultContainer.style.display = 'block'; // 計算得分(滿分3星) const score = Math.min(3, Math.max(1, Math.ceil(correctAnswers / questions.length * 3))); // 更新星星顯示 for (let i = 0; i < starResults.length; i++) { starResults[i].style.opacity = i < score ? '1' : '0.3'; } // 更新結果文字 if (score === 3) { resultTitle.textContent = '恭喜完成挑戰!'; resultMessage.textContent = '你已完美掌握平方展開的技巧!'; successButtons.style.display = 'block'; failButtons.style.display = 'none'; } else if (score === 2) { resultTitle.textContent = '挑戰成功!'; resultMessage.textContent = '你已基本掌握平方展開的技巧,繼續加油!'; successButtons.style.display = 'block'; failButtons.style.display = 'none'; } else { resultTitle.textContent = '再接再厲!'; resultMessage.textContent = '平方展開需要更多練習,不要氣餒!'; successButtons.style.display = 'none'; failButtons.style.display = 'block'; } // 更新遊戲進度 gameProgress.completedTrials["展開之塔"].completed = score >= 2; gameProgress.completedTrials["展開之塔"].score = score; // 標記所有問題為已完成 for (let i = 0; i < questions.length; i++) { gameProgress.completedTrials["展開之塔"].challengesCompleted[i] = true; } // 保存遊戲進度 gameProgress.lastSaved = new Date().toISOString(); localStorage.setItem(`gameProgress_${currentPlayerId}`, JSON.stringify(gameProgress)); // 檢查成就 if (window.achievementSystem) { const gameState = { currentTrial: "展開之塔", totalStars: score, currentTrialCompleted: true, currentTrialErrors: questions.length - correctAnswers, currentTrialCombo: correctAnswers, completedTrials: { "展開之塔": { completed: true, stars: score, noErrors: (questions.length - correctAnswers) === 0 } } }; window.achievementSystem.checkAllAchievements(gameState); } } // 檢查答案按鈕點擊事件 checkAnswerBtn.addEventListener('click', function() { checkAnswer(); }); // 重試按鈕點擊事件 retryBtn.addEventListener('click', function() { resultContainer.style.display = 'none'; quizContainer.style.display = 'block'; correctAnswers = 0; // 重置進度指示器 Array.from(doorsProgress).forEach(door => { door.classList.remove('completed'); }); // 重置答案 stage1Answers = Array(questions.length).fill(null).map(() => []); stage2Answers = Array(questions.length).fill(null).map(() => []); // 載入第一題 loadQuestion(0, 1); }); // 返回地圖按鈕點擊事件 backToMapBtn.addEventListener('click', function() { window.location.href = 'kingdom_map.html'; }); // 下一試煉按鈕點擊事件 nextTrialBtn.addEventListener('click', function() { window.location.href = 'kingdom_map.html'; }); // 階段按鈕點擊事件(僅用於顯示,不可切換) stage1Btn.addEventListener('click', function() { if (currentStage !== 1) { // 檢查是否已完成第一階段 if (stage1Answers[currentQuestionIndex].length > 0) { loadQuestion(currentQuestionIndex, 1); } } }); stage2Btn.addEventListener('click', function() { if (currentStage !== 2) { // 檢查是否已完成第一階段 if (stage1Answers[currentQuestionIndex].length > 0) { loadQuestion(currentQuestionIndex, 2); } else { alert('請先完成第一階段!'); } } }); });