我们要做的是一个打地鼠的游戏,只用原生js

1.导入需要的图片

2.编写页面css样式demo.css

*{
margin:0;
padding:0;
}
.game{
position: relative;
width:750px;
height:600px;
margin:100px auto;
}
.ground{
position: relative;
width: 750px;
height:550px;
background:url('./images/bg_canvas.png');
cursor:url("./images/hammer.png"),auto;
}
.score{
position: absolute;
width:300px;
height:30px;
left:420px;
top:180px;
}
.live{
position: absolute;
top:180px;
right:100px;
}
.score span,
.live span{
color:#fff;
line-height:30px;
font-size:24px;
vertical-align: top;
margin-left:10px;
} .mask{
position: absolute;
width:140px;
height:125px;
/* border:1px solid #000; */
overflow: hidden;
}
.mouse{
position: absolute;
width:110px;
height:110px;
overflow: hidden;
left:0;
top:20px;
background-position: 50% 50%;
background-repeat: no-repeat;
transition: top 0.5s;
overflow: hidden;
} @keyframes moveTop {
0% {
top: 70px;
}
100% {
top: 20px;
}
}

编写页面效果

编写js(demo.js)

var ground;
// 地鼠出现位置坐标
var coordinate = [{x: 130, y:173}, {x: 320, y:171}, {x: 515, y:175}, {x: 105, y: 265}, {x: 320, y: 256}, {x: 522, y: 256}, {x: 96, y: 350}, {x: 320, y: 355}, {x: 540, y: 358}];//洞口坐标
// 地鼠出现定时器
var gametimer;
var mask = [];
var mouse = new Array(9);
// 最大地鼠数
var maxCount = 2;
// 分数 点中一个加10
var score = 0;
// 生命 自由下落一个减一
var life = 10;
window.onload = function(){
ground = document.getElementsByClassName('ground')[0];
ground.onmousedown = function(){
ground.style.cursor = 'url("./images/hammer2.png"), auto'
};
ground.onmouseup = function(){
ground.style.cursor = 'url("./images/hammer.png"), auto'
};
init();
} function init(){
// 创建地鼠出现位置
createMask();
// 每隔一段时间出现一个地鼠
gameTimer = setInterval(function(){
// 创建每一个地鼠
// createMouse();
controlMouse();
// 每次生成后判断是否结束
if(life <= 0){
clearInterval(gameTimer);
alert('游戏结束:得分:' + score);
}
document.getElementsByClassName('scoreCon')[0].innerHTML = score;
document.getElementsByClassName('life')[0].innerHTML = life;
// 最大数++
maxCount = score / 100 + 1;
},50);
} function createMask(){
// 根据坐标生成洞穴位置
for(var i = 0; i < coordinate.length;i ++){
// 创建div 将来插入地鼠
var temp = document.createElement('div');
temp.classList.add('mask');
// 确定每一个地鼠巢穴位置
temp.style.left = coordinate[i].x + 'px';
temp.style.top = coordinate[i].y + 'px'; // 创建草坪遮盖
var img = document.createElement('div');
img.classList.add('mask');
// 设置遮罩层背景 每一个洞穴背景不一样
img.style.background = 'url("./images/mask'+i+'.png")';
// 控制层级 草坪在地鼠身上
// img.style.zIndex = 100;
img.style.zIndex = i * 2 +1; // 将元素放置在数组中
mask[i] = temp;
temp.appendChild(img);
// 将创建div插入父级
ground.appendChild(temp);
// 记录点击的位置
temp.index = i;
// 点击每一个消失
temp.onclick = function(){ disappear(this.index,true);
}
}
} // 创建地鼠
function createMouse(i){
// 随机的背景图片
var num = Math.floor(Math.random() * 4);
mouse[i] = num;
var temp = document.createElement('div');
temp.classList.add('mouse');
// 设置地鼠出现的背景图片
temp.style.background = 'url("./images/mouse'+num+'.png")'; // 每一个地鼠需要出现在指定的位置 在对应洞穴上出现一只地鼠
// 用两个数组对应 一个存放着洞穴 一个存放地鼠
mouse[i] = temp;
temp.style.zIndex = i * 2 ;
temp.style.animation = "moveTop 0.5s linear"; mask[i].appendChild(temp);
var timer = setTimeout(function(){
disappear(i,false);
},2000);
temp.timer = timer;
}
// 控制生称帝书的条件
function controlMouse(){
// 随机出现位置 并且同时出现的地鼠个数不大于最大个数 同一个位置不能出现两只
var num = Math.floor(Math.random()*9);
if(mouse.filter(function (item){
return item;
// 限制出现的最大数和出现的位置
}).length < maxCount && mouse[num] == null){
createMouse(num);
}
} // 消失函数
function disappear(i,isHit){
if(mouse[i]){
// 无论是否被打均缩回洞里 通过改变top值
mouse[i].style.top = '70px';
// 被打 改变样式 添加打懵圈的小星星 改变背景图片
if(isHit){
// 打中分数加十
score += 10;
// 创建包含懵圈小星星的元素
var bomp = document.createElement('img');
bomp.classList.add('mouse');
bomp.style.top = '-40px';
// 添加gif动图为背景显示
bomp.src = "./images/bomb.gif";
// 替换掉当前老鼠的图片
mouse[i].style.backgorund = 'url("./images/hit'+mouse[i].num +'")';
// 插入到当前点击的位置
mouse[i].appendChild(bomp);
// 清除自身的下落
clearTimeout(mouse[i].timer);
}else{
// 没有被打 自己缩回生命减一
life -= 1;
}
setTimeout(function(){
if(mouse[i]){
mask[i].removeChild(mouse[i]);
}
mouse[i] = null;
},500);
}
}

