html小游戏-飞机大战

敌机图片:


子弹图片:


我方飞机:


目录结构

bash 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>飞机大战</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        #gameContainer {
            width: 400px;
            height: 600px;
            background: #000033;
            position: relative;
            overflow: hidden;
            margin: 20px auto;
        }
        #plane {
            width: 50px;
            height: 50px;
            position: absolute;
            bottom: 50px;
            left: 175px;
        }
        .bullet {
            width: 10px;
            height: 20px;
            position: absolute;
            z-index: 10;
        }
        .enemy {
            width: 40px;
            height: 40px;
            position: absolute;
        }
        #score {
            position: absolute;
            top: 10px;
            left: 10px;
            color: white;
            font-size: 20px;
            z-index: 100;
            font-family: Arial, "Microsoft YaHei", sans-serif;
        }
        #instructions {
            text-align: center;
            margin: 10px;
            font-family: Arial, "Microsoft YaHei", sans-serif;
        }
    </style>
</head>
<body>
<div id="instructions">
    方向键移动,按住空格键连续发射三发子弹
</div>
<div id="gameContainer">
    <div id="score">得分: <span id="scoreValue">0</span></div>
    <img id="plane" src="1.png" alt="飞机">
</div>

<script>
    const plane = document.getElementById('plane');
    const gameContainer = document.getElementById('gameContainer');
    const scoreElement = document.getElementById('scoreValue');
    let planeLeft = 175;
    let planeTop = 500;
    let score = 0;
    const horizontalSpeed = 2.5;
    const verticalSpeed = 3.5;
    const bullets = [];
    const enemies = [];
    const keys = {};
    let isSpacePressed = false;
    let lastShotTime = 0;
    const shootCooldown = 150;

    document.addEventListener('keydown', (e) => {
        keys[e.key] = true;
        if(e.key === ' ') {
            isSpacePressed = true;
            e.preventDefault();
        }
    });

    document.addEventListener('keyup', (e) => {
        keys[e.key] = false;
        if(e.key === ' ') {
            isSpacePressed = false;
        }
    });

    // 创建子弹组
    function createBullets() {
        // 子弹间距
        const spacing = 15;

        // 创建三发子弹
        for(let i = -1; i <= 1; i++) {
            const bullet = document.createElement('img');
            bullet.src = '2.png';
            bullet.className = 'bullet';

            // 计算子弹位置,中间子弹在飞机正上方,两侧子弹略微偏移
            const bulletLeft = planeLeft + plane.offsetWidth/2 - 5 + (i * spacing);
            bullet.style.left = bulletLeft + 'px';
            bullet.style.top = (planeTop - 20) + 'px';

            gameContainer.appendChild(bullet);

            // 为两侧子弹添加横向运动
            const horizontalSpeed = i * 0.5; // 子弹横向扩散速度

            bullets.push({
                element: bullet,
                top: planeTop - 20,
                left: bulletLeft,
                horizontalSpeed: horizontalSpeed // 新增横向速度属性
            });
        }
    }

    function createEnemy() {
        const enemy = document.createElement('img');
        enemy.src = '3.png';
        enemy.className = 'enemy';
        enemy.style.left = Math.random() * (gameContainer.offsetWidth - 40) + 'px';
        enemy.style.top = '-40px';
        gameContainer.appendChild(enemy);
        enemies.push({
            element: enemy,
            top: -40
        });
    }

    function isColliding(rect1, rect2) {
        return !(rect1.right < rect2.left ||
            rect1.left > rect2.right ||
            rect1.bottom < rect2.top ||
            rect1.top > rect2.bottom);
    }

    function gameLoop() {
        const currentTime = Date.now();

        if (isSpacePressed && currentTime - lastShotTime >= shootCooldown) {
            createBullets();
            lastShotTime = currentTime;
        }

        if(keys['ArrowLeft'] && planeLeft > 0) {
            planeLeft -= horizontalSpeed;
        }
        if(keys['ArrowRight'] && planeLeft < gameContainer.offsetWidth - plane.offsetWidth) {
            planeLeft += horizontalSpeed;
        }
        if(keys['ArrowUp'] && planeTop > 0) {
            planeTop -= verticalSpeed;
        }
        if(keys['ArrowDown'] && planeTop < gameContainer.offsetHeight - plane.offsetHeight) {
            planeTop += verticalSpeed;
        }

        plane.style.left = planeLeft + 'px';
        plane.style.top = planeTop + 'px';

        // 更新子弹位置
        for(let i = bullets.length - 1; i >= 0; i--) {
            const bullet = bullets[i];
            bullet.top -= 8; // 垂直移动速度
            bullet.left += bullet.horizontalSpeed; // 添加横向移动

            // 更新子弹位置
            bullet.element.style.top = bullet.top + 'px';
            bullet.element.style.left = bullet.left + 'px';

            // 移除超出边界的子弹
            if(bullet.top <= -20 || bullet.left < -10 || bullet.left > gameContainer.offsetWidth) {
                bullet.element.remove();
                bullets.splice(i, 1);
                continue;
            }

            // 子弹碰撞检测
            for(let j = enemies.length - 1; j >= 0; j--) {
                const enemy = enemies[j];
                if(isColliding(bullet.element.getBoundingClientRect(),
                    enemy.element.getBoundingClientRect())) {
                    bullet.element.remove();
                    bullets.splice(i, 1);
                    enemy.element.remove();
                    enemies.splice(j, 1);
                    score += 100;
                    scoreElement.textContent = score;
                    break;
                }
            }
        }

        // 敌机移动
        for(let i = enemies.length - 1; i >= 0; i--) {
            const enemy = enemies[i];
            enemy.top += 2;
            enemy.element.style.top = enemy.top + 'px';

            if(enemy.top >= gameContainer.offsetHeight) {
                enemy.element.remove();
                enemies.splice(i, 1);
                continue;
            }

            if(isColliding(enemy.element.getBoundingClientRect(),
                plane.getBoundingClientRect())) {
                alert('游戏结束!\n最终得分:' + score);
                location.reload();
                return;
            }
        }

        requestAnimationFrame(gameLoop);
    }

    setInterval(createEnemy, 1500);
    gameLoop();
</script>
</body>
</html>
相关推荐
团子的二进制世界3 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
Max_uuc7 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
故事不长丨7 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
long3168 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
牵牛老人10 分钟前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
froginwe1118 分钟前
Python3与MySQL的连接:使用mysql-connector
开发语言
rannn_11135 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
灵感菇_37 分钟前
Java HashMap全面解析
java·开发语言
杜子不疼.38 分钟前
PyPTO:面向NPU的高效并行张量编程范式
开发语言
qq_124987075339 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计