偶然想到曾经在无智能手机时代,玩过的一款游戏,游戏名忘了,只记得内容,游戏内容是一个猴子在树木之间跳跃,吃水果,躲炸弹,防虫子,其他的记不太清,大致是这样的玩法,似乎是某款诺基亚上的游戏。。。。。。-_-!!。。。。。。由于执念太强,所以试着用html和原生js写下,倒是写出了个半吊子,唔----算是有个小样子吧。。。先看下游戏展示图:



接下来是html代码:


<div class="startGame">                                     <!-- 游戏开始大页面 --><img src="img/start.png" alt="" id="startGame">            <!-- 加入游戏开始按钮,这里用图片代替 -->
</div><div class="wrapper" id="wrapper">               <!-- 游戏开始后进入的主页面的大页面 --><div class="backgroundTree">                 <!-- 在大页面里装入背景—三棵树 --><div class="tree1"></div>                         <!-- 这里的树用图片表示,在css中写入,下面的树相同 --><div class="tree2"></div><div class="tree3"></div></div><div class="move" id="move">              <!-- 在大页面中加入动态因子(猴子,水果,炸弹),由于是动态的,所以在js里生成显示,不再这里直接显示 --><!-- <div class="monkey" id="monkey"></div> -->           <!--注: 这是在执行js后,会自动生成的三个节点 --><!-- <div class="fruits" id="fruits"></div> --><!--  <div class="boom" id="boom"></div> --></div><div class="scoreBox" id="scoreBox">           <!-- 显示分数的大页面 --><div class="score">计分:<p id="score">0</p>            <!-- 动态计入分数,在js里写入变化的分数值 --></div></div>
</div>
<div class="gameOver" id="gameOver">            <!-- 当游戏失败后,显示的游戏结束大页面 --><div class="over" id="over">         <!-- 在大页面中的游戏结束弹出框,这里用图片表示(在css里写入图片) --><div class="close" id="close"></div>        <!-- 在游戏结束框里加入关闭按钮,这里也用图片表示(css加入图片) --><div class="scoreOver"><p id="scoreOver"></p></div>      <!-- 在游戏结束框中加入最后的计分 --></div>
</div>

接下来css代码:

