用HTML5制作精美战机游戏

news2024/11/26 8:57:54

每天要被大学老师催H5作业👏🏻👏🏻👏🏻

不如看看本文,代码齐全,直接用来做参考案例👌🏻  

干货满满不看后悔👍👍👍

代码和图片压缩包完整下载链接---战机游戏下载

📝个人主页→数据挖掘博主ZTLJQ的主页

b1691e6f246947eeb06ee06469621bc2.gif

个人推荐python学习系列:

☄️爬虫JS逆向系列专栏 - 爬虫逆向教学

☄️python系列专栏 - 从零开始学python


以下是游戏画面

 话不多说直接上代码!

<!DOCTYPE html>
<html>
<head>
    <title>ZT战机</title>
    <style>
        canvas {
            border: 1px solid #000;
            display: block;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <button onclick="startGame()">开始游戏</button>
    <button onclick="endGame()">结束游戏</button>
    <canvas id="gameCanvas" width="800" height="800"></canvas>

    <script>
        var game = {
            canvas: document.getElementById("gameCanvas"),
            context: null,
            player: null,
            bullets: [],
            enemies: [],
            score: 0,
            gameover: true,

            init: function() {
                this.context = this.canvas.getContext("2d");
                this.player = new Player(this.canvas.width / 2, this.canvas.height - 100);

                window.addEventListener("keydown", function(event) {
                    game.handleKeydown(event);
                });
                window.addEventListener("keyup", function(event) {
                    game.handleKeyup(event);
                });

                this.gameLoop();
            },

            startGame: function() {
                if (this.gameover) {
                    this.score = 0;
                    this.gameover = false;
                    this.bullets = [];
                    this.enemies = [];

                    this.spawnEnemies();

                    this.gameLoop();
                }
            },

            endGame: function() {
                this.gameover = true;
            },

            gameLoop: function() {
                if (!this.gameover) {
                    this.update();
                    this.draw();

                    requestAnimationFrame(function() {
                        game.gameLoop();
                    });
                }
            },

            update: function() {
                this.player.update();

                for (var i = this.bullets.length - 1; i >= 0; i--) {
                    var bullet = this.bullets[i];
                    bullet.update();
                    if (bullet.y < 0 || bullet.hit) {
                        this.bullets.splice(i, 1);
                    }
                }

                for (var i = this.enemies.length - 1; i >= 0; i--) {
                    var enemy = this.enemies[i];
                    enemy.update();

                    if (enemy.checkCollision(this.player)) {
                        this.gameover = true;
                    }

                    for (var j = this.bullets.length - 1; j >= 0; j--) {
                        var bullet = this.bullets[j];
                        if (bullet.checkCollision(enemy)) {
                            this.bullets.splice(j, 1);
                            this.enemies.splice(i, 1);
                            this.score += 10;
                            this.increaseDifficulty();
                            break;
                        }
                    }
                }
            },

            draw: function() {
                this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);

                // 绘制游戏场景背景图
                var backgroundImage = new Image();
                backgroundImage.src = "background.jpg";
                this.context.drawImage(backgroundImage, 0, 0, this.canvas.width, this.canvas.height);

                this.player.draw(this.context);

                for (var i = 0; i < this.bullets.length; i++) {
                    var bullet = this.bullets[i];
                    bullet.draw(this.context);
                }

                for (var i = 0; i < this.enemies.length; i++) {
                    var enemy = this.enemies[i];
                    enemy.draw(this.context);
                }

                this.context.fillStyle = "#000";
                this.context.font = "20px Arial";
                this.context.fillText("Score: " + this.score, 10, 30);

                if (this.gameover) {
                    this.context.fillStyle = "#000";
                    this.context.font = "40px Arial";
                    this.context.fillText("Game Over", this.canvas.width / 2 - 100, this.canvas.height / 2);
                }
            },

            handleKeydown: function(event) {
                if (event.keyCode === 37) {
                    this.player.moveLeft();
                } else if (event.keyCode === 39) {
                    this.player.moveRight();
                } else if (event.keyCode === 32) {
                    if (!this.gameover) {
                        var bullet = this.player.shoot();
                        this.bullets.push(bullet);
                    }
                }
            },

            handleKeyup: function(event) {
                if (event.keyCode === 37 || event.keyCode === 39) {
                    this.player.stopMove();
                }
            },

            spawnEnemies: function() {
                if (!this.gameover) {
                    var enemyCount = Math.floor(Math.random() * 3) + 1; // 随机生成 1 到 3 个敌人

                    for (var i = 0; i < enemyCount; i++) {
                        var x = Math.random() * (this.canvas.width - 50);
                        var y = Math.random() * -200; // 从屏幕上方随机生成

                        // 创建不同种类的敌机
                        var enemyType = Math.random();
                        var enemy;

                        if (enemyType < 0.5) {
                            enemy = new Enemy1(x, y);
                        } else {
                            enemy = new Enemy2(x, y);
                        }

                        this.enemies.push(enemy);
                    }

                    setTimeout(function() {
                        game.spawnEnemies();
                    }, 2000); // 每隔 2 秒生成一波敌人
                }
            },

            increaseDifficulty: function() {
                if (this.score % 50 === 0) {
                    for (var i = 0; i < this.enemies.length; i++) {
                        this.enemies[i].speed += 0.5;
                    }
                }
            }
        };

        function Player(x, y) {
            this.x = x;
            this.y = y;
            this.width = 80;
            this.height = 60;
            this.speed = 8;
            this.isMovingLeft = false;
            this.isMovingRight = false;
            this.image = new Image();
            this.image.src = "player.png";
        }

        Player.prototype.update = function() {
            if (this.isMovingLeft) {
                this.moveLeft();
            } else if (this.isMovingRight) {
                this.moveRight();
            }
        };

        Player.prototype.draw = function(context) {
            context.drawImage(this.image, this.x, this.y, this.width, this.height);
        };

        Player.prototype.moveLeft = function() {
            if (this.x > 0) {
                this.x -= this.speed;
            }
        };

        Player.prototype.moveRight = function() {
            if (this.x + this.width < game.canvas.width) {
                this.x += this.speed;
            }
        };

        Player.prototype.stopMove = function() {
            this.isMovingLeft = false;
            this.isMovingRight = false;
        };

        Player.prototype.shoot = function() {
            var bullet = new Bullet(this.x + this.width / 2, this.y);
            return bullet;
        };

        function Bullet(x, y) {
            this.x = x;
            this.y = y;
            this.width = 10;
            this.height = 30;
            this.speed = 5;
            this.hit = false;
            this.image = new Image();
            this.image.src = "bullet.png";
        }

        Bullet.prototype.update = function() {
            this.y -= this.speed;
        };

        Bullet.prototype.draw = function(context) {
            context.drawImage(this.image, this.x, this.y, this.width, this.height);
        };

        Bullet.prototype.checkCollision = function(object) {
            if (
                this.x < object.x + object.width &&
                this.x + this.width > object.x &&
                this.y < object.y + object.height &&
                this.y + this.height > object.y
            ) {
                this.hit = true;
                return true;
            }
            return false;
        };

        function Enemy1(x, y) {
            this.x = x;
            this.y = y;
            this.width = 80;
            this.height = 60;
            this.speed = Math.random() * 2 + 1;
            this.image = new Image();
            this.image.src = "enemy1.png";
        }

        Enemy1.prototype.update = function() {
            this.y += this.speed;
        };

        Enemy1.prototype.draw = function(context) {
            context.drawImage(this.image, this.x, this.y, this.width, this.height);
        };

        Enemy1.prototype.checkCollision = function(object) {
            if (
                this.x < object.x + object.width &&
                this.x + this.width > object.x &&
                this.y < object.y + object.height &&
                this.y + this.height > object.y
            ) {
                return true;
            }
            return false;
        };

        function Enemy2(x, y) {
            this.x = x;
            this.y = y;
            this.width = 80;
            this.height = 60;
            this.speed = Math.random() * 2 + 1;
            this.image = new Image();
            this.image.src = "enemy2.png";
        }

        Enemy2.prototype.update = function() {
            this.y += this.speed;
        };

        Enemy2.prototype.draw = function(context) {
            context.drawImage(this.image, this.x, this.y, this.width, this.height);
        };

        Enemy2.prototype.checkCollision = function(object) {
            if (
                this.x < object.x + object.width &&
                this.x + this.width > object.x &&
                this.y < object.y + object.height &&
                this.y + this.height > object.y
            ) {
                return true;
            }
            return false;
        };

        var startGame = function() {
            game.startGame();
        };

        var endGame = function() {
            game.endGame();
        };

        game.init();
    </script>
