当前位置: 首页 > article >正文

网页版的俄罗斯方块

1、新建一个txt文件
2、打开后将代码复制进去保存

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>俄罗斯方块</title>
    <link rel="stylesheet" href="styles.css">
</head>

<body>
  
    <div class="game-container">
        <div id="game-board"></div>
        <div class="sidebar">
            <div class="score-board">
                <h2>得分: <span id="score">0</span></h2>
            </div>
            <div class="next-piece-board">
                <h2>下一个方块</h2>
                <div id="next-piece"></div>
            </div>
            <div class="controls">
                <h2>操作说明</h2>
                <p>左箭头: 左移</p>
                <p>右箭头: 右移</p>
                <p>下箭头: 下落</p>
                <p>上箭头: 旋转</p>
                <div class="control-buttons">
                    <button id="left-btn">左移</button>
                    <button id="right-btn">右移</button>
                    <button id="down-btn">下落</button>
                    <button id="rotate-btn">旋转</button>
                </div>
            </div>
        </div>
    </div>
    <script src="script.js"></script>


</body>

</html>
<style>
body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-color: #f0f0f0;
}

.game-container {
    display: flex;
    gap: 20px;
}

#game-board {
    display: grid;
    grid-template-columns: repeat(10, 20px);
    grid-template-rows: repeat(20, 20px);
    gap: 1px;
    background-color: #333;
    width: fit-content;
}

.cell {
    width: 20px;
    height: 20px;
    background-color: #000;
}

.cell.filled {
    background-color: #0f0;
}

.sidebar {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

.score-board,
.next-piece-board,
.controls {
    background-color: #fff;
    padding: 10px;
    border-radius: 5px;
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}

#next-piece {
    display: grid;
    grid-template-columns: repeat(4, 20px);
    grid-template-rows: repeat(4, 20px);
    gap: 1px;
    background-color: #333;
    width: fit-content;
}

.control-buttons {
    display: flex;
    gap: 10px;
}

.control-buttons button {
    padding: 5px 10px;
    cursor: pointer;
}

</style>
<script>
// 游戏板尺寸
const ROWS = 20;
const COLS = 10;

// 方块形状
const SHAPES = [
    [[1, 1, 1, 1]],
    [[1, 1], [1, 1]],
    [[1, 1, 0], [0, 1, 1]],
    [[0, 1, 1], [1, 1, 0]],
    [[1, 1, 1], [0, 1, 0]],
    [[1, 1, 1], [1, 0, 0]],
    [[1, 1, 1], [0, 0, 1]]
];

// 获取游戏板元素
const gameBoard = document.getElementById('game-board');
const nextPieceBoard = document.getElementById('next-piece');
const scoreElement = document.getElementById('score');

// 创建游戏板
function createBoard() {
    for (let row = 0; row < ROWS; row++) {
        for (let col = 0; col < COLS; col++) {
            const cell = document.createElement('div');
            cell.classList.add('cell');
            gameBoard.appendChild(cell);
        }
    }
}

// 创建下一个方块显示区域
function createNextPieceBoard() {
    for (let row = 0; row < 4; row++) {
        for (let col = 0; col < 4; col++) {
            const cell = document.createElement('div');
            cell.classList.add('cell');
            nextPieceBoard.appendChild(cell);
        }
    }
}

// 获取指定位置的单元格
function getCell(row, col, board) {
    return board.children[row * (board === gameBoard ? COLS : 4) + col];
}

// 随机生成一个方块
function randomShape() {
    const shapeIndex = Math.floor(Math.random() * SHAPES.length);
    return SHAPES[shapeIndex];
}

// 当前方块
let currentShape;
let currentX;
let currentY;
// 下一个方块
let nextShape;
// 得分
let score = 0;

// 生成新方块
function newShape() {
    currentShape = nextShape || randomShape();
    nextShape = randomShape();
    drawNextPiece();
    currentX = Math.floor(COLS / 2) - Math.floor(currentShape[0].length / 2);
    currentY = 0;
    if (!canMove(currentShape, currentX, currentY)) {
        // 游戏结束
        alert('游戏结束!最终得分: ' + score);
        location.reload();
    }
}

// 检查方块是否可以移动到指定位置
function canMove(shape, x, y) {
    for (let row = 0; row < shape.length; row++) {
        for (let col = 0; col < shape[row].length; col++) {
            if (shape[row][col]) {
                const newX = x + col;
                const newY = y + row;
                if (newX < 0 || newX >= COLS || newY >= ROWS || (newY >= 0 && getCell(newY, newX, gameBoard).classList.contains('filled'))) {
                    return false;
                }
            }
        }
    }
    return true;
}

// 绘制方块
function drawShape() {
    for (let row = 0; row < currentShape.length; row++) {
        for (let col = 0; col < currentShape[row].length; col++) {
            if (currentShape[row][col]) {
                const x = currentX + col;
                const y = currentY + row;
                if (y >= 0) {
                    getCell(y, x, gameBoard).classList.add('filled');
                }
            }
        }
    }
}

// 清除方块
function clearShape() {
    for (let row = 0; row < currentShape.length; row++) {
        for (let col = 0; col < currentShape[row].length; col++) {
            if (currentShape[row][col]) {
                const x = currentX + col;
                const y = currentY + row;
                if (y >= 0) {
                    getCell(y, x, gameBoard).classList.remove('filled');
                }
            }
        }
    }
}

