科学教育

搜索
查看: 339|回复: 1
打印 上一主题 下一主题

124

[复制链接]

9

主题

15

帖子

61

积分

注册会员

Rank: 2

积分
61
跳转到指定楼层
楼主
发表于 2025-12-2 09:38:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请帮我设计一个飞机大战的网页代码
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2025-12-2 09:39:01 | 只看该作者
你好呀!设计一个简单的“飞机大战”网页游戏,听起来很有趣呢!我来帮你写一个基础版本,里面会有一架可以用键盘左右移动的飞机,还有会掉落的敌人(小怪物),你要用飞机去躲避它们。我们会用HTML和JavaScript来做这个小游戏。

下面是代码,你可以直接复制到一个叫做 `index.html` 的文件里,然后用浏览器打开就能玩啦!

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.   <meta charset="UTF-8" />
  5.   <title>简单飞机大战</title>
  6.   <style>
  7.     body {
  8.       margin: 0;
  9.       overflow: hidden;
  10.       background: #000; /* 黑色背景 */
  11.     }
  12.     #gameCanvas {
  13.       display: block;
  14.       margin: 0 auto;
  15.       background: #111;
  16.       border: 2px solid #555;
  17.     }
  18.   </style>
  19. </head>
  20. <body>
  21.   <canvas id="gameCanvas" width="400" height="600"></canvas>

  22.   <script>
  23.     const canvas = document.getElementById('gameCanvas');
  24.     const ctx = canvas.getContext('2d');

  25.     // 飞机的属性
  26.     const planeWidth = 40;
  27.     const planeHeight = 60;
  28.     let planeX = (canvas.width - planeWidth) / 2;
  29.     const planeY = canvas.height - planeHeight - 10;
  30.     const planeSpeed = 5;

  31.     // 敌人属性
  32.     const enemyWidth = 40;
  33.     const enemyHeight = 40;
  34.     let enemies = [];
  35.     const enemySpeed = 2;
  36.     let enemySpawnInterval = 1500; // 毫秒
  37.     let lastEnemySpawn = 0;

  38.     // 游戏状态
  39.     let leftPressed = false;
  40.     let rightPressed = false;
  41.     let isGameOver = false;
  42.     let score = 0;

  43.     // 监听键盘事件,控制飞机移动
  44.     document.addEventListener('keydown', (event) => {
  45.       if (event.key === 'ArrowLeft' || event.key === 'a') {
  46.         leftPressed = true;
  47.       } else if (event.key === 'ArrowRight' || event.key === 'd') {
  48.         rightPressed = true;
  49.       }
  50.     });

  51.     document.addEventListener('keyup', (event) => {
  52.       if (event.key === 'ArrowLeft' || event.key === 'a') {
  53.         leftPressed = false;
  54.       } else if (event.key === 'ArrowRight' || event.key === 'd') {
  55.         rightPressed = false;
  56.       }
  57.     });

  58.     // 画飞机
  59.     function drawPlane() {
  60.       ctx.fillStyle = 'deepskyblue';
  61.       ctx.beginPath();
  62.       // 用三角形表示飞机头
  63.       ctx.moveTo(planeX + planeWidth / 2, planeY);
  64.       ctx.lineTo(planeX, planeY + planeHeight);
  65.       ctx.lineTo(planeX + planeWidth, planeY + planeHeight);
  66.       ctx.closePath();
  67.       ctx.fill();
  68.     }

  69.     // 画敌人
  70.     function drawEnemy(enemy) {
  71.       ctx.fillStyle = 'red';
  72.       ctx.fillRect(enemy.x, enemy.y, enemyWidth, enemyHeight);
  73.     }

  74.     // 产生敌人
  75.     function spawnEnemy() {
  76.       let x = Math.random() * (canvas.width - enemyWidth);
  77.       enemies.push({x: x, y: -enemyHeight});
  78.     }

  79.     // 检测碰撞
  80.     function checkCollision(aX, aY, aW, aH, bX, bY, bW, bH) {
  81.       return !(bX > aX + aW ||
  82.                bX + bW < aX ||
  83.                bY > aY + aH ||
  84.                bY + bH < aY);
  85.     }

  86.     // 画分数
  87.     function drawScore() {
  88.       ctx.fillStyle = 'white';
  89.       ctx.font = '20px Arial';
  90.       ctx.fillText('得分: ' + score, 10, 30);
  91.     }

  92.     // 游戏结束文字
  93.     function drawGameOver() {
  94.       ctx.fillStyle = 'white';
  95.       ctx.font = '40px Arial';
  96.       ctx.textAlign = 'center';
  97.       ctx.fillText('游戏结束', canvas.width / 2, canvas.height / 2);
  98.       ctx.font = '20px Arial';
  99.       ctx.fillText('你的得分: ' + score, canvas.width / 2, canvas.height / 2 + 40);
  100.     }

  101.     // 游戏主循环
  102.     function gameLoop(timestamp) {
  103.       if (isGameOver) {
  104.         drawGameOver();
  105.         return;
  106.       }

  107.       // 清空画布
  108.       ctx.clearRect(0, 0, canvas.width, canvas.height);

  109.       // 移动飞机
  110.       if (leftPressed && planeX > 0) {
  111.         planeX -= planeSpeed;
  112.       }
  113.       if (rightPressed && planeX < canvas.width - planeWidth) {
  114.         planeX += planeSpeed;
  115.       }

  116.       // 画飞机
  117.       drawPlane();

  118.       // 产生敌人
  119.       if (!lastEnemySpawn) lastEnemySpawn = timestamp;
  120.       if (timestamp - lastEnemySpawn > enemySpawnInterval) {
  121.         spawnEnemy();
  122.         lastEnemySpawn = timestamp;
  123.       }

  124.       // 移动敌人并检测碰撞
  125.       for (let i = enemies.length - 1; i >= 0; i--) {
  126.         enemies[i].y += enemySpeed;
  127.         drawEnemy(enemies[i]);

  128.         if (checkCollision(
  129.           planeX, planeY, planeWidth, planeHeight,
  130.           enemies[i].x, enemies[i].y, enemyWidth, enemyHeight
  131.         )) {
  132.           isGameOver = true;
  133.         }

  134.         // 如果敌人飞出屏幕,移除并加分
  135.         if (enemies[i].y > canvas.height) {
  136.           enemies.splice(i, 1);
  137.           score += 10;
  138.         }
  139.       }

  140.       drawScore();

  141.       requestAnimationFrame(gameLoop);
  142.     }

  143.     // 开始游戏
  144.     requestAnimationFrame(gameLoop);
  145.   </script>
  146. </body>
  147. </html>
复制代码


### 简单解释:
- 我们用了一个`canvas`画布,所有的图形都画在上面。
- 飞机用蓝色的三角形表示,可以用键盘的左方向键(←)和右方向键(→)或者字母a、d来移动。
- 敌人是红色的小方块,它们会从上往下掉下来。
- 如果敌人和你的飞机撞到了,游戏就结束了。
- 你躲开敌人,敌人掉出下面,得分就会增加。

你可以把这个代码保存后打开玩玩看,如果想玩得更高级,可以告诉我,我帮你加子弹或者更多功能哦!

如果有不懂的地方,可以问我哦~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表