jquery之别踩白块游戏的简单实现


Posted in Javascript onJuly 25, 2016

前端学习要告一段落了,也没机会写什么像样的东西,然后无意中想起某人以前给我玩了一下别踩白块的游戏,手残还被嘲讽了下,现在想起来觉得这游戏实现起来也不难,于是上星期用jquery写了一个别踩白块的小游戏,就像当初学python的时候一样写了一个2048。然后今天正好抽个时间写个博客纪录下,算是对前一段时间学习的总结,没有玩过的可以去下一个原版的来玩一下,游戏很简单,就是从不断下落的方块中点击黑快,如果点击到百块或者有黑块没被点击到,游戏就算结束。游戏实现起来不难,都是一些小知识点。当时写的时候,脑袋有点糊,有一bug看了半天没解决,后来第二天早上脑袋清醒的时一看就看出来,顺便在这里提醒自己一定不要在脑袋不清醒的时候写代码。好了说了这么多先来看一下效果图,这里别吐槽我的css样式设计就好。。。

jquery之别踩白块游戏的简单实现  jquery之别踩白块游戏的简单实现

 一、游戏html页面

游戏的html界面非常简单,分为4部分,

得分标题栏,

游戏界面主题容器,开始的时候为一个div,然后用jquery动态生成黑白格子

开始暂停按钮一栏

游戏结束时候显示的模态框

下面是代码部分

<!DOCTYPE html> 
<html lang="en"> 
<head> 
  <meta charset="UTF-8"> 
  <title>Title</title> 
  <link href="../css/game.css" rel="stylesheet" type="text/css"> 
</head> 
 
<body> 
<div class="main"> 
  <h3>Score:<span id="score">0</span></h3> 
  <div id="content" class="content"> 
    <div id="inner"></div> 
  </div> 
  <div class="btn"> 
    <div class="container"> 
      <button id="begin">开始</button> 
      <button id="stop">暂停</button> 
    </div> 
  </div> 
 
  <div class="shadow hide"></div> 
  <div class="alert-box hide"> 
    <div class="game-over"> 
      <img style="opacity: 0.8" src="../pic/gg.jpg"> 
    </div> 
    <div class="btn"> 
      <button id="again">重新开始</button> 
      <button id="back">返回</button> 
    </div> 
  </div> 
</div> 
 
<script src="../js/jquery-1.12.4.js"></script> 
<script src="../js/game.js"></script> 
 
</body> 
</html>

二、css布局

写完了html然后就是css,这里主要用到 absolute布局,然后需要注意的是就是游戏过程由于需要不停的生成一栏新div,所以div容器要设置overflow: hidden,这一点需要注意下,然后其他的知识点也就是absolute,relative如何布局,模态框如何实现并居中,都不难,下面看下代码就好

*{ 
  margin: 0; 
  padding: 0; 
} 
 
.main{ 
  width: 808px; 
  margin: 50px auto; 
  background: gray; 
  min-height: 544px; 
  position: relative; 
} 
.content{ 
  width: 408px; 
  margin: 0 auto; 
  height:408px; 
  border: 2px solid green; 
  background-color: white; 
  position: relative; 
  top:0; 
  overflow: hidden; 
} 
#inner{ 
  position: relative; 
  top:-102px; 
} 
.item{ 
  height: 102px; 
} 
.item *{ 
  float: left; 
  height: 100px; 
  width: 100px; 
  background-color: white; 
  border: 1px solid black; 
} 
.black{ 
  background-color: black; 
} 
 
h3{ 
  text-align: center; 
  padding-top: 20px; 
  padding-bottom: 20px; 
} 
h3 span{ 
  color:brown; 
} 
.hide{ 
  display: none; 
} 
 
