当前位置:首页 > JavaScript

js实现见缝插针

2026-02-02 03:02:23JavaScript

实现思路

见缝插针游戏的核心逻辑是在旋转的圆盘上,玩家需要在合适的时机点击屏幕,将针插入圆盘上的空隙而不碰撞到已有的针。以下是一个基于JavaScript和HTML5 Canvas的实现方法。

初始化游戏场景

创建一个Canvas元素并设置基本样式,用于绘制圆盘和针。初始化游戏状态变量,如圆盘旋转速度、针的数量、游戏是否结束等。

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const width = canvas.width = 400;
const height = canvas.height = 400;

let needles = [];
let diskAngle = 0;
let diskSpeed = 0.02;
let gameOver = false;

绘制圆盘和针

在Canvas上绘制旋转的圆盘和已插入的针。圆盘的中心点固定在画布中心,针从圆盘边缘向外延伸。

function drawDisk() {
    ctx.save();
    ctx.translate(width / 2, height / 2);
    ctx.rotate(diskAngle);
    ctx.beginPath();
    ctx.arc(0, 0, 150, 0, Math.PI * 2);
    ctx.fillStyle = '#f0f0f0';
    ctx.fill();
    ctx.stroke();
    ctx.restore();
}

function drawNeedles() {
    ctx.save();
    ctx.translate(width / 2, height / 2);
    needles.forEach(needle => {
        ctx.rotate(needle.angle);
        ctx.beginPath();
        ctx.moveTo(0, 0);
        ctx.lineTo(0, -200);
        ctx.lineWidth = 5;
        ctx.strokeStyle = needle.color;
        ctx.stroke();
        ctx.rotate(-needle.angle);
    });
    ctx.restore();
}

处理用户输入

监听点击事件,当玩家点击屏幕时,计算当前圆盘旋转角度并插入新针。检查新针是否与已有针碰撞。

canvas.addEventListener('click', () => {
    if (gameOver) return;

    const newNeedle = {
        angle: diskAngle,
        color: `hsl(${Math.random() * 360}, 70%, 50%)`
    };

    const collision = needles.some(needle => {
        return Math.abs(needle.angle - newNeedle.angle) < 0.1;
    });

    if (collision) {
        gameOver = true;
        alert('Game Over!');
    } else {
        needles.push(newNeedle);
    }
});

游戏循环

使用requestAnimationFrame实现游戏循环,更新圆盘旋转角度并重绘场景。

function gameLoop() {
    ctx.clearRect(0, 0, width, height);

    drawDisk();
    drawNeedles();

    if (!gameOver) {
        diskAngle += diskSpeed;
        if (diskAngle > Math.PI * 2) {
            diskAngle -= Math.PI * 2;
        }
    }

    requestAnimationFrame(gameLoop);
}

gameLoop();

增加难度

随着游戏进行,可以逐渐增加圆盘旋转速度或减少针的宽度以提高难度。

function increaseDifficulty() {
    if (needles.length % 5 === 0) {
        diskSpeed += 0.005;
    }
}

完整代码示例

将以上代码整合到一个HTML文件中,确保Canvas元素已正确创建。

<!DOCTYPE html>
<html>
<head>
    <title>见缝插针游戏</title>
    <style>
        canvas { display: block; margin: 0 auto; background: #eee; }
    </style>
</head>
<body>
    <canvas id="gameCanvas" width="400" height="400"></canvas>
    <script>
        // 上述JavaScript代码放在这里
    </script>
</body>
</html>

js实现见缝插针

标签: 见缝插针js
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…