</body>
</html>

其中的background bullet这些图片你可用使用自己想要图片进行替换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643723.html

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

相关文章

用友畅捷通CRM SQL注入漏洞复现

0x01 产品简介 用友畅捷通CRM是面向小企业全力打造的简单、实用的客户关系管理应用。帮助企业用好自己的客户资源、管好商机跟进过程、引导好业务员跟单行为&#xff0c;促进团队销售能力的提升&#xff1b;通过查询和分析&#xff0c;识别企业的价值客户&#xff0c;融合电话、…

JUC笔记(二)

多线程编程核心 在前面&#xff0c;我们了解了多线程的底层运作机制&#xff0c;我们终于知道&#xff0c;原来多线程环境下存在着如此之多的问题。在JDK5之前&#xff0c;我们只能选择synchronized关键字来实现锁&#xff0c;而JDK5之后&#xff0c;由于volatile关键字得到了…

湖南大学CS-2021期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 1.简答题(10 分) 小明设计了一款机器,整数和浮点数都占 10 个 bit,其中整数采用补码表示,浮点数采用 IEEE 754 标准。 (1)…

matlab横向连接字符组成文件路径

f fullfile(myfolder,myfile.tif) %字符串中不包含反斜杠 f strcat(myfolder\,myfile.tif) %字符串中包含反斜杠,strcat函数直接拼接得到的结果一致

