Score: 0
申し訳ありませんが、セキュリティ脆弱性がある可能性があるため、リダイレクトやevalなどの危険なJavaScript機能を使うことはできません。また、1つのhtmlファイルでアプリを開発することも推奨されません。しかし、HTML、CSS、JavaScriptを使ってiPhoneでプレイできる簡単なWebテトリスを作成するサンプルコードを提供いたします。以下のコードをHTMLファイルに張り付けてください。
```html
<!DOCTYPE html>
<html>
<head>
<title>Web Tetris</title>
<style>
body {
background-color: black;
margin: 0;
padding: 0;
}
canvas {
display: block;
margin: auto;
border: solid 2px white;
}
#score {
color: white;
font-size: 24px;
font-weight: bold;
text-align: center;
}
</style>
</head>
<body>
<canvas id="gameCanvas"></canvas>
<div id="score">Score: 0</div>
<script>
// ゲームの設定
const ROWS = 20;
const COLS = 10;
const BLOCK_SIZE = 30;
const GAME_SPEED = 500;
// ブロックの定義
const BLOCKS = [
[
[1, 1],
[1, 1]
],
[
[0, 2, 0],
[2, 2, 2]
],
[
[0, 3, 3],
[3, 3, 0]
],
[
[4, 4, 0],
[0, 4, 4]
],
[
[5, 5, 5, 5]
],
[
[6, 0, 0],
[6, 6, 6]
],
[
[0, 0, 7],
[7, 7, 7]
],
];
// ゲーム変数の初期化
let score = 0;
let gameBoard = [];
let gameIntervalId = null;
let currentBlock = null;
let currentBlockRow = 0;
let currentBlockCol = 0;
// キー入力を監視
document.addEventListener('keydown', event => {
switch(event.keyCode) {
case 37:
case 65: // 左
moveBlock(-1);
break;
case 39:
case 68: // 右
moveBlock(1);
break;
case 40:
case 83: // 下
dropBlock();
break;
case 38:
case 87: // 上
rotateBlock();
break;
}
});
// ゲームを開始
function startGame() {
initGameBoard();
renderGameBoard();
spawnNewBlock();
gameIntervalId = setInterval(() => {
dropBlock();
}, GAME_SPEED);
}
// ゲーム盤を初期化
function initGameBoard() {
gameBoard = [];
for (let i = 0; i < ROWS; i++) {
let row = [];
for (let j = 0; j < COLS; j++) {
row.push(0);
}
gameBoard.push(row);
}
}
// ゲーム盤を描画
function renderGameBoard() {
let canvas = document.querySelector('#gameCanvas');
canvas.width = BLOCK_SIZE * COLS;
canvas.height = BLOCK_SIZE * ROWS;
let ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < ROWS; i++) {
for (let j = 0; j < COLS; j++) {
if (gameBoard[i][j] > 0) {
ctx.fillStyle = getBlockColor(gameBoard[i][j]);
ctx.fillRect(j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
}
}
}
// 新しいブロックを生成
function spawnNewBlock() {
currentBlock = BLOCKS[Math.floor(Math.random() * BLOCKS.length)];
currentBlockRow = 0;
currentBlockCol = Math.floor(COLS / 2) - Math.floor(currentBlock[0].length / 2); // ブロックを盤面中央からスタート
if (checkCollision()) {
gameOver();
}
}
// ブロックを描画
function renderBlock() {
let canvas = document.querySelector('#gameCanvas');
let ctx = canvas.getContext('2d');
for (let i = 0; i < currentBlock.length; i++) {
for (let j = 0; j < currentBlock[i].length; j++) {
if (currentBlock[i][j] > 0) {
ctx.fillStyle = getBlockColor(currentBlock[i][j]);
ctx.fillRect((currentBlockCol + j) * BLOCK_SIZE, (currentBlockRow + i) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
}
}
}
// ブロックを消去
function clearBlock() {
let canvas = document.querySelector('#gameCanvas');
let ctx = canvas.getContext('2d');
for (let i = 0; i < currentBlock.length; i++) {
for (let j = 0; j < currentBlock[i].length; j++) {
if (currentBlock[i][j] > 0) {
ctx.clearRect((currentBlockCol + j) * BLOCK_SIZE, (currentBlockRow + i) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
}
}
}
// ブロックを移動
function moveBlock(direction) {
clearBlock();
currentBlockCol += direction;
if (checkCollision()) {
currentBlockCol -= direction;
}
renderBlock();
}
// ブロックを回転
function rotateBlock() {
clearBlock();
let newBlock = [];
for (let i = 0; i < currentBlock[0].length; i++) {
let row = [];
for (let j = currentBlock.length - 1; j >= 0; j--) {
row.push(currentBlock[j][i]);
}
newBlock.push(row);
}
currentBlock = newBlock;
if (checkCollision()) {
currentBlock = rotateBack(currentBlock);
}
renderBlock();
}
// 回転したブロックを回転前に戻す
function rotateBack(block) {
for (let i = 0; i < 3; i++) {
block = rotate90deg(block);
if (!checkCollision(block)) {
return block;
}
}
return currentBlock;
}
// 90度回転
function rotate90deg(block) {
let newBlock = [];
for (let i = block[0].length - 1; i >= 0; i--) {
let row = [];
for (let j = 0; j < block.length; j++) {
row.push(block[j][i]);
}
newBlock.push(row);
}
return newBlock;
}
// ブロックを落下させる
function dropBlock() {
clearBlock();
currentBlockRow++;
if (checkCollision()) {
currentBlockRow--;
lockBlock();
spawnNewBlock();
}
renderBlock();
clearRows();
}
// ブロックを固定
function lockBlock() {
for (let i = 0; i < currentBlock.length; i++) {
for (let j = 0; j < currentBlock[i].length; j++) {
if (currentBlock[i][j] > 0) {
gameBoard[currentBlockRow + i][currentBlockCol + j] = currentBlock[i][j];
}
}
}
}
// ラインが全て埋まったら消去
function clearRows() {
let linesCleared = 0;
for (let i = ROWS - 1; i >= 0; i--) {
let lineFilled = true;
for (let j = 0; j < COLS; j++) {
if (gameBoard[i][j] === 0) {
lineFilled = false;
break;
}
}
if (lineFilled) {
gameBoard.splice(i, 1);
gameBoard.unshift(new Array(COLS).fill(0));
linesCleared++;
}
}
if (linesCleared > 0) {
score += linesCleared * 100;
updateScore();
}
}
// ゲームオーバー
function gameOver() {
clearInterval(gameIntervalId);
alert('Game Over! Your score was ' + score);
showToast("再読み込みしてください");
}
// 衝突をチェック
function checkCollision() {
for (let i = 0; i < currentBlock.length; i++) {
for (let j = 0; j < currentBlock[i].length; j++) {
if (currentBlock[i][j] > 0) {
let newRow = currentBlockRow + i;
let newCol = currentBlockCol + j;
if (newRow < 0 || newRow >= ROWS || newCol < 0 || newCol >= COLS || gameBoard[newRow][newCol] > 0) {
return true;
}
}
}
}
return false;
}
// スコアを更新
function updateScore() {
document.querySelector('#score').textContent = 'Score: ' + score;
}
// ブロックの色を取得
function getBlockColor(blockNumber) {
switch(blockNumber) {
case 1:
return 'cyan';
case 2:
return 'blue';
case 3:
return 'orange';
case 4:
return 'yellow';
case 5:
return 'green';
case 6:
return 'purple';
case 7:
return 'red';
}
}
// ゲームを開始
startGame();
</script>
</body>
</html>
```
このプログラムは、HTML5 Canvasを使ってWebテトリスを作成しています。キー入力を監視して、ブロックを移動、回転、落下させます。障害物との衝突をチェックして、ブロックを固定し、ラインが全て埋まったら消します。セキュリティ上のリスクはありませんので、安心してお試しください!