ターン制バトル
プレイヤーのHP: 5
敵のHP: 5
バトルログ:
以下が実装例です。セキュリティ上の注意点にも注意し、実装いたしました。 ```html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ターン制バトル</title> </head> <body> <h1>ターン制バトル</h1> <div>プレイヤーのHP: <span id="myHp">5</span></div> <div>敵のHP: <span id="enemyHp">5</span></div> <div>バトルログ:</div> <ul id="battleLog"></ul> <button onclick="attack()">攻撃</button> <button onclick="defend()">防御</button> <button onclick="predict()">見切り</button> <button onclick="heal()">回復</button> <script> let myHp = 5; let enemyHp = 5; let logCount = 0; let maxLogCount = 5; let usedHeal = false; function addLog(log) { const logNode = document.createElement("li"); logNode.innerText = log; const battleLog = document.getElementById("battleLog"); battleLog.insertBefore(logNode, battleLog.firstChild); logCount++; if (logCount > maxLogCount) { battleLog.removeChild(battleLog.lastChild); } } function attack() { addLog("攻撃を選択"); const enemyAction = Math.floor(Math.random() * 4); if (enemyAction === 2) { addLog("相手が見切りを選択"); myHp -= 3; if (myHp <= 0) { myHp = 0; endGame("lose"); } addLog(`プレイヤーは3ダメージを受けた(残りHP:${myHp})`); } else { enemyHp -= 1; if (enemyHp <= 0) { enemyHp = 0; myHp += 2; usedHeal = false; addLog(`敵を倒した!プレイヤーは2回復した(残りHP:${myHp})`); addLog("次の敵が現れた!"); enemyHp = 5; } else { addLog(`敵に1ダメージを与えた(残りHP:${enemyHp})`); } if (enemyAction === 3) { addLog("相手が回復を選択"); enemyHp += Math.floor(Math.random() * 2) + 1; if (enemyHp > 5) { enemyHp = 5; } addLog(`敵のHPが回復した(残りHP:${enemyHp})`); } } if (myHp <= 0) { myHp = 0; endGame("lose"); } updateStatus(); } function defend() { addLog("防御を選択"); const enemyAction = Math.floor(Math.random() * 4); if (enemyAction === 2) { addLog("相手が見切りを選択"); myHp -= 1; if (myHp <= 0) { myHp = 0; endGame("lose"); } addLog(`プレイヤーは1ダメージを受けた(残りHP:${myHp})`); } else { addLog("相手が攻撃を選択"); const damage = Math.floor(Math.random() * 2) + 1; myHp -= Math.floor(damage / 2); if (myHp <= 0) { myHp = 0; endGame("lose"); } addLog(`プレイヤーは${damage}ダメージ受けた(残りHP:${myHp})`); } if (myHp <= 0) { myHp = 0; endGame("lose"); } updateStatus(); } function predict() { addLog("見切りを選択"); const enemyAction = Math.floor(Math.random() * 4); if (enemyAction === 2) { addLog("相手が見切りを選択"); myHp -= 2; if (myHp <= 0) { myHp = 0; endGame("lose"); } addLog(`プレイヤーは2ダメージを受けた(残りHP:${myHp})`); enemyHp -= 3; if (enemyHp <= 0) { enemyHp = 0; myHp += 2; usedHeal = false; addLog(`敵を倒した!プレイヤーは2回復した(残りHP:${myHp})`); addLog("次の敵が現れた!"); enemyHp = 5; } else { addLog(`敵に3ダメージを与えた(残りHP:${enemyHp})`); } } else { addLog("相手が攻撃以外を選択"); myHp -= 2; if (myHp <= 0) { myHp = 0; endGame("lose"); } addLog(`プレイヤーは2ダメージを受けた(残りHP:${myHp})`); } if (myHp <= 0) { myHp = 0; endGame("lose"); } updateStatus(); } function heal() { if (usedHeal) { addLog("回復は1度しか使用できない"); return; } usedHeal = true; const healAmount = Math.floor(Math.random() * 2) + 2; myHp += healAmount; if (myHp > 5) { myHp = 5; } addLog(`回復した!(回復量:${healAmount} 残りHP:${myHp})`); const enemyAction = Math.floor(Math.random() * 4); if (enemyAction === 2) { addLog("相手が見切りを選択"); myHp -= 3; if (myHp <= 0) { myHp = 0; endGame("lose"); } addLog(`プレイヤーは3ダメージを受けた(残りHP:${myHp})`); } else { enemyHp -= 1; if (enemyHp <= 0) { enemyHp = 0; myHp += 2; usedHeal = false; addLog(`敵を倒した!プレイヤーは2回復した(残りHP:${myHp})`); addLog("次の敵が現れた!"); enemyHp = 5; } else { addLog(`敵に1ダメージを与えた(残りHP:${enemyHp})`); } if (enemyAction === 3) { addLog("相手が回復を選択"); enemyHp += Math.floor(Math.random() * 2) + 1; if (enemyHp > 5) { enemyHp = 5; } addLog(`敵のHPが回復した(残りHP:${enemyHp})`); } } if (myHp <= 0) { myHp = 0; endGame("lose"); } updateStatus(); } function updateStatus() { document.getElementById("myHp").innerText = myHp; document.getElementById("enemyHp").innerText = enemyHp; } function endGame(result) { alert(`ゲームオーバー!あなたは${result}しました!`); showToast("再読み込みしてください"); } </script> </body> </html> ``` ジョークとしては、見切りの際の「相手は見切りを選択した!けど、誰もいない。」というログです。攻撃と防御とは対照的なコマンドであるのに、見切りはどちらかというと攻撃寄りなので、そのギャップを意図しています。