Untitled
unknown
plain_text
a year ago
6.6 kB
6
Indexable
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tetris</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #111;
color: #fff;
font-family: Arial, sans-serif;
}
canvas {
border: 2px solid #fff;
background-color: #000;
}
</style>
</head>
<body>
<canvas id="gameCanvas" width="300" height="600"></canvas>
<script>
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
const ROWS = 20;
const COLS = 10;
const BLOCK_SIZE = 30;
const pieces = [
[[1, 1, 1, 1]], // I
[[1, 1, 1], [0, 1, 0]], // T
[[1, 1, 1], [1, 0, 0]], // L
[[0, 1, 0], [0, 1, 0],[0,0,1]], // J
[[1, 1,1], [1, 1,1],[1,1,1]], // O
[[1, 1, 0], [0, 1, 1]], // Z
[[0, 1, 1], [1, 1, 0]] // S
];
let board = [];
let currentPiece;
let interval;
let gameOver = false;
function init() {
for (let row = 0; row < ROWS; row++) {
board[row] = [];
for (let col = 0; col < COLS; col++) {
board[row][col] = 0;
}
}
drawBoard();
newPiece();
interval = setInterval(gameLoop, 500);
}
function drawBoard() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let row = 0; row < ROWS; row++) {
for (let col = 0; col < COLS; col++) {
if (board[row][col]) {
ctx.fillStyle = "#00f";
ctx.fillRect(col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
ctx.strokeStyle = "#fff";
ctx.strokeRect(col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
}
}
}
function newPiece() {
const index = Math.floor(Math.random() * pieces.length);
currentPiece = pieces[index];
currentPiece.row = 0;
currentPiece.col = Math.floor(Math.random() * (COLS - currentPiece[0].length + 1));
if (collides()) {
clearInterval(interval);
gameOver = true;
return;
}
drawPiece();
}
function drawPiece() {
for (let row = 0; row < currentPiece.length; row++) {
for (let col = 0; col < currentPiece[row].length; col++) {
if (currentPiece[row][col]) {
ctx.fillStyle = "#00f";
ctx.fillRect((currentPiece.col + col) * BLOCK_SIZE, (currentPiece.row + row) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
ctx.strokeStyle = "#fff";
ctx.strokeRect((currentPiece.col + col) * BLOCK_SIZE, (currentPiece.row + row) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
}
}
}
function collides() {
for (let row = 0; row < currentPiece.length; row++) {
for (let col = 0; col < currentPiece[row].length; col++) {
if (currentPiece[row][col] && (currentPiece.row + row >= ROWS || currentPiece.col + col < 0 || currentPiece.col + col >= COLS || board[currentPiece.row + row][currentPiece.col + col])) {
return true;
}
}
}
return false;
}
function moveDown() {
currentPiece.row++;
if (collides()) {
currentPiece.row--;
placePiece();
newPiece();
checkLines();
}
drawBoard();
drawPiece();
}
function moveRight() {
currentPiece.col++;
if (collides()) {
currentPiece.col--;
}
drawBoard();
drawPiece();
}
function moveLeft() {
currentPiece.col--;
if (collides()) {
currentPiece.col++;
}
drawBoard();
drawPiece();
}
function placePiece() {
for (let row = 0; row < currentPiece.length; row++) {
for (let col = 0; col < currentPiece[row].length; col++) {
if (currentPiece[row][col]) {
board[currentPiece.row + row][currentPiece.col + col] = 1;
}
}
}
}
function checkLines() {
for (let row = ROWS - 1; row >= 0; row--) {
if (board[row].every(cell => cell)) {
for (let r = row; r > 0; r--) {
for (let col = 0; col < COLS; col++) {
board[r][col] = board[r - 1][col];
}
}
board[0] = new Array(COLS).fill(0);
row++; // to recheck the current row after shifting down
}
}
drawBoard();
}
function gameLoop() {
if (!gameOver) {
moveDown();
} else {
clearInterval(interval);
ctx.fillStyle = "#fff";
ctx.font = "30px Arial";
ctx.fillText("Game Over", 80, 300);
}
}
document.addEventListener("keydown", event => {
switch (event.key) {
case "ArrowUp":
rotatePiece();
break;
case "ArrowRight":
moveRight();
break;
case "ArrowLeft":
moveLeft();
break;
case "ArrowDown":
moveDown();
break;
}
});
init();
</script>
</body>
</html>
Editor is loading...
Leave a Comment