// 绘制下一个方块
function drawNextPiece() {
    // 清除之前的显示
    for (let row = 0; row < 4; row++) {
        for (let col = 0; col < 4; col++) {
            getCell(row, col, nextPieceBoard).classList.remove('filled');
        }
    }
    // 绘制新的下一个方块
    for (let row = 0; row < nextShape.length; row++) {
        for (let col = 0; col < nextShape[row].length; col++) {
            if (nextShape[row][col]) {
                getCell(row, col, nextPieceBoard).classList.add('filled');
            }
        }
    }
}

// 方块下落
function moveDown() {
    clearShape();
    if (canMove(currentShape, currentX, currentY + 1)) {
        currentY++;
    } else {
        // 方块落地,固定方块
        drawShape();
        checkLines();
        newShape();
    }
    drawShape();
}

// 检查并清除满行
function checkLines() {
    let linesCleared = 0;
    for (let row = ROWS - 1; row >= 0; row--) {
        let isLineFull = true;
        for (let col = 0; col < COLS; col++) {
            if (!getCell(row, col, gameBoard).classList.contains('filled')) {
                isLineFull = false;
                break;
            }
        }
        if (isLineFull) {
            linesCleared++;
            // 清除满行
            for (let c = 0; c < COLS; c++) {
                getCell(row, c, gameBoard).classList.remove('filled');
            }
            // 上方方块下移
            for (let r = row; r > 0; r--) {
                for (let c = 0; c < COLS; c++) {
                    const aboveCell = getCell(r - 1, c, gameBoard);
                    const currentCell = getCell(r, c, gameBoard);
                    if (aboveCell.classList.contains('filled')) {
                        currentCell.classList.add('filled');
                    } else {
                        currentCell.classList.remove('filled');
                    }
                }
            }
            row++; // 再次检查当前行
        }
    }
    // 根据清除的行数增加得分
    if (linesCleared > 0) {
        score += linesCleared * 100;
        scoreElement.textContent = score;
    }
}

// 移动方块
function moveLeft() {
    clearShape();
    if (canMove(currentShape, currentX - 1, currentY)) {
        currentX--;
    }
    drawShape();
}

function moveRight() {
    clearShape();
    if (canMove(currentShape, currentX + 1, currentY)) {
        currentX++;
    }
    drawShape();
}

// 旋转方块
function rotateShape() {
    const rotatedShape = [];
    for (let col = 0; col < currentShape[0].length; col++) {
        const newRow = [];
        for (let row = currentShape.length - 1; row >= 0; row--) {
            newRow.push(currentShape[row][col]);
        }
        rotatedShape.push(newRow);
    }
    clearShape();
    if (canMove(rotatedShape, currentX, currentY)) {
        currentShape = rotatedShape;
    }
    drawShape();
}

// 键盘事件处理
document.addEventListener('keydown', function (event) {
    switch (event.key) {
        case 'ArrowLeft':
            moveLeft();
            break;
        case 'ArrowRight':
            moveRight();
            break;
        case 'ArrowDown':
            moveDown();
            break;
        case 'ArrowUp':
            rotateShape();
            break;
    }
});

// 按钮事件处理
document.getElementById('left-btn').addEventListener('click', moveLeft);
document.getElementById('right-btn').addEventListener('click', moveRight);
document.getElementById('down-btn').addEventListener('click', moveDown);
document.getElementById('rotate-btn').addEventListener('click', rotateShape);

// 游戏主循环
function gameLoop() {
    moveDown();
    setTimeout(gameLoop, 500);
}

// 初始化游戏
createBoard();
createNextPieceBoard();
newShape();
gameLoop();


</script>

3、修改文件后缀名为,将txt修改为html
4、打开方式选择浏览器打开,或者打开浏览器直接拖动到里面即可。如果后缀名修改html后,图标显示的是浏览器的图标,直接双击打开即可。
5、效果如下:
在这里插入图片描述


http://www.kler.cn/a/556954.html

相关文章:

  • logstash中的input插件(http插件,graphite插件)
  • express+Vue2进行项目实战-景点后台管理系统(上篇)
  • Java之——“String类”(内容较多,结合目录察看分类)
  • 2025年股指期货和股指期权合约交割的通知!
  • [实现Rpc] 通信-Muduo库的实现 | 完美转发 | reserve | unique_lock
  • Rust 未来会成为主流的编程语言吗?
  • 赞赏系统PHP网站源码
  • 3.12 企业级智能文档引擎:从技术手册到产品报告的全链路自动化实践指南
  • Spring Boot 项目开发流程全解析
  • 计算机视觉(CV)
  • 领略算法真谛:倍增思想
  • Safari 插件开发流程
  • 学习整理安装php的uuid扩展以及uuid调用方法
  • 启元世界(Inspir.ai)技术浅析(八):AI 数值设计
  • 【CXX】4 跨平台构建系统特性对比
  • git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库
  • Day7 25/2/20 THU
  • 负载均衡 LVS vs Nginx 对比
  • 【Blender】二、建模篇--05,阵列修改器与晶格形变
  • 如何在本地和服务器新建mysql用户和密码