.shadow{ 
  position: absolute; 
  left: 0; 
  bottom: 0; 
  right: 0; 
  top: 0; 
  background-color: gray; 
  opacity: 0.6; 
} 
.alert-box{ 
  position: absolute; 
  width: 300px; 
  height: 300px; 
  left: 50%; 
  top:50%; 
  margin-left: -150px; 
  margin-top: -150px; 
  background-color: white; 
} 
.alert-box .game-over{ 
  margin-left: 20px; 
  margin-top: 30px; 
} 
.alert-box .btn{ 
  width: 150px; 
  position: relative; 
  margin-left: auto; 
  margin-right: auto; 
  margin-top: 20px; 
} 
.main .btn .container{ 
  width: 150px; 
  margin: 20px auto; 
} 
button{ 
  cursor: pointer; 
  border: 0; 
  display: inline-block; 
  width: 70px; 
  height: 30px; 
  line-height: 30px; 
  text-align: center; 
  background-color: cyan; 
}

三、jquery实现 

游戏最核心的部分就是jquery实现了,主要的功能如下

•游戏的初始化
•如何动态插入一行div和删除一行div
•开始暂停按钮的事件绑定
•游戏过程中点击百块和黑快的事件委托
•游戏如何移动以及如何得分
•如何自动增加白块下落速度
•如何判定游戏结束

下面来看一下初始化代码的实现,初始化之前写了个函数,自动插入一行,并且在这一行4个div中某一个为随机的黑块供游戏中点击,剩下3个白块,怎么随机生成,怎么动态创建div这里需要点小技巧,具体看下面。生成一行div的函数完成后只需在初始化函数里面调用4次即可

function insertDiv() { 
  var rand = Math.floor(Math.random() * 4);


// 生成一个0到3 的随机数,用来作为判断生成黑块的位置 
  $("#inner").prepend("<div class='item'></div>");  
  $.each([0, 1, 2, 3], function (k, v) { 
    if (v == rand) { 
      $("#inner .item").first().append("<div class='black col'></div>"); 
    } else { 
      $("#inner .item").first().append("<div class='col'></div>"); 
    } 
  }) 
} 
 
 
function init() {







// 初始生成4*4的div 
  $.each([0, 1, 2, 3], function () { 
    insertDiv(); 
  }); 
}

初始化完成后,我们需要做的就是如何让界面动起来,这里写了一个函数,每次调用该函数的话,游戏内容会自动向下移动几px,然后将该函数传给定时器,就可以不断的向下滑动,不过这里需要注意,下落过程中,如果下落的距离超过一行后,需要重新插入一行,然后将超出的那一行删除,而且需要将偏移的距离恢复到原来的位置,如果需要加速白块下落的速度,只需将每次向下移动加大即可,游戏后面的自动加速也是基于此来做的。下面来看一下这部分的代码

function move() { 
  var ctop = parseInt($("#inner").offset().top); 
  ctop += window.globalSpeed;




// 自定义的全局变量, 每次下落偏移的距离 
  $("#inner").offset({top: ctop}); 
  if (ctop >= 114) { 
    insertDiv(); 
    $("#inner").offset({top: 12}); 


 // 刚好移动一个item后在上移一个item 
    delDiv(); 
  } 
}

之后就是写开始,暂停部分,这里主要是对计时器的使用,这里需要注意的是每次点击的时候,都要先判断定时器是否已经清除,否则这里会有bug,下面来直接看一下代码

function bindStart() { 
  $("#begin").mouseover(function () { 
    $(this).css("cursor", 'pointer'); 
  }).click(function () { 
    if(window.globalIsClearT1){ 

// 自定义的全局变量,看定时器是否清楚 
 
    }else { 
      clearInterval(window.globalT1); 
//没有清除的话,先清除,避免两次按下开始按钮 
    } 
    window.globalT1 = setInterval(move, 30); 
    window.globalStartClick = true;


//全局变量,是否开始标志位,只有开始了,才能点击 
  }) 
} 
 
function bindStop() { 
  $("#stop").mouseover(function () { 
    $(this).css("cursor", 'pointer'); 
  }).click(function () { 
    clearInterval(window.globalT1); 
    window.globalStartClick = false; 
    window.globalIsClearT1 = true; 
  }) 
}

