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.mzph.cn/bicheng/57802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebView渲染异常导致闪退解决方案

背景&#xff1a; App主页面使用了大量WebView容器(10个以上)显示图表信息&#xff0c;最新发现bugly上面出现一些关于浏览器Native Crash&#xff0c;如下&#xff1a; 经排查&#xff0c;是WebView渲染失败导致Crash&#xff0c;可以通过webView.loadUrl("chrome://cra…

如何微调(Fine-tuning)大语言模型?

导读 本文介绍了微调的基本概念&#xff0c;以及如何对语言模型进行微调。 从 GPT3 到 ChatGPT、从GPT4 到 GitHub copilot的过程&#xff0c;微调在其中扮演了重要角色。什么是微调&#xff08;fine-tuning&#xff09;&#xff1f;微调能解决什么问题&#xff1f;什么是 Lo…

计算机网络:数据链路层 —— 以太网(Ethernet)

文章目录 局域网局域网的主要特征 以太网以太网的发展100BASE-T 以太网物理层标准 吉比特以太网载波延伸物理层标准 10吉比特以太网汇聚层交换机物理层标准 40/100吉比特以太网传输媒体 局域网 局域网&#xff08;Local Area Network, LAN&#xff09;是一种计算机网络&#x…

Newstar_week1_week2_wp

week1 wp crypto 一眼秒了 n费马分解再rsa flag&#xff1a; import libnum import gmpy2 from Crypto.Util.number import * p 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297…

PostgreSQL的学习心得和知识总结(一百五十六)|auto_explain — log execution plans of slow queries

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

python-PyQt项目实战案例:制作一个视频播放器

文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章&#xff0c;也知道pyqt通过使用label控件显示图像的…

庆祝程序员节:聊一聊编程语言的演变

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

qt配置https请求

qt应用版本 windows 32位 先说下心理路程&#xff0c;你能遇到的我都遇到了&#xff0c;你能想到的我都想到了&#xff0c;怎么解决看这一篇就够了&#xff0c;从上午12点到晚上12点几乎没离开电脑&#xff08;除了吃饭&#xff09;&#xff0c;对于openssl这种用的时候无感&am…

idea 2023 创建 springboot 项目 LTS

idea 2023 创建 springboot 项目 LTS idea 版本 2023.3.8 参考 idea 阿里 建立 springboot 工程 方法 LTS https://blog.csdn.net/wowocpp/article/details/124692532 File ---- New ---- Project https://start.spring.io/ http://start.aliyun.com http://127.0.0.1:8080…

旺店通对接金蝶云星空销售出库接口细节

数据集成是确保各系统高效协同运作的关键环节。本案例将重点介绍如何通过轻易云数据集成平台&#xff0c;实现旺店通旗舰奇门与金蝶云星空之间的销售出库数据对接&#xff0c;具体方案为“销售出库对接&#xff0c;供应商发货-new”。 在本次集成过程中&#xff0c;我们利用了…

Angular 保姆级别教程高阶应用 - RxJs

RxJS 13.1.1 什么是 RxJS ? RxJS 是一个用于处理异步编程的 JavaScript 库&#xff0c;目标是使编写异步和基于回调的代码更容易。 13.1.2 为什么要学习 RxJS ? 就像 Angular 深度集成 TypeScript 一样&#xff0c;Angular 也深度集成了 RxJS。 服务、表单、事件、全局状…

Qt 文本文件读写与保存

Qt 文本文件读写与保存 开发工具&#xff1a;VS2013 QT5.8 设计UI界面&#xff0c;如下图所示 sample7_1QFile.h 头文件&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample7_1QFile.h"class sample7_1QFile : public QMainWin…

1024玩码神挑战赛,太太太上头了!!!

闯关链接&#xff1a;编程导航-码神挑战 第1关 提示&#xff1a; 直接转ASKII码 第2关 提示&#xff1a; 最常用的快捷键&#xff08;cv&#xff09; 第3关 提示&#xff1a; 答案在网址栏 第4关 提示&#xff1a; 输入表示蓝色区域的这种颜色的16进制代码&#xff0c;在网页代…

【openAI】机器学习算法

文章目录 CSDN 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&…

SQL实战测试

SQL实战测试 &#xff08;请写下 SQL 查询语句&#xff0c;不需要展示结果&#xff09; 表 a DateSalesCustomerRevenue2019/1/1张三A102019/1/5张三A18 1. **用一条 ** SQL 语句写出每个月&#xff0c;每个销售有多少个客户收入多少 输出结果表头为“月”&#xff0c;“销…

i春秋web题库——题目名称:SQLi

WEB——SQLi 写在之前&#xff1a;题目简介&#xff1a;题目分析&#xff1a; 写在之前&#xff1a; 本题在CSDN上或是其它博客上有过解答&#xff0c;只不过不知是什么原因&#xff0c;我没有找到解题过程比较完整的文章。于是我决定在CTF初学阶段写一篇这样的博客&#xff0…

【lca,树上差分】P3128 [USACO15DEC] Max Flow P

题意 给定大小为 n ( 2 ≤ n ≤ 5 1 0 4 ) n(2 \leq n \leq 5 \times 10^4) n(2≤n≤5104) 的树&#xff0c;并给定 m ( 1 ≤ m ≤ 1 0 5 ) m(1 \leq m \leq 10^5) m(1≤m≤105) 条树上的路径&#xff08;给定两个端点&#xff0c;容易证明两个点树上路径唯一&#xff09;&…

迭代器失效和支持随机访问的容器总结

创作活动 迭代器失效&#xff1a; 顺序容器&#xff08;如vector、deque、list&#xff09; vector 插入操作&#xff1a; 当在vector中间或头部插入元素时&#xff0c;所有位于插入点之后的迭代器都会失效。这是因为vector的元素在内存中是连续存储的&#xff0c;插入元素可能…

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录&#xff0c;还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录&#xff0c;还可以更新…

【深度学习代码调试5】标准化数据集:TensorFlow Datasets (TFDS)自动化数据加载与预处理

【标准化数据集】TensorFlow Datasets、TFDS&#xff1a;自动化数据加载与预处理 写在最前面1. 什么是 TensorFlow Datasets (TFDS)?主要特点&#xff1a; 2. TFDS 的核心 API&#xff1a;tfds.builder 和 download_and_preparetfds.builder&#xff1a;创建数据集构建器示例&…