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

html小游戏-飞机大战

在这里插入图片描述

敌机图片:在这里插入图片描述


子弹图片:在这里插入图片描述


我方飞机:在这里插入图片描述


目录结构
在这里插入图片描述

<!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>

http://www.kler.cn/news/363644.html

相关文章:

  • 前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
  • Dalvik汇编语言基础
  • 1047. 删除字符串中的所有相邻重复项 栈的用法通俗解释
  • GRU神经网络理解
  • 张雪峰:如果你现在是计算机专业,一定要优先报网络安全,它是未来国家发展的大方向
  • element设置时间和日期框早于现在的时间和日期禁用
  • 1024感悟 → 勋章
  • Java项目-基于springboot框架的原创歌曲分享系统项目实战(附源码+文档)
  • 人工智能+医学
  • 【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的讲解
  • 预训练模型通过 prompt(提示)生成的“软标签”是什么
  • C#从零开始学习(封装(5)
  • JAVA Maven 的安装与配置
  • redis 使用
  • 04. VSCODE:C/C++简捷项目专用配置
  • MMA: Multi-Modal Adapter for Vision-Language Models
  • 第1节 什么是鸿蒙系统
  • 基于匿名管道实现的进程池
  • 系统移植相关概念总结
  • 大数据-MySQL集群
  • 使用electron 打包构建cocosCreator 的window exe
  • 鸿蒙应用开发:数据持久化
  • windows 上编译ceres suitesparse
  • #Swift 下标 Subscript - Access the elements of a collection
  • 【C++指南】运算符重载详解
  • 【JAVA毕设】基于JAVA的酒店管理系统