DeepSeek飞机大战小游戏HTML5(附源码)

用DeepSeek帮忙生成的飞机大战小游戏网页版,基于HTML5。
提示词prompt
帮我做一个网页版的飞机大战游戏 html5的




游戏功能说明

玩家控制:

使用键盘方向键或WASD移动飞机

空格键发射子弹

移动设备支持触摸控制
游戏机制:

敌机会从屏幕顶部随机位置出现

击中敌机获得10分

随着分数增加,敌机出现频率会提高

碰到敌机游戏结束
界面:

开始界面

游戏界面(显示当前分数)

结束界面(显示最终分数)

如有需要,可进一步改进游戏。

将上述代码保存为HTML文件,用浏览器打开即可开始游戏。
飞机大战小游戏源码如下:

html 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>飞机大战</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #222;
            overflow: hidden;
            font-family: Arial, sans-serif;
        }
        
        #gameContainer {
            position: relative;
            width: 400px;
            height: 600px;
            background-color: #000;
            overflow: hidden;
        }
        
        #gameCanvas {
            background-color: #000;
        }
        
        #startScreen, #gameOverScreen {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            color: white;
            background-color: rgba(0, 0, 0, 0.7);
        }
        
        #gameOverScreen {
            display: none;
        }
        
        h1 {
            color: #ffcc00;
            margin-bottom: 30px;
            text-shadow: 0 0 10px #ff6600;
        }
        
        button {
            padding: 10px 20px;
            font-size: 18px;
            background-color: #ff6600;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        button:hover {
            background-color: #ff9900;
            transform: scale(1.05);
        }
        
        #scoreDisplay {
            position: absolute;
            top: 10px;
            left: 10px;
            color: white;
            font-size: 20px;
            z-index: 100;
        }
    </style>
