一、实现效果

二、实现过程

先看一眼HTML结构

<div class="top-bar"><span>得分:</span><span id="score">0</span></div>
<div class="container"><div class="gem-container"><div class="gem" id="gem0"><img src="./img/blueGem.png" alt="蓝宝石" /></div><div class="gem" id="gem1"><img src="./img/purpleGem.png" alt="紫宝石" /></div><div class="gem" id="gem2"><img src="./img/blueGem.png" alt="蓝宝石" /></div><div class="gem" id="gem3"><img src="./img/purpleGem.png" alt="紫宝石" /></div><div class="gem" id="gem4"><img src="./img/blueGem.png" alt="蓝宝石" /></div></div><div class="car" id="car"><img src="./img/car.png" alt="矿车" /></div>
</div>

接下来是过程:

1.小车移动

先获取小车当前的left,使用split取到数字

全局监听键盘左右键,keyCode分别是37和39,同时判断在边框时不再生效移动

因为上面使用spilit()的原因,取到的小车left是字符串,使用eval()将其视为数字计算

计算后更改小车的left

document.onkeydown = function (e) {left = car.style.left.split("px")[0];if (e.keyCode == 37 && car.style.left != "0px") {  // 监听方向键左且不在边框最左侧left = eval(left) - 20;car.style.left = left + "px";}if (e.keyCode == 39 && car.style.left != "400px") {  // 监听方向键右且不在边框最右侧left = eval(left) + 20;car.style.left = left + "px";}
};

2.随机出现宝石

HTML共定义5个宝石,命名分别是gem0~4,因此使用Math方法随机获取0~4整数作为索引

以此获取到宝石后,做判断:该索引的宝石是否存在,若存在则再次随机(以此避免重复使同一个宝石出现)

然后对出现的宝石触发下落

最后对上述过程做一个循环器,每隔4秒执行

// 随机指定宝石出现
function randomGem() {let index = Math.floor(Math.random() * 5);let gemId = "gem" + index;let gemEl = document.getElementById(gemId);return gemEl;
}// 宝石出现循环器
setInterval(function () {let gemEl = randomGem(); // 获取随机的宝石for (let i = 0; gemEl.style.display == "block"; i++) {  // 遍历宝石以获取未出现的宝石gemEl = randomGem();}gemEl.style.display = "block";gemDown(gemEl);
}, 4000);

3.宝石下落

这个比较简单,获取上文函数中的gemEl(宝石元素),初始化它的top为0px(否则会为空值导致报错)

设定循环器:获取宝石的top,然后对其增加并赋给宝石,这里要实现流程的下落,尽可能将循环器定义的循环速度高一些,我这里采用100毫秒

// 宝石下落
function gemDown(gemEl) {gemEl.style.top = "0px"; // 初始化gem的topconst gemDown = setInterval(function () {  // 下落循环器let gemTop = gemEl.style.top.split("px")[0];gemTop = eval(gemTop) + 10;gemEl.style.top = gemTop + "px";}, 100);
}

4.判断是否接取宝石

难点主要集中在这里了

不着急一步步来:

(1)先算出宝石到达小车时的top是多少,作为判定线

if (gemEl.style.top == "720px") {
}

(2) 到达判定线时,判断是否接住宝石

概念大概如下图,主要计算最左侧接取和最右侧接取,宝石接取的范围即是: 最左侧的值~最右侧的值

接下来计算:

分别获取小车和宝石的left

当宝石在最左侧:宝石left + 30 (自身宽度) - 10 (避免造成擦边接取以减少接取范围)

当宝石在最右侧:宝石left + 10 (原理同上),但此时的小车最右侧的left应该等于当前left+自身宽度,即:小车left + 100 (自身宽度)

作为代码就是:eval(gemLeft) + 20 >= carLeft && gemLeft <= eval(carLeft) + 90

// 判定是否接住宝石
function isCatch(gemEl) {let gemLeft = gemEl.style.left.split("px")[0];let carLeft = car.style.left.split("px")[0];if (eval(gemLeft) + 20 >= carLeft && // 最左侧判定gemLeft <= eval(carLeft) + 90 // 最右侧判定)return true;else return false;
}

结合第(1)步就是

 // 宝石到达判定线
if (gemEl.style.top == "720px") {// 判断是否接住宝石if (isCatch(gemEl)) {}
}

(3)实现当移动小车使用小车左右侧碰撞宝石仍可以接取宝石

实现这个有个前提就是:一直在做判断是否接取,那就定义一个循环器呗

连起来就是,宝石到达判定线开始,每0.1秒做判断是否接取了宝石

// 宝石到达判定线
if (gemEl.style.top == "720px") {const chkCatch = setInterval(function () {  // 在宝石掉出边框前循环判断是否接住(小车左右侧接触宝石也可以接取)// 判断是否接住宝石if (isCatch(gemEl)) {clearInterval(gemDown);clearInterval(chkCatch); // 清理下落和判定接取的循环器gemEl.style.display = "none";score.innerText = ++scoreNum; // 接住加分}}, 100);
}

(4)判断宝石是否掉到边框外

很简单不赘述,留意要放在循环器中

// 直到掉出边框未接住
if (gemEl.style.top == "810px") {clearInterval(gemDown);clearInterval(chkCatch);gemEl.style.display = "none";score.innerText = --scoreNum; // 未接住扣分
}

三、源码

最后源码奉上,我已经把img替换,这样直接就能跑起来了

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>接宝石</title><style>.top-bar {width: 500px;margin: 0 auto;}.container {width: 500px;height: 800px;margin: 0 auto;border: 2px black solid;background-color: burlywood;}.gem-container {position: relative;}.gem {width: 30px;height: 30px;float: left;line-height: 30px;text-align: center;font-size: 900;color: red;position: absolute;top: 0;left: 0;display: inline;background-color: yellow;border-radius: 15px;}.car {position: relative;top: 750px;left: 0px;width: 100px;height: 50px;background-color: gray;}</style></head><body><div class="top-bar"><span>得分:</span><span id="score">0</span></div><div class="container"><div class="gem-container"><div class="gem" id="gem0">$</div><div class="gem" id="gem1">$</div><div class="gem" id="gem2">$</div><div class="gem" id="gem3">$</div><div class="gem" id="gem4">$</div></div><div class="car" id="car"></div></div><script>const gem = document.getElementsByClassName("gem"); // 宝石const car = document.getElementById("car"); // 小车const score = document.getElementById("score"); //得分let scoreNum = 0; // 得分数字let left = 0; // 小车的left数字car.style.left = "0px"; // 初始化小车的left// 初始隐藏宝石,并给宝石left赋值let gemLeft = 0;for (let i of gem) {i.style.display = "none";gemLeft += 80;i.style.left = gemLeft + "px";}// 监听键盘按键以控制小车移动document.onkeydown = function (e) {left = car.style.left.split("px")[0];if (e.keyCode == 37 && car.style.left != "0px") {  // 监听方向键左且不在边框最左侧left = eval(left) - 20;car.style.left = left + "px";}if (e.keyCode == 39 && car.style.left != "400px") {  // 监听方向键右且不在边框最右侧left = eval(left) + 20;car.style.left = left + "px";}};// 随机指定宝石出现function randomGem() {let index = Math.floor(Math.random() * 5);let gemId = "gem" + index;let gemEl = document.getElementById(gemId);return gemEl;}// 宝石出现循环器setInterval(function () {let gemEl = randomGem(); // 获取随机的宝石for (let i = 0; gemEl.style.display == "block"; i++) {  // 遍历宝石以获取未出现的宝石gemEl = randomGem();}gemEl.style.display = "block";gemDown(gemEl);}, 4000);// 宝石下落function gemDown(gemEl) {gemEl.style.top = "0px"; // 初始化gem的topconst gemDown = setInterval(function () {  // 下落循环器let gemTop = gemEl.style.top.split("px")[0];gemTop = eval(gemTop) + 10;gemEl.style.top = gemTop + "px";// 宝石到达判定线if (gemEl.style.top == "720px") {const chkCatch = setInterval(function () {  // 在宝石掉出边框前循环判断是否接住(小车左右侧接触宝石也可以接取)// 判断是否接住宝石if (isCatch(gemEl)) {clearInterval(gemDown);clearInterval(chkCatch); // 清理下落和判定接取的循环器gemEl.style.display = "none";score.innerText = ++scoreNum; // 接住加分}// 直到掉出边框未接住if (gemEl.style.top == "810px") {clearInterval(gemDown);clearInterval(chkCatch);gemEl.style.display = "none";score.innerText = --scoreNum; // 未接住扣分}}, 100);}}, 100);}// 判定是否接住宝石function isCatch(gemEl) {let gemLeft = gemEl.style.left.split("px")[0];let carLeft = car.style.left.split("px")[0];if (eval(gemLeft) + 20 >= carLeft && // 最左侧判定gemLeft <= eval(carLeft) + 90 // 最右侧判定)return true;else return false;}</script></body>
</html>

JS+Position实现类接元宝游戏相关推荐

  1. 321酷生活导航第一期:AIDN(js和flash类的小游戏)

    321酷生活导航在上架之初就把自己的位置规划清楚,我们的目标是给一些用户提供实用的的网址导航,当然在这个过程中,去收集一些网站是十分耗时的事情,但是我们会渐渐填充内容不断地完善自己.今天小编321酷生 ...

  2. 基于Canvas的js简单版接元宝游戏

    本游戏是基于canvas的简单版接元宝游戏v1.0.0版本,往后还会进一步完善,游戏代码git地址:https://github.com/luqiren/Canvas.git 里面的gold_v1.0 ...

  3. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 `200px`,高为 `360px` 的背景容器 2. 在该容器上创建一个 `20 * 20` 的块元素 3. 控制该元素的移动,每次移动 ` ...

  4. 打砖块小游戏php程序,利用原生js实现html5打砖块小游戏(代码示例)

    本篇文章给大家通过代码示例介绍一下利用原生js实现html5打砖块小游戏的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 前言 PS:本次项目中使用了大量 es6 语法,故对于 ...

  5. php跳一跳小游戏,原生JS实现的跳一跳小游戏完整实例

    本文实例讲述了原生JS实现的跳一跳小游戏.分享给大家供大家参考,具体如下: 以下说的是闲暇编写的一个小游戏--跳一跳,类似于微信的跳一跳,大体实现功能有: 1.先随机生成地图: 2.按住按钮释放后完成 ...

  6. html实现跳跳棋游戏,原生JS实现的跳一跳小游戏完整实例

    本文实例讲述了原生JS实现的跳一跳小游戏.分享给大家供大家参考,具体如下: 以下说的是闲暇编写的一个小游戏--跳一跳,类似于微信的跳一跳,大体实现功能有: 1.先随机生成地图: 2.按住按钮释放后完成 ...

  7. web版拳皇,使用html,css,js来制作一款拳皇游戏

    web版拳皇,使用html,css,js来制作一款拳皇游戏 游戏简介 <拳皇>是1994年日本SNK公司旗下在MVS游戏机板上发售的一款著名对战型格斗街机游戏,简称"KOF&qu ...

  8. C语言编一个金山打字通小游戏,js实现金山打字通小游戏

    本文实例为大家分享了js实现金山打字通小游戏的具体代码,供大家参考,具体内容如下 字母匀速随机下落,键盘按下对应字母按键,字母消失重新生成新字母,新字母可帮助回调一部分初始高度 效果 1.页面内容 列 ...

  9. xxtea 算法的 js 加密处理类,包含 UtfParser 和 Base64 类 ?

    JavaScript 实现 新建 xxtea.js 文件 ES5 写法: /* * xxtea算法的js加密处理类,还包含了UtfParser类,还包含了Base64类 *///Class:Xxtea ...

最新文章

  1. 【ZooKeeper】集群安装与配置
  2. Hadoop中的压缩Codec
  3. linux bash 学习
  4. 本科视觉算法实习生面经
  5. boost::allocator_destroy的实例
  6. HDU 4121 Xiangqi 模拟题
  7. 判断一个男人穷还是富,只看这几点!
  8. Service Mesh 在华为公有云的实践
  9. HTML-参考手册: HTML 音频/视频
  10. java通过证书获取CN_java – 从证书DN解析CN [重复]
  11. 为MyEclipse 9/10中的html/JSP编辑器添加代码自动提示
  12. tf.nn.bidirectional_dynamic_rnn()函数详解
  13. 【TSP】基于matlab模拟退火算法求解31城市旅行商问题【含Matlab源码 1148期】
  14. 双ESP分区的WinPE本地安装
  15. python柱状图颜色_Python 绘制 柱状图
  16. 2021年安全生产模拟考试(全国特种作业操作证焊工作业-熔化焊接与热切割模拟考试题库一)
  17. #457 科技乱炖:去中心化的Damus,会比Twitter更好么
  18. 新员工如何快速融入新的工作环境
  19. Java课程设计_java课设
  20. python爬虫系列——开始入土(二)数据解析

热门文章

  1. 为什么上海盛大能成功?(2)
  2. 梦幻西游进入游戏显示服务器程序停止工作,Windows7系统提示“梦幻西游已停止工作”如何解决...
  3. DS007-二叉树-伪指针表示法-先根-中根-后根遍历
  4. 超越...数 e 就是最棒的!
  5. 计算器android studio代码,Android studio实现简单计算器
  6. 用android studio实现倒计时,AndroidStudio项目制作倒计时模块
  7. jupyter notebook启动中常见的几个小问题
  8. Qt收缩窗口动态效果
  9. 这款游戏的猫宠狗宠能上天!
  10. HTML基础知识day6