海战 - 5x5 行动

海战

欢迎,舰长!
`; } else if (val === 3) { cell.classList.add('miss-bg'); cell.innerHTML = `
`; } }); updateCombatMessage(); } function handleCombatShot(x, y) { const opponentId = gameState.currentPlayer === 1 ? 2 : 1; const opponentGrid = gameState.players[opponentId].grid; const index = y * GRID_SIZE + x; const cell = gameState.cells[index]; if (cell.innerHTML !== '') { messageInfo.textContent = "这里已经瞄准过了!"; return; } gameState.isTurnLocked = true; radarBtn.classList.add('hidden'); const targetValue = opponentGrid[index]; if (targetValue === 1) { // TOUCHÉ opponentGrid[index] = 2; cell.classList.add('hit-bg'); cell.innerHTML = `
💥
`; // NOUVEAU : Logique "Coulé" const hitShip = gameState.players[opponentId].ships.find(s => s.coords.includes(index)); // Si le bateau est entièrement touché if (hitShip && hitShip.coords.every(idx => opponentGrid[idx] === 2)) { messageInfo.textContent = `轰!${hitShip.name}沉没了!`; } else { messageInfo.textContent = "轰!命中!"; } } else { // PLOUF opponentGrid[index] = 3; cell.classList.add('miss-bg'); cell.innerHTML = `
`; messageInfo.textContent = "扑通……没打中。"; } if (checkWin(opponentId)) { setTimeout(() => showWinScreen(gameState.currentPlayer), 1000); } else { setTimeout(() => { const nextPlayer = opponentId; showTransitionScreen(`轮到玩家 ${nextPlayer}`, "把手机传过去!", () => startNextTurn(nextPlayer)); }, 3000); } } function startNextTurn(player) { gameState.currentPlayer = player; gameState.isTurnLocked = false; document.body.className = player === 1 ? "theme-j1" : "theme-j2"; renderCombatView(); radarBtn.classList.remove('hidden'); } // NOUVEAU : Radar amélioré qui montre les vrais bateaux ET les dégâts subis function showMyFleet() { if(gameState.isTurnLocked || gameState.phase !== 'combat') return; // 1. NETTOYAGE COMPLET : On remet la classe 'cell' de base // Cela supprime hit-bg, miss-bg (vos tirs) et les anciens z-indexes gameState.cells.forEach(cell => { cell.innerHTML = ''; cell.className = 'cell'; }); // 2. On redessine les VRAIS bateaux const myShips = gameState.players[gameState.currentPlayer].ships; myShips.forEach(ship => { let headIndex = ship.y * GRID_SIZE + ship.x; const part = document.createElement('div'); part.classList.add('ship-marker', ship.cssClass); if(!ship.horizontal) part.classList.add('is-vertical'); gameState.cells[headIndex].classList.add('high-z-index'); gameState.cells[headIndex].appendChild(part); }); // 3. On affiche les dégâts SUBIS par NOTRE flotte const myGrid = gameState.players[gameState.currentPlayer].grid; gameState.cells.forEach((cell, i) => { const val = myGrid[i]; if (val === 2) { // Feu const fire = document.createElement('div'); fire.className = 'result-container'; fire.innerHTML = '🔥'; // CORRECTIF : On monte la case au-dessus du bateau cell.classList.add('impact-z-index'); cell.appendChild(fire); } else if (val === 3) { // Plouf (tir adversaire) const ripple = document.createElement('div'); ripple.className = 'result-container'; ripple.innerHTML = '
'; // CORRECTIF : On monte la case au-dessus du bateau cell.classList.add('impact-z-index'); cell.appendChild(ripple); } }); messageInfo.textContent = "雷达视图"; gridContainer.style.border = "3px solid #ff9800"; } function hideMyFleet() { if(gameState.phase !== 'combat') return; renderCombatView(); gridContainer.style.border = "2px solid rgba(255,255,255,0.4)"; } function checkWin(opponentId) { const grid = gameState.players[opponentId].grid; return !grid.includes(1); } function showWinScreen(winner) { transitionOverlay.classList.remove('hidden'); transitionTitle.innerHTML = `🎉 胜利!🎉`; document.getElementById('transition-text').innerHTML = `恭喜玩家 ${winner}!
你击沉了对方的全部舰队!`; transitionBtn.textContent = "再来一局"; transitionBtn.onclick = function() { initGame(); document.getElementById('transition-overlay').classList.add('hidden'); this.onclick = function() { endTransition(); }; }; radarBtn.classList.add('hidden'); document.getElementById('restart-btn-top').classList.add('hidden'); } function showTransitionScreen(title, text, callback) { onTransitionEnd = callback; transitionTitle.innerHTML = title; document.getElementById('transition-text').innerHTML = text; transitionOverlay.classList.remove('hidden'); radarBtn.classList.add('hidden'); rotateBtn.classList.add('hidden'); validateBtn.classList.add('hidden'); transitionBtn.textContent = "是我!"; document.getElementById('cancel-btn').classList.add('hidden'); } function endTransition() { transitionOverlay.classList.add('hidden'); if (onTransitionEnd) onTransitionEnd(); } let onTransitionEnd = null; createGrid();