</head>
<body>
    <div id="gameContainer">
        <canvas id="gameCanvas" width="400" height="600"></canvas>
        <div id="scoreDisplay">分数: 0</div>
        <div id="startScreen">
            <h1>飞机大战</h1>
            <button id="startButton">开始游戏</button>
        </div>
        <div id="gameOverScreen">
            <h1>游戏结束</h1>
            <p id="finalScore">最终分数: 0</p>
            <button id="restartButton">重新开始</button>
        </div>
    </div>

    <script>
        // 游戏变量
        const canvas = document.getElementById('gameCanvas');
        const ctx = canvas.getContext('2d');
        const startScreen = document.getElementById('startScreen');
        const gameOverScreen = document.getElementById('gameOverScreen');
        const startButton = document.getElementById('startButton');
        const restartButton = document.getElementById('restartButton');
        const scoreDisplay = document.getElementById('scoreDisplay');
        const finalScoreDisplay = document.getElementById('finalScore');
        
        let gameRunning = false;
        let score = 0;
        
        // 玩家飞机
        const player = {
            x: canvas.width / 2 - 25,
            y: canvas.height - 80,
            width: 50,
            height: 50,
            speed: 5,
            color: '#3498db',
            isMovingLeft: false,
            isMovingRight: false,
            isMovingUp: false,
            isMovingDown: false
        };
        
        // 子弹数组
        let bullets = [];
        const bulletSpeed = 7;
        const bulletSize = 5;
        
        // 敌机数组
        let enemies = [];
        const enemySpeed = 2;
        let enemySpawnRate = 60; // 帧数
        
        // 游戏循环变量
        let animationId;
        let frameCount = 0;
        
        // 初始化游戏
        function initGame() {
            score = 0;
            scoreDisplay.textContent = `分数: ${score}`;
            bullets = [];
            enemies = [];
            frameCount = 0;
            
            player.x = canvas.width / 2 - 25;
            player.y = canvas.height - 80;
            
            gameRunning = true;
            startScreen.style.display = 'none';
            gameOverScreen.style.display = 'none';
            
            gameLoop();
        }
        
        // 游戏主循环
        function gameLoop() {
            if (!gameRunning) return;
            
            update();
            render();
            
            animationId = requestAnimationFrame(gameLoop);
        }
        
        // 更新游戏状态
        function update() {
            // 移动玩家
            if (player.isMovingLeft && player.x > 0) {
                player.x -= player.speed;
            }
            if (player.isMovingRight && player.x < canvas.width - player.width) {
                player.x += player.speed;
            }
            if (player.isMovingUp && player.y > 0) {
                player.y -= player.speed;
            }
            if (player.isMovingDown && player.y < canvas.height - player.height) {
                player.y += player.speed;
            }
            
            // 移动子弹
            for (let i = bullets.length - 1; i >= 0; i--) {
                bullets[i].y -= bulletSpeed;
                
                // 移除超出屏幕的子弹
                if (bullets[i].y < 0) {
                    bullets.splice(i, 1);
                }
            }
            
            // 生成敌机
            frameCount++;
            if (frameCount % enemySpawnRate === 0) {
                spawnEnemy();
                
                // 随着分数增加,敌机生成速度加快
                if (enemySpawnRate > 20) {
                    enemySpawnRate = Math.max(20, 60 - Math.floor(score / 10));
                }
            }
            
            // 移动敌机
            for (let i = enemies.length - 1; i >= 0; i--) {
                enemies[i].y += enemies[i].speed;
                
                // 移除超出屏幕的敌机
                if (enemies[i].y > canvas.height) {
                    enemies.splice(i, 1);
                }
            }
            
            // 检测碰撞:子弹和敌机
            for (let i = bullets.length - 1; i >= 0; i--) {
                for (let j = enemies.length - 1; j >= 0; j--) {
                    if (checkCollision(bullets[i], enemies[j])) {
                        // 移除子弹和敌机
                        bullets.splice(i, 1);
                        enemies.splice(j, 1);
                        
                        // 增加分数
                        score += 10;
                        scoreDisplay.textContent = `分数: ${score}`;
                        break;
                    }
                }
            }
            
            // 检测碰撞:玩家和敌机
            for (let i = enemies.length - 1; i >= 0; i--) {
                if (checkCollision(player, enemies[i])) {
                    gameOver();
                    break;
                }
            }
        }
        
        // 渲染游戏
        function render() {
            // 清空画布
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            
            // 绘制背景
            ctx.fillStyle = '#000033';
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            
            // 绘制星星背景
            drawStars();
            
            // 绘制玩家
            drawPlayer();
            
            // 绘制子弹
            drawBullets();
            
            // 绘制敌机
            drawEnemies();
        }
        
        // 绘制玩家飞机
        function drawPlayer() {
            ctx.fillStyle = player.color;
            
            // 机身
            ctx.beginPath();
            ctx.moveTo(player.x + player.width / 2, player.y);
            ctx.lineTo(player.x + player.width, player.y + player.height);
            ctx.lineTo(player.x, player.y + player.height);
            ctx.closePath();
            ctx.fill();
            
            // 机翼装饰
            ctx.fillStyle = '#2980b9';
            ctx.beginPath();
            ctx.moveTo(player.x + player.width / 2, player.y + 10);
            ctx.lineTo(player.x + player.width - 10, player.y + player.height - 10);
            ctx.lineTo(player.x + 10, player.y + player.height - 10);
            ctx.closePath();
            ctx.fill();
        }
        
        // 绘制子弹
        function drawBullets() {
            ctx.fillStyle = '#ffcc00';
            bullets.forEach(bullet => {
                ctx.beginPath();
                ctx.arc(bullet.x, bullet.y, bullet.size, 0, Math.PI * 2);
                ctx.fill();
            });
        }
        
        // 绘制敌机
        function drawEnemies() {
            enemies.forEach(enemy => {
                ctx.fillStyle = enemy.color;
                
                // 机身
                ctx.beginPath();
                ctx.moveTo(enemy.x, enemy.y);
                ctx.lineTo(enemy.x + enemy.width, enemy.y);
                ctx.lineTo(enemy.x + enemy.width / 2, enemy.y + enemy.height);
                ctx.closePath();
                ctx.fill();
                
                // 机翼装饰
                ctx.fillStyle = '#c0392b';
                ctx.beginPath();
                ctx.moveTo(enemy.x + 5, enemy.y + 5);
                ctx.lineTo(enemy.x + enemy.width - 5, enemy.y + 5);
                ctx.lineTo(enemy.x + enemy.width / 2, enemy.y + enemy.height - 5);
                ctx.closePath();
                ctx.fill();
            });
        }
        
        // 绘制星星背景
        function drawStars() {
            ctx.fillStyle = 'white';
            for (let i = 0; i < 100; i++) {
                const x = Math.random() * canvas.width;
                const y = (frameCount + i * 100) % canvas.height;
                const size = Math.random() * 2;
                ctx.beginPath();
                ctx.arc(x, y, size, 0, Math.PI * 2);
                ctx.fill();
            }
        }
        
        // 生成敌机
        function spawnEnemy() {
            const size = 30 + Math.random() * 20;
            const enemy = {
                x: Math.random() * (canvas.width - size),
                y: -size,
                width: size,
                height: size,
                speed: enemySpeed + Math.random() * 2,
                color: '#e74c3c'
            };
            enemies.push(enemy);
        }
        
        // 发射子弹
        function fireBullet() {
            if (!gameRunning) return;
            
            const bullet = {
                x: player.x + player.width / 2,
                y: player.y,
                size: bulletSize
            };
            bullets.push(bullet);
        }
        
        // 碰撞检测
        function checkCollision(obj1, obj2) {
            return obj1.x < obj2.x + obj2.width &&
                   obj1.x + (obj1.width || obj1.size) > obj2.x &&
                   obj1.y < obj2.y + obj2.height &&
                   obj1.y + (obj1.height || obj1.size) > obj2.y;
        }
        
        // 游戏结束
        function gameOver() {
            gameRunning = false;
            cancelAnimationFrame(animationId);
            
            finalScoreDisplay.textContent = `最终分数: ${score}`;
            gameOverScreen.style.display = 'flex';
        }
        
        // 事件监听
        startButton.addEventListener('click', initGame);
        restartButton.addEventListener('click', initGame);
        
        // 键盘控制
        document.addEventListener('keydown', (e) => {
            if (!gameRunning) return;
            
            switch (e.key) {
                case 'ArrowLeft':
                case 'a':
                    player.isMovingLeft = true;
                    break;
                case 'ArrowRight':
                case 'd':
                    player.isMovingRight = true;
                    break;
                case 'ArrowUp':
                case 'w':
                    player.isMovingUp = true;
                    break;
                case 'ArrowDown':
                case 's':
                    player.isMovingDown = true;
                    break;
                case ' ':
                    fireBullet();
                    break;
            }
        });
        
        document.addEventListener('keyup', (e) => {
            switch (e.key) {
                case 'ArrowLeft':
                case 'a':
                    player.isMovingLeft = false;
                    break;
                case 'ArrowRight':
                case 'd':
                    player.isMovingRight = false;
                    break;
                case 'ArrowUp':
                case 'w':
                    player.isMovingUp = false;
                    break;
                case 'ArrowDown':
                case 's':
                    player.isMovingDown = false;
                    break;
            }
        });
        
        // 触摸控制(移动设备)
        let touchX = 0;
        
        canvas.addEventListener('touchstart', (e) => {
            if (!gameRunning) return;
            
            e.preventDefault();
            touchX = e.touches[0].clientX;
            
            // 触摸屏幕上半部分发射子弹
            if (e.touches[0].clientY < canvas.height / 2) {
                fireBullet();
            }
        });
        
        canvas.addEventListener('touchmove', (e) => {
            if (!gameRunning) return;
            
            e.preventDefault();
            const newTouchX = e.touches[0].clientX;
            const deltaX = newTouchX - touchX;
            
            player.x += deltaX;
            
            // 限制玩家不超出屏幕
            if (player.x < 0) player.x = 0;
            if (player.x > canvas.width - player.width) {
                player.x = canvas.width - player.width;
            }
            
            touchX = newTouchX;
        });
        
        // 点击屏幕发射子弹(移动设备)
        canvas.addEventListener('click', (e) => {
            if (!gameRunning) return;
            
            // 点击屏幕上半部分发射子弹
            if (e.clientY < canvas.height / 2) {
                fireBullet();
            }
        });
    </script>
</body>
</html>