我们要做的是一个打地鼠的游戏,只用原生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. xorm-删除和软删除实例

    删除数据Delete方法,参数为struct的指针并且成为查询条件.注意:当删除时,如果user中包含有bool,float64或者float32类型,有可能会使删除失败 package main i ...

  2. 【转】ZYNQ中三种实现GPIO的方式

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/husipeng86/article/det ...

  3. 【EBS】XLA_GLT表的清理

    一.Xla_glt*在出现在日记账导入中的阶段 与R11使用gl_interface表不同,R12中大部分情况下使用的是XLA_GLT_<groupId>表:子帐传送到总账的过程中,会动态 ...

  4. maven的setting配置文件中mirror和repository的区别

    当maven需要到的依赖jar包不在本地仓库时, 就需要到远程仓库下载 . 这个时候如果mavensetting.xml中配置了镜像 , 而且镜像配置的规则中匹配到目标仓库时 , maven认为目标仓 ...

  5. C# vb .net实现装饰边框效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的装饰边框效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  6. How to do SSH Tunneling (Port Forwarding)

    How to do SSH Tunneling (Port Forwarding) In this post we will see how ssh works?, what is SSH tunne ...

  7. hadoop细节 -> 持续更新

    Hdfs: hdfs写流程: 客户端通过DistributedFileSystem请求namenode上传文件 Namenode进行检查,比如父路径   文件本身,是否允许上传 Namenode相应信 ...

  8. MySQL数据库之互联网常用架构方案

    一.数据库架构原则 高可用 高性能 一致性 扩展性 二.常见的架构方案 方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移用 jdbc:mysql://vip:3306/xxdb 高可用分析: ...

  9. JVM粗解

    主要是碰到了eclipse无法启动的问题.之前不知道怎么回事导致eclipse启动速度一次比一次慢, 百度了下开始改动eclipse.ini参数 也不知道改了啥.第二天直接起不来eclipse了. 于 ...

  10. dmesg命令

    用于检测和控制内核环缓冲.程序用来助用户了解系统的启动信息 Linux命令dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中 开机信息保存在/var/log目录中名称为 ...