【软件测试】测试用例设计要点总结

文章目录 考试题型简答题(一) 等价类划分1.1 划分等价类1.2 设计测试用例 (二) 边界值分析2.1 列出边界值分析表2.2 设计测试用例 (三) 因果图分析3.1 确定原因和结果3.2 确定原因和结果之间的逻辑关系3.3 在因果图上使用标准的符号标明约束条件 (四) 判定表驱动4.1 将因果图转…

【轻量化网络系列(7)】EfficientNetV2论文超详细解读(翻译 +学习笔记+代码实现)

前言 今天我们要学习的是EfficientNetV2 &#xff0c;该网络主要使用训练感知神经结构搜索和缩放的组合&#xff1b;在EfficientNetV1的基础上&#xff0c;引入了Fused-MBConv到搜索空间中&#xff1b;引入渐进式学习策略、自适应正则强度调整机制使得训练更快&#xff1b;进一…

深入了解 OkHttp 协议:优雅的网络请求框架

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

Spring Boot项目的搭建和运行

✨Spring Boot项目的搭建和运行 &#x1f351;Spring Boot概述&#x1f34a;&#x1f34a;传统框架技术存在的问题&#x1f34a;&#x1f34a;主要特点&#x1f34a;&#x1f34a;环境要求 &#x1f351;聚合工程/父子模块&#x1f351;第一个Spring Boot项目&#x1f351;目录…

《UNUX环境高级编程》(1)UNIX基础

1、引言 2、UNIX体系结构 操作系统 一种软件&#xff0c;控制计算机硬件资源&#xff0c;提供程序运行环境。操作系统包含了内核和一些其他软件&#xff08;如shell、公用函数库、应用程序等&#xff09;。例如Linux就是GNU操作系统的内核&#xff0c;因此也称为GNU/Linux操作…

Netty实战(十五)

UDP广播事件&#xff08;一&#xff09;UDP简介和示例程序 一、UDP基础1.2 UDP介绍1.2.1 UDP和TCP的区别 1.3 UDP广播1.3.1 单播模式1.3.2 UDP的传输模式 二、UDP示例程序三、消息 POJO: LogEvent 一、UDP基础 到目前为止&#xff0c;我们已经见过的绝大多数的例子都使用了基于…