*{                            /* 写代码的习惯,先将所有默认的margin和padding都清0 */margin: 0;padding: 0;}.startGame{              /* 设置游戏开始的大页面 */width: 100%;            /* 100%的宽度 */height: 609px;         /* 根据自己的电脑浏览器显示大小设置的高度 */position: absolute;       /* 设置绝对定位 */top: 0;left: 0;z-index: 1000;         /* 显示在其他页面的最前面 */
}.startGame img{             /* 在大页面中显示的游戏开始按钮 */width: 300px;       /* 根据图片设置宽高 */height: 100px;position: absolute;       /* 设置绝对定位,从这里到下面的margin:auto的设置表示该内容基于父级定位到正中心位置 */top: 0;left: 0;right: 0;bottom: 0;margin: auto;
}.wrapper{           /* 游戏开始后的主界面的大界面 */width: 100%;         /* 和上述一样是设置宽高和绝对定位 */height: 609px;position: absolute;top: 0;left: 0;
}.backgroundTree{           /* 在大界面中显示树的页面 */width: 100%;            /* 这里的值和上述设置的一样,原因往上看,这里不解释了 */height: 609px;position: absolute;top: 0;left: 0;background-image: url('img/bg1.jpg');       /* 加入背景图片,记得要和你的树看起来和谐一点哦 */background-size: 100% 100%;         /* 100%平铺图片 */
}.tree1{                        /* 在背景图片中加入树的图片 */width: 25%;          /* 设置树的宽高,宽占背景图片的25% */height: 609px;   background-image: url('img/tree.png');             /* 加入树的图片 */background-size: 100% 100%;                   /* 平铺 */position: absolute;                         /* 绝对定位 */top: 0;left: 5%;                                       /* 位置距离左边5% */
}.tree2{              /* 加入第二个树的图片 */width: 25%;                /* 和上述一样 */height: 609px;background-image: url('img/tree.png');background-size: 100% 100%;position: absolute;top: 0;left: 37.5%;                        /* 位置距离左边37.5% */
}.tree3{                  /* 加入第三个树的图片 */width: 25%;height: 609px;background-image: url('img/tree.png');background-size: 100% 100%;position: absolute;top: 0;left: 70%;               /* 位置距离左边70% */
}.move{                    /* 设置动态因子的大页面 */width: 100%;          height: 520px;           /* 设置你希望的游戏活动区域大小 */position: absolute;top: 60px;                     /* 设置位置距离上边60px */left: 0;display: none;            /* 刚开始时为不显示,触发js(即点击游戏开始按钮后)后更改为显示 */
}.monkey{          /* 设置猴子的大小和初始位置 */width: 100px;height: 100px;background-image: url('img/monkey.png');           /* 加入猴子图片 */background-size: 100% 100%;position: absolute;          /* 设置基于父级的绝对定位,距上80px,距左150px */top: 80px;left: 150px;
}.fruits{                              /* 设置水果的大小,至于位置在js里规定 */width: 150px;height: 50px;background-image: url('img/fruits.png');           /* 水果图片 */background-size: 100% 100%;}.boom{           /* 设置炸弹的大小 ,和上述一样解释*/width: 150px;height: 50px;background-image: url('img/zd.png');background-size: 100% 100%;display: block;        /* 设置显示为block */
}.scoreBox{                /* 在大页面上的分数显示盒子 */width: 100%;height: 30px;position: absolute;top: 0;left: 0;}.score{                /* 在分数盒子里显示分数的大小和位置 */width: 80px;height: 30px;line-height: 30px;                     /* 垂直居中显示 */text-align: center;color: #222;                             /* 字体为黑色 */font-size: 18px;                         /* 字体大小 */font-weight: bolder;           /* 字体加粗 */position: absolute;           /* 在盒子里居中显示 */top: 0;left: 0;right: 0;bottom: 0;margin: auto;float: left;                 /* 向左浮动 */}
.score p{              /* 动态分数值 */float: right;           /* 向右浮动,使数字和汉字在同一行 */
}.gameOver{                    /* 游戏结束大页面 */width: 100%;height: 609px;z-index: 10000;         /* 显示在所有其他页面的最前面 */position: absolute;top: 0;left: 0;display: none;          /* 刚开始时不显示,直到js里的相关事件被触发 */
}.over{                  /* 在游戏结束大页面中显示游戏结束图片框 */width: 320px;             /* 图片大小自己按需求写 */height: 180px;position: absolute;          /* 在大页面中居中显示 */top: 0;left: 0;right: 0;bottom: 0;margin: auto;background-image: url('img/gameOver.png');         /* 加入游戏结束的图片 */background-size: 100% 100%;}.close{               /* 在游戏结束框里加入关闭按钮 */width: 30px;        /* 大小自己按需设置 */height: 30px;background-image: url('img/shanchu.png');       /* 加入关闭按钮的图片 */background-size: 100% 100%;position: absolute;              /* 设置图片位置为基于父级的绝对定位 */top: 18px;                            /* 距上边18px */right: 18px;                           /* 距右边18px */cursor: pointer;                    /* 当鼠标移到图片,原鼠标指示变成小手图片 */
}.scoreOver{                   /* 设置游戏结束图片上所显示的最终分数 */width: 80px;                /* 分数显示的范围宽高 */height: 30px;position: absolute;            /* 依据图片设置分数显示位置 */top: 118px;left: 170px;font-size: 20px;                /* 分数大小 */font-weight: bolder;          /* 分数字体加粗 */color: #000;                    /* 分数字体颜色白色 */
}

接下是js代码:

var startGame = document.getElementById('startGame');        //获取在html中的id = ‘startGame’的节点
var move = document.getElementById('move');           //以下同上解释
var score = document.getElementById('score');
var over = document.getElementById('over');
var gameOver = document.getElementById('gameOver');
var close = document.getElementById('close');
var scoreOver = document.getElementById('scoreOver');
var scoreBox = document.getElementById('score');
var boom = document.getElementsByClassName('boom');var k = true;                   //设置锁
var number = [150,210,593,653,1036,1096];
var key = 1;
var speed1 = 100;
var speed2 = 80;
var timerf;
var timerb;begin();                //执行函数begin()
function begin(){                       //游戏开始的默认值设置this.monkey_top = 80;              //    设置this.monkey_top为(假)猴子位置的高度this.monkey_left = 150;          //设置猴子位置的左边距离this.score = 0;                   //设置初始的分数为0monkey = document.createElement("div");         //创建一个(真)猴子(div)monkey.setAttribute('id','monkey');               //给猴子一个id = 'monkey'monkey.classList.add('monkey');            //给猴子一个class = “monkey”,用在css设置里move.appendChild(monkey);            //把猴子插入move节点下,成为move节点下的子节点,注:这的move是上述从var move里获取的id=“move”的节点bindEvent();                //触发bindEvent()函数
}function bindEvent(){                  //用来装所有按键鼠标事件startGame.onclick = function(){            //当点击游戏开始按钮时触发该事件(注:startGame也是从上述的var startGame里得到的id节点,以下类似的不再说明)startGame.style.display = 'none';          // id=‘startGame’的节点display为none时,表示不显示该节点内容以及其下的子节点move.style.display = 'block';           //表示move节点包括其子节点都显示food();              //触发food()函数bomb();             //触发bom()函数}document.onkeydown = function(e){            //键盘事件,用来控制猴子的移动事件var code = e.keyCode;     //用code获取你所按的按键的代表的值setDerict(code);                 //将code的值返给setDerict()函数,触发该函数}close.onclick = function(){               //游戏结束后出现在游戏结束框右上方的叉叉按钮的点击事件gameOver.style.display = 'none';             //游戏结束框消失k = true;                  //钥匙k为truereStart();                 //触发重新开始游戏的函数,即reStart()}
}function reStart(){                //游戏重新开始函数this.monkey_top = 80;              //与上述的begin()一样,重新设置初始值this.monkey_left = 150;this.score = 0;scoreBox.innerHTML = this.score;         //将游戏主界面的分数清0monkey = document.createElement("div");          //创建一个新的猴子monkey.setAttribute('id','monkey');monkey.classList.add('monkey');move.appendChild(monkey);key = 1;                  //钥匙key初始值为1bindEvent();                //重新触发bindEvent等一系列函数food();bomb();}function setDerict(code){           //猴子移动方向的控制switch(code){              //获取到code的值case 37:          //表示按键的方向键左if(key == 2||key == 4||key == 6){              //当key为2,4,6时引发的事件,注:这里的key的用意是:由于一颗树木分左右,而两颗树间又有距离,所有的树左右距离一样,所有的树与树间隔也一样,但左右和间隔的距离不一样,所以这里将其猴子的跳跃分成树1左,树1右,树间,树2左,树2右,树间…,不难找到规律,猴子从左到右为奇数,从右到树间为偶数,因此需要一个key来计入数字monkey.style.left = this.monkey_left - 60 + 'px';         //当key为偶数时,猴子的右距离为原始值右距离减60(这个60是树的左右直径)this.monkey_left = parseInt(getComputedStyle(monkey).left);    //此时的原始值要同步改变为当前的猴子位置的右距monkey.style.backgroundImage = 'url("img/monkey.png")';      //加入猴子面朝左的图片key --;        //key减1,变奇数}else if(key == 3 || key == 5){          //key为奇数时执行,注这里没有1,是因为这个按键是向左的,而猴子刚开始为的位置就在最左边,所以key为1时不能操作向左的按键monkey.style.left = this.monkey_left - 383 + 'px';          //猴子右距-383,这里的383是两颗树之间的距离this.monkey_left = parseInt(getComputedStyle(monkey).left);       //同上monkey.style.backgroundImage = 'url("img/monkey2.png")';         //面朝右的猴子图片key --;          //key减1,变偶数}else{         //因为树只有三颗,所以可设置的范围也就在1-5之间,所以当key为其他数值时,不触发事件;}break;case 38:            //上monkey.style.top = parseInt(getComputedStyle(monkey).top) - 10 + 'px';        //控制猴子向上运动时的移动距离,为当前距离-10this.monkey_top = parseInt(getComputedStyle(monkey).top);    //实时获得更改后的猴子上距离break;case 39:           //右if(key == 1||key == 3||key == 5){          //这里的解释和上述37的一样,不再不说明,注:这里有1是由于该按键向右,因此可以操作monkey.style.left = this.monkey_left + 60 + 'px';this.monkey_left = parseInt(getComputedStyle(monkey).left);monkey.style.backgroundImage = 'url("img/monkey2.png")';key ++;        //变偶数}else if(key == 2 || key == 4){          //与上述一样,不多解释了monkey.style.left = this.monkey_left + 383 + 'px';this.monkey_left = parseInt(getComputedStyle(monkey).left);monkey.style.backgroundImage = 'url("img/monkey.png")';key ++;}else{;}break;case 40:            //下  monkey.style.top = parseInt(getComputedStyle(monkey).top) + 10 + 'px';      //同上含义this.monkey_top = parseInt(getComputedStyle(monkey).top);break;default:break;}
}function food(){           //设置水果函数var f = Math.floor(Math.random()*6);          先用f来获取一个0-6的一个随机数var monkey_l1 = parseInt(getComputedStyle(monkey).left);    //为下述过程方便,因此将猴子的位置赋给新变量var monkey_t1 = parseInt(getComputedStyle(monkey).top);var fruits = document.createElement('div');       //做一个水果(div)fruits.style.position = 'absolute';            //水果设置绝对定位fruits.style.left = number[f] + 'px';           //水果的右距为数组number里的第随机f个数,number[]数组的具体数值在开头设置了fruits.style.top = 0 + 'px';           //水果的初始上距离为0move.appendChild(fruits);        //在move下加入水果节点,是水果节点成为move下的子节点fruits.setAttribute('id','fruits');       //为水果节点加入id = ‘fruits’fruits.classList.add('fruits');         //加入class = ‘fruits’timerf = setInterval(function(){              //设置每隔speed1分钟执行一次的事件var monkey_l1 = parseInt(getComputedStyle(monkey).left);      //这里同上述的猴子里的一样意思,不再多解释var monkey_t1 = parseInt(getComputedStyle(monkey).top);var f_l = parseInt(getComputedStyle(fruits).left);        //这里也是为方便,将水果的左距离赋给f_lvar f_t = parseInt(getComputedStyle(fruits).top);     //同fruits.style.top = f_t + 10 + 'px';        //水果的上距离+10if(f_t > 450){               //根据游戏界面设置数值,这里的450是我界面上的底部距离fruits.remove();     //当水果到达450以后,水果消失(删除节点)food();             //上个水果消失,下个水果出现}else if((monkey_l1 == f_l)&&((monkey_t1 == f_t)||(monkey_t1 == f_t + 30)||(monkey_t1 == f_t - 50))){          //前面为图方便就用在这里,这里表示的是当猴子吃到水果时,执行的事件,而猴子要吃到水果的要求就是,猴子的位置要和水果的位置一样,就表示吃到了,因为我的猴子设置的是100的宽高,而水果是50,所以这里我把猴子分成了三段,以便猴子吃水果的时候能够正常点显示(什么是正常显示,,,嗯,,就是水果碰到猴子头或者猴子身体或者猴子尾巴时,都表示吃到水果,都能得分)this.score += 1;          //吃到水果得分+1scoreBox.innerHTML = this.score;      //更新给界面上的分数fruits.remove();          //吃到水果后,水果自然要消失food();               //吃完,就要生成下个水果的出现,以便游戏继续bomb();           //为了增加游戏难度,所以当猴子吃到一个水果后,就要同步增加一个炸弹}else{           //其他情况不执行事件;}},speed1);}function bomb(){               //设置炸弹var b = Math.floor(Math.random()*6);          //与上述水果一致,其目的是为了随机出现在树的顶端六个位置var zd = document.createElement('div');        //创建一个炸弹zd.style.position = 'absolute';             //设置绝对定位zd.style.left = number[b] + 'px';             //取到随机位置zd.style.top = 0 + 'px';                //与上述一致,不多解释move.appendChild(zd);zd.setAttribute('id','zd');zd.classList.add('boom');timerb = setInterval(function(){           //设置每隔speed2执行一次事件var monkey_l = parseInt(getComputedStyle(monkey).left);         //与上述水果一致不多解释var monkey_t = parseInt(getComputedStyle(monkey).top);         var b_t =parseInt(getComputedStyle(zd).top);var b_l =parseInt(getComputedStyle(zd).left);zd.style.display = 'block';          //设置display = ‘block’zd.style.top = b_t + 10 + 'px';       //设置上距离+10if(b_t > 450){          /同上述解释if(k == true){            //这里设置的k,在下面解释zd.remove();      //炸弹消失bomb();          //重新生成炸弹}else{            //在这里解释下k的作用,因为游戏的难度是靠不断增加的炸弹为障碍,所以就出现了个问题,由于这里的zd.move()只能删除当前的炸弹(1个),不能删除所有的炸弹,因此对于重新开始游戏就麻烦了,炸弹会重失败时的个数开始显示,也就是游戏不能再从简单的开始玩,所以这里为设置所有炸弹都消失,而添加了这步操作for(var l = 0;l<document.getElementsByClassName('boom').length;l++){          //for循环的是当前html里显示的所有class为boom的节点,该节点表示的就是炸弹var long = document.getElementsByClassName('boom')[l];     //获取每个boom节点long.remove();          //循环删除每个boom节点}}}else if((monkey_l == b_l) && ((monkey_t == b_t) || (monkey_t == b_t - 50) ||( monkey_t == b_l + 30))){               //这里的含义同上述的水果,只是将水果替换为炸弹,也就是猴子吃到炸弹时引发的事件scoreOver.innerHTML = this.score;       //游戏结束最终得分gameOver.style.display = 'block';           //显示游戏结束界面k = false;             //这里控制所有正在掉落的炸弹,使它不会再触发上述的事件,而转触发删除节点事件fruits.remove();         //游戏结束所以水果也需要消失monkey.remove();        //猴子消失zd.remove();           //这个碰到的炸弹也消失}else{;}if((monkey_l == b_l) && ((monkey_t == b_t) || (monkey_t == b_t - 50))){       //不用怀疑,这里也和上面的一致,是猴子碰到炸弹触发事件,而作用也是为了双重保险删除所有炸弹节点,,,,,不知道这步是不是多余了。。。。等会试试for(var l = 0;l<document.getElementsByClassName('boom').length;l++){var long = document.getElementsByClassName('boom')[l];long.remove();}}},speed2);
}

好了,现在所有的代码都写完了,这游戏有个小缺点,就是当游戏失败后,你需要等界面上的所有炸弹都掉落完毕,再重新开始,才能从简单的开始(即刚开始只掉落一个炸弹)。。。。
总算是完成了记忆中的那个游戏,有点小激动,咳咳。。。虽然是挺low的,不过算是满足了下回忆吧。。。有空会继续升级这个游戏,毕竟还没有把向上爬的金龟子加入,,,
那个有感兴趣的大佬们,可以写写,写个更好的,希望最终作品能够分享给我,谢谢了。。。
注:上述代码解释有误的,帮我指出,谢谢。当然如果上述代码有不理解的也可以联系我

前端游戏之原生js-猴子吃水果相关推荐

  1. 水果掉落小游戏(原生js+css动画)

    摘要 水果下落小游戏,采用原生js的dom操作和css的animation,做的比较粗糙,目的是练习原生js的常用操作.游戏功能与界面均为他人设计,本demo具体代码实现由本人独立实现. 样式 dem ...

  2. 2048小游戏(原生js基础代码篇)

    今天在这里,我将给各位呈现一个简单的游戏代码. 想必大家都接触过2048这个小游戏吧,在悠闲时间用于消遣时间最好不过了,那么,我给大家写一个2048最基本的原生js代码. HTML: <!DOC ...

  3. html flappybird小游戏代码,原生js实现Flappy Bird小游戏

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习. html结构 css样式 #game { width: 800px; height: 600px; border: 1px s ...

  4. 【前端路由原理--原生JS实现方式】--前后端路由的区别、关于单页面应用与多页面应用、什么是CSR、SSR、SSG、ISP

    前言 本来只是想学习 React-Router v6 ,没有想到,带出了这么多东西.前后端路由有什么区别?SPA与MPA的是什么?在了解到前端路之后又发现单页面于应用与多页面应用的不同之处,以及 .n ...

  5. 前端每日实战:163# 视频演示如何用原生 JS 创作一个多选一场景的交互游戏(内含 3 个视频)...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LXMzRX 可交互视频 此视频是可 ...

  6. 前端小白写了个网页版五子棋游戏,使用原生 JS + Canvas 实现绘制棋子、棋盘

    功能模块 快来体验下吧!看下你能赢得了计算机么? 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 老规矩,源码贴上 具体代码 (1)HTML代码 <!DOCTYPE html ...

  7. 原生js canvas 碰撞游戏的开发笔记

    -----------------------------------------------福利--------------------------------------------- ----- ...

  8. eclipse javascript_原生js实现贪吃蛇游戏_javascript技巧

    更新时间:2020年10月26日 11:46:36   作者:leisure-ZL 这篇文章主要为大家详细介绍了原生js实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴 ...

  9. 原生html小游戏,原生JS实现别踩白块小游戏(一)

    对于前端开发人员来说,闲暇之余自己开发个小游戏打发时间,也是对自己基础技术的一种应用考验.那么别踩白块小游戏,相信大家并不陌生,这个小游戏我们可以通过原生js来实现,即便是前端初学者也可以轻松完成. ...

最新文章

  1. Linux下视频截取命令
  2. 每天一记 10.01.27
  3. 7 Javascript:表单与验证-非空验证
  4. 请在贵网站的根目录下部署一个文件_使用 github pages, 快速部署你的静态网页
  5. Oracle手边常用70则脚本知识汇总
  6. python 连续三个数满足条件_计算满足条件的连续值数(Pandas Dataframe)
  7. Java io流---拷贝文件夹下的所有文件和目录
  8. Vue只是JavaScript其中的一个框架
  9. 快应用宣布支持第三方DSL
  10. B00004 atoi函数
  11. 光流(四)--Kanade-Lucas-Tomasi(KLT)目标跟踪
  12. 2019梅江(天津)年货展销会启幕
  13. GitHub客户端 Desktop使用
  14. 大学物理-热学-教学总结
  15. 基于51单片机的多线程操作系统设计
  16. 所谓领导力,指的是这21种能力
  17. UVA 11584 Partitioning by Palindromes
  18. Wordpress商品详情页新增Buy on amazon/ebay跳转按钮
  19. FileZilla快速部署
  20. 深度学习 06_2 车辆统计项目代码

热门文章

  1. java 数据流 转换 pdf_服务器端或者数据流方法生成pdf格式报表
  2. sklearn中的数据预处理方法学习汇总
  3. VLAN基础与划分广播域
  4. 软件测试面试英文自我介绍,软件测试工程师面试英文自我介绍范文.doc
  5. [Unity]BuffDebuffSystem增益减益系统(1)
  6. SQL中字符串截取函数
  7. java单元测试如何全覆盖_单元测试代码覆盖率的浅谈
  8. Source Insight 4.0使用技巧
  9. 判断出栈序列合法性(c语言)
  10. 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)