写到这里,再就是看一下,每次点击的时候如何操作,是否得分,还是点错了游戏结束,下面来看一下代码,界面上有4*4个格子,需要事件委托,来判断是哪一个白块被点击,如果点击的是黑快,将其变为白块,并且加上一分即可,否则点错的话,游戏就结束 

function bindClick() { 
  $("#inner").click(function (e) { 
    if (window.globalStartClick) { 
      var current = $(e.target); 
      if (current.hasClass("black")) { 
        current.removeClass("black"); 
        score(); 
      } else { 
        gameOver(); 
      } 
    } 
  }); 
}

下面来看一下如何计算得分的代码,以及如何实现自动的加速,比较简单就不多说了

function score() { 
  var score = parseInt($("#score").text()); 
  if(score%10 == 0){ 
    window.globalSpeed += 1;        //得到一定的分数后就自动加速 
  } 
  $("#score").text(score + 1); 
}

最后来看一下,游戏结束的时候如何处理,游戏结束的话,先暂停游戏下落,然后弹出模态对话框,让用户选择返回,还是重新来过,重新来过的话,分数清零,游戏界面清空,然后初始化再在自动触发开始按钮,开始下一轮游戏,

function gameOver() { 
  //暂停游戏,显示模态框 
  $("#stop").trigger('click'); 
  window.globalIsClearT1 = true; 
  $(".shadow").removeClass('hide').next().removeClass('hide'); 
 
  $("#again").click(function () { 
    clearInterval(window.globalT1); 
    $(".shadow").addClass('hide').next().addClass('hide'); 
    $("#score").text(0); 
    clearAll(); 
    init(); 
    $("#begin").trigger('click'); 
    // window.globalT1 = setInterval(move, 30) 
  });

到这里,基本整个游戏都算实现了,游戏不复杂,但是要完全运行起来,没有bug也不是那么简单,有兴趣的也可以去写写,如果上面代码有什么问题的话,可以向我提出来。

以上这篇jquery之别踩白块游戏的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery库与其他JS库冲突的解决办法
Feb 07 Javascript
Node.js事件驱动
Jun 18 Javascript
仅30行代码实现Javascript中的MVC
Feb 15 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
Nov 18 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
详解Vue2.0之去掉组件click事件的native修饰
Apr 20 Javascript
浅析JS中回调函数及用法
Jul 25 Javascript
js数据类型检测总结
Aug 05 Javascript
vue 使用自定义指令实现表单校验的方法
Aug 28 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
Dec 06 jQuery
node使用async_hooks模块进行请求追踪
Jan 28 Javascript
基于angular实现树形二级表格
Oct 16 Javascript
JavaScript禁止用户多次提交的两种方法
Jul 24 #Javascript
JavaScript表单焦点自动切换代码
Jul 24 #Javascript
javascript中sort排序实例详解
Jul 24 #Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
Jul 24 #Javascript
关于input全选反选恶心的异常情况
Jul 24 #Javascript
JS中的==运算: [''] == false —&gt;true
Jul 24 #Javascript
JavaScript关于提高网站性能的几点建议(一)
Jul 24 #Javascript
You might like
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
dedecms中常见问题修改方法总结
2007/03/21 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
初学JavaScript第二章
2008/09/30 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
详解ECMAScript typeof用法
2018/07/25 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
用JS实现选项卡
2020/03/23 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
python使用正则表达式提取网页URL的方法
2015/05/26 Python
python 两个数据库postgresql对比
2019/10/21 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
python 6种方法实现单例模式
2020/12/15 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
请说出几个常用的异常类
2013/01/08 面试题
网上签名寄语活动留言
2014/01/18 职场文书
素质拓展感言
2014/01/29 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
工地质量标语
2014/06/12 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
开学随笔
2015/08/15 职场文书