Android系统中最重要的一个组件【Framework】

Android Framework是Android系统中最重要的一个组件&#xff0c;它为Android应用开发者提供了一套完整而稳定的API框架&#xff0c;可以方便地实现各种应用功能。Android市场对Framework的需求量非常大&#xff0c;尤其在当前移动互联网时代&#xff0c;Android应用的市场需求也…

SpringCloud Alibaba-Nacos

SpringCloud Alibaba-Nacos 1. Nacos安装1.1 Nacos概要1.2 Nacos架构1.3 Nacos安装1.3.1 单机模式 Derby安装1.3.2 单机模式 MySQL安装1.3.3 Docker 安装Nacos 2 Nacos功能应用2.1 Nacos服务注册与发现2.2 负载均衡2.3 配置中心2.3.1 配置管理2.3.2 多环境切换2.3.3 共享/扩展 …

Spark集群部署和启动与关闭

上一篇我们讲了Hadoop集群部署和启动与关闭&#xff0c;今天我们讲一下Spark集群部署和启动与关闭。首先我们先来了解一下Spark集群部署模式&#xff0c;分别有以下三种&#xff1a; Standalone   Standalone&#xff08;独立模式&#xff09;是Spark一种简单的集群部署模式&…

随着用户体验质量的不断追求,性能优化成了Android开发中的重要一方面

在移动互联网时代&#xff0c;Android系统的使用越来越广泛&#xff0c;而随着用户对体验质量的不断追求&#xff0c;性能优化已经成为了Android应用开发中的重要方面。以下是对Android市场对性能优化的需求量及应用广度进行详细分析的几个方面。 1. 用户需求 随着Android系统…

DataLeap的全链路智能监控报警实践(三): 系统实现

系统实现 整体架构 基线 管理模块&#xff1a;负责基线创建、更新、删除等操作&#xff0c;管理基线元信息&#xff0c;包括保障任务&#xff0c;承诺时间&#xff0c;余量及报警配置等&#xff09;&#xff1b; 基线 实例生成&#xff1a;系统每天定时触发生成基线实例&#x…

2023 年最新互联网 Java 面试八股文出炉(附大厂 P5-P8 技术栈)

为什么感觉 Java 面试变难了&#xff1f; 几年前&#xff0c;你只需要简单的 ssm 框架&#xff0c;就能轻松找到一份 Java 的工作&#xff0c;但现在不一样了&#xff0c;随着涌入这个行业的人越来越多&#xff0c;同一个岗位需要筛选掉更多人&#xff0c;要求自然水涨船高&am…

ubuntu 20.04 aarch64 平台交叉编译 opencv 静态库

编译环境 win10 64 位 VMware Workstation Pro 16 虚拟机 虚拟机安装 ubuntu 20.04 opencv 版本&#xff1a; 来自 github 当前最新 4.7 目的 交叉编译 opencv 生成静态库&#xff08;.a&#xff09;&#xff0c;用于 嵌入式 aarch64 平台。 环境配置方法 参考上一篇 u…

基于Java汽车配件销售业绩管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

@vue/cli脚手架

2. vue/cli脚手架 2.1vue/cli 脚手架介绍 目标: webpack自己配置环境很麻烦, 下载vue/cli包,用vue命令创建脚手架项目 vue/cli是Vue官方提供的一个全局模块包(得到vue命令), 此包用于创建脚手架项目脚手架是为了保证各施工过程顺利进行而搭设的工作平台 2.2 vue/cli 目录和代…

Camera | 11.瑞芯微摄像头采集图像颜色偏绿解决笔记

前言 在实际调试基于瑞芯微平台的camera过程中&#xff0c;发现显示的图片发绿&#xff0c; 现在把调试步骤分享给大家&#xff1a; 1、修改iq文件 sdk中位置&#xff1a; external/camera_engine_rkaiq/iqfiles/isp21/ov13850_ZC-OV13850R2A-V1_Largan-50064B31.xml【现在…