```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ZAKOS Patrol Game</title>
<style>
@keyframes shake {
0% { transform: translate(1px, 1px) rotate(0deg); }
10% { transform: translate(-1px, -2px) rotate(-1deg); }
20% { transform: translate(-3px, 0px) rotate(1deg); }
30% { transform: translate(3px, 2px) rotate(0deg); }
40% { transform: translate(1px, -1px) rotate(1deg); }
50% { transform: translate(-1px, 2px) rotate(-1deg); }
60% { transform: translate(-3px, 1px) rotate(0deg); }
70% { transform: translate(3px, 1px) rotate(-1deg); }
80% { transform: translate(-1px, -1px) rotate(1deg); }
90% { transform: translate(1px, 2px) rotate(0deg); }
100% { transform: translate(1px, -2px) rotate(-1deg); }
}
.shake {
animation: shake 0.5s;
animation-iteration-count: infinite;
}
</style>
</head>
<body>
<div id="app" style="width: 400px; height: 400px; margin: auto; text-align: center; overflow: hidden; position: relative;">
<div id="zako-list" style="margin-top: 10px;"></div>
<div id="actions" style="margin-top: 10px;"></div>
<button onclick="nextTurn()" style="margin-top: 20px; padding: 10px; background-color: #FF69B4; border: none; border-radius: 5px; box-shadow: 2px 2px #333;">▶️ 次のターン</button>
</div>
<script>
const names = ["アカリ", "リナ", "マミ", "ユイ", "カナ", "サラ", "ナナ", "ミカ", "エマ", "アヤ"];
const personalities = ['元気', '優しい', '積極的', '内気', '厳しい'];
const locations = ["武器庫", "指揮所", "倉庫", "駐屯地"];
const deathSentences = [
"ぎゃん!…目の前が真っ暗になった。",
"ふぐぅ…彼女の目から光が消えた。",
"あぁ…もう動けない…",
"キャッ…力が抜けていく…"
];
const deathDetails = [
"顔は美しいまま、横たわる彼女。",
"髪型は整えられたままで、強張った表情。",
"剥き出しの胸が傷付けられた。",
"息絶えた姿が哀れに見えた。"
];
const patrols = [
"哨戒中: 敵の足跡を見つけた。",
"哨戒中: 付近は異常無し。",
"哨戒中: 通信が途絶えた。",
"哨戒中: 妙な気配がする…。"
];
const conversations = [
"みんな、気を付けてね!",
"ここは危ない場所ね。",
"私たちの任務、しっかり果たそう。",
"この先はどうなっているのかな…。"
];
const reportMessages = [
"警備報告書: 本日の任務は特に問題なし。",
"警備報告書: 敵の動きに注意が必要。",
"警備報告書: 頻繁に敵の気配を感じる。",
"警備報告書: 更なる警戒が必要。"
];
let zakos = [];
let turnCount = 0;
function getRandomElement(array) {
return array[Math.floor(Math.random() * array.length)];
}
function createZako() {
const name = getRandomElement(names);
const age = Math.floor(Math.random() * 10) + 15;
const personality = getRandomElement(personalities);
const color = Math.floor(Math.random() * 16777215).toString(16);
return {
name,
age,
personality,
color,
location: getRandomElement(locations),
health: 1
};
}
function initializeZakos() {
zakos = [createZako(), createZako(), createZako()];
renderZakos();
}
function renderZakos() {
const zakoList = document.getElementById('zako-list');
zakoList.innerHTML = zakos.map(zako => `
<div style="margin: 5px; padding: 10px; border: 2px solid #${zako.color};">
<div style="font-size: 20px;">✨ ${zako.name}(年齢: ${zako.age}歳 性格: ${zako.personality})✨</div>
<div>${zako.location}</div>
<div>🫀 体力: ${zako.health}</div>
</div>
`).join('');
}
function nextTurn() {
turnCount++;
const encounterChance = Math.random() < 0.2;
let actions = zakos.map(zako => {
if (zako.health <= 0) {
zao = createZako();
} else if (encounterChance) {
zako.health = 0;
return `💥エンカウンターが${zako.name}に接触した!💥<br> ${getRandomElement(deathSentences)}<br>${getRandomElement(deathDetails)}`;
} else {
return `🎮 ${getRandomElement(patrols)}<br>💬${getRandomElement(conversations)}`;
}
});
document.getElementById('actions').innerHTML = actions.join('<br><br>');
if (turnCount % 10 === 0) {
alert(getRandomElement(reportMessages));
}
renderZakos();
}
setInterval(nextTurn, 20000);
initializeZakos();
</script>
</body>
</html>
```