接下来我们看看最后效果

游戏规则是,每砸中一个地鼠分数加10,少砸一个地鼠生命减1,生命为0计算总分数,地鼠会随机出现,砸的越快出现的也就越快,

需要测试效果的,复制代码就可以了。

原生js打地鼠的更多相关文章

  1. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  2. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  3. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  4. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  5. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  6. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

  7. 原生js实现autocomplete插件

    在实际的项目中,能用别人写好的插件实现相关功能是最好不过,为了节约时间成本,因为有的项目比较紧急,没充分时间让你自己来写,即便写了,你还要花大量时间调试兼容性.但是出于学习的目的,你可以利用闲暇时间, ...

  8. 原生js封装ajax:传json,str,excel文件上传表单提交

    由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...

  9. 原生JS实现购物车结算功能代码+zepto版

    html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

随机推荐

  1. go 程序整个执行过程

  2. python内存机制与垃圾回收、调优手段

    目录 一.python的内存机制 二.python的垃圾回收 1. 引用计数 1.1 原理: 1.2 优缺点: 1.4 两种情况: 2. 标记清除 2.1 原理: 2.2 优缺点: 3. 分代回收 3 ...

  3. 利用express-session插件实现nodejs中登录状态的保存

    什么是session? session就是会话,客户端和服务器直接的会话.他的粒度比http链接更粗,一次会话包含了多次连接.即一个session是多次http连接的集合.从我的客户端连接到服务器到关 ...

  4. @SuppressWarnings注解用法

    @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 如图所示: 这时候我们在方法上加上@SuppressWarnings ...

  5. React 语法

    1.JavaScript XML JSX = JavaScript XML,是一个看起来很像 XML 的 JavaScript 语法扩展.JSX 不是模板,是JS语法本身,有更多的扩展.JSX 组件一 ...

  6. Windows7平台下gitblit服务器安装

    在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...

  7. 2019 梦网科技java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.梦网科技等公司offer,岗位是Java后端开发,因为发展原因最终选择去了梦网科技,入职一年时间了,也成为了面 ...

  8. 2019 斗鱼java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.斗鱼等公司offer,岗位是Java后端开发,因为发展原因最终选择去了斗鱼,入职一年时间了,之前面试了很多家公 ...

  9. 处理vue-quill-editor回显数据的时候没有空格问题

    这是我要实现的效果 这是我回显后的情况(可以看见空格都没有了) 处理后 处理方法  添加一个class="ql-editor" <quill-editor class=&qu ...

  10. redhat7.2下VNC没法显示图像

    1,Symptom /root/.vnc/HR-ECC-PRD-02:1.log内容有信息如下: VNCSconnST: Server default pixel fromat depth 24 (3 ...