あ、素晴らしい指摘ですね!確かに、ウィットウォーリアーらしさをもっと前面に出すべきでした。それでは、もう少しユーモアと知的な遊び心を加えてみましょう。
では、ウィットウォーリアー的要素を強化したバージョンをお見せします:
```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ウィットウォーリアーの哲学的テトリス</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0 ;
font-family: 'Courier New', monospace;
}
#game -container {
display: flex;
flex-direction: column;
align-items: center;
}
#tetris -board {
border: 2px solid #333 ;
background-color: #111 ;
}
margin-top: 20px;
font-size: 18px;
text-align: center;
max-width: 300px;
}
#start -button {
margin-top: 20px;
padding: 10px 20px;
font-size: 18px;
background-color: #4CAF50 ;
color: white;
border: none;
cursor: pointer;
}
#start -button:hover {
background-color: #45a049 ;
}
</style>
</head>
<body>
<div id="game-container">
<canvas id="tetris-board" width="300" height="600"></canvas>
<div id="score">量子的スコア: 0 と ∞ の重ね合わせ</div>
<div id="wit-quote">「我落とす、ゆえに我在り」</div>
<button id="start-button">存在を開始</button>
</div>
<script>
const canvas = document.getElementById('tetris-board');
const ctx = canvas.getContext('2d');
const scoreElement = document.getElementById('score');
const witQuoteElement = document.getElementById('wit-quote');
const startButton = document.getElementById('start-button');
const ROWS = 20;
const COLS = 10;
const BLOCK_SIZE = 30;
const COLORS = [
'#00FFFF', '#FFFF00', '#800080', '#0000FF',
'#FFA500', '#00FF00', '#FF0000'
];
let board = Array(ROWS).fill().map(() => Array(COLS).fill(0));
let score = 0;
let currentPiece = null;
let gameInterval = null;
let philosophicalMoment = 0;
const SHAPES = [
[[1, 1, 1, 1]],
[[1, 1], [1, 1]],
[[0, 1, 0], [1, 1, 1]],
[[1, 0, 0], [1, 1, 1]],
[[0, 0, 1], [1, 1, 1]],
[[0, 1, 1], [1, 1, 0]],
[[1, 1, 0], [0, 1, 1]]
];
const WIT_QUOTES = [
"「我落とす、ゆえに我在り」",
"「四角い輪廻からの解脱」",
"「整列は幻想、混沌こそ真理」",
"「消えゆく列、悟りの瞬間」",
"「回転は人生、適応は知恵」",
"「積み上げては崩す、人生の縮図」",
"「隙間を埋めるは、我が使命なり」",
"「我思う、ゆえに我テトリス」"
];
function updateWitQuote() {
witQuoteElement.textContent = WIT_QUOTES[Math.floor(Math.random() * WIT_QUOTES.length)];
}
function drawBlock(x, y, color) {
ctx.fillStyle = color;
ctx.fillRect(x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
ctx.strokeStyle = '#111';
ctx.strokeRect(x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
function drawBoard() {
board.forEach((row, y) => {
row.forEach((value, x) => {
if (value > 0) {
drawBlock(x, y, COLORS[value - 1]);
}
});
});
}
function createPiece() {
const shapeIndex = Math.floor(Math.random() * SHAPES.length);
const shape = SHAPES[shapeIndex];
return {
shape: shape,
color: COLORS[shapeIndex],
x: Math.floor(COLS / 2) - Math.floor(shape[0].length / 2),
y: 0
};
}
function drawPiece() {
currentPiece.shape.forEach((row, y) => {
row.forEach((value, x) => {
if (value) {
drawBlock(currentPiece.x + x, currentPiece.y + y, currentPiece.color);
}
});
});
}
function isCollision() {
return currentPiece.shape.some((row, y) => {
return row.some((value, x) => {
if (!value) return false;
const boardX = currentPiece.x + x;
const boardY = currentPiece.y + y;
return boardX < 0 || boardX >= COLS || boardY >= ROWS || (boardY >= 0 && board[boardY][boardX]);
});
});
}
function merge() {
currentPiece.shape.forEach((row, y) => {
row.forEach((value, x) => {
if (value) {
board[currentPiece.y + y][currentPiece.x + x] = COLORS.indexOf(currentPiece.color) + 1;
}
});
});
}
function rotate() {
const rotated = currentPiece.shape[0].map((_, i) =>
currentPiece.shape.map(row => row[i]).reverse()
);
const previousShape = currentPiece.shape;
currentPiece.shape = rotated;
if (isCollision()) {
currentPiece.shape = previousShape;
} else {
philosophicalMoment++;
if (philosophicalMoment % 4 === 0) {
updateWitQuote();
}
}
}
function clearLines() {
let linesCleared = 0;
for (let y = ROWS - 1; y >= 0; y--) {
if (board[y].every(value => value !== 0)) {
board.splice(y, 1);
board.unshift(Array(COLS).fill(0));
linesCleared++;
y++;
}
}
if (linesCleared > 0) {
score += linesCleared * linesCleared * 100;
scoreElement.textContent = `量子的スコア: ${score} と ${score + 1} の重ね合わせ`;
updateWitQuote();
}
}
function gameLoop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBoard();
drawPiece();
currentPiece.y++;
if (isCollision()) {
currentPiece.y--;
merge();
clearLines();
currentPiece = createPiece();
if (isCollision()) {
alert('ゲームオーバー!存在の果てに到達しました。再び「存在を開始」しますか?');
clearInterval(gameInterval);
startButton.disabled = false;
}
}
}
function startGame() {
board = Array(ROWS).fill().map(() => Array(COLS).fill(0));
score = 0;
scoreElement.textContent = '量子的スコア: 0 と ∞ の重ね合わせ';
currentPiece = createPiece();
if (gameInterval) clearInterval(gameInterval);
gameInterval = setInterval(gameLoop, 500);
startButton.disabled = true;
updateWitQuote();
}
document.addEventListener('keydown', event => {
if (!currentPiece) return;
switch (event.key) {
case 'ArrowLeft':
currentPiece.x--;
if (isCollision()) currentPiece.x++;
break;
case 'ArrowRight':
currentPiece.x++;
if (isCollision()) currentPiece.x--;
break;
case 'ArrowDown':
currentPiece.y++;
if (isCollision()) {
currentPiece.y--;
merge();
clearLines();
currentPiece = createPiece();
}
break;
case 'ArrowUp':
rotate();
break;
}
});
startButton.addEventListener('click', startGame);
</script>
</body>
</html>
```
このバージョンでは、以下のようなウィットウォーリアー的要素を追加しました:
1. **哲学的なゲームタイトル**: 「ウィットウォーリアーの哲学的テトリス」
2. **ウィットに富んだクォート**: ゲーム中に表示される哲学的で面白いメッセージ。例えば:
- 「我落とす、ゆえに我在り」
- 「四角い輪廻からの解脱」
- 「整列は幻想、混沌こそ真理」
3. **量子的スコア**: スコアを「量子的スコア: X と Y の重ね合わせ」として表示。これは量子力学の概念をユーモラスに取り入れています。
4. **存在論的なボタンラベル**: 「Start Game」の代わりに「存在を開始」というラベルを使用。
5. **哲学的な回転**: ピースを回転させるたびに「哲学的瞬間」のカウントが増加し、一定回数で新しいウィットクォートが表示されます。
6. **存在論的ゲームオーバーメッセージ**: 「ゲームオーバー!存在の果てに到達しました。再び「存在を開始」しますか?」
これらの要素は、テトリスというゲームに哲学的な深みとユーモアを加えています。プレイヤーは単にブロックを積み上げるだけでなく、その行為の意味や存在について考えさせられるかもしれません。
「我テトリス、ゆえに我笑う」という精神で、このゲームは単なる暇つぶしから、軽い哲学的思考実験へと昇華しています。プレイヤーは、ブロックを操作しながら、存在や秩序、混沌について、ユーモアを交えて考えることができるでしょう。
このアプローチは、ウィットウォーリアーの「真面目さとユーモアのバランス」という特性をよく表現していると思います。どうぞお楽しみください!