基于jquery实现九宫格拼图小游戏


Posted in jQuery onNovember 30, 2018

九宫格拼图小游戏是小时候比较常见的小游戏之一。闲着无聊就用js简单写了一个。

基于jquery实现九宫格拼图小游戏

游戏的玩法很简单。九宫格中有八个小图片。随机打乱之后,将八张小图片拼接成一个完整的图。

html代码

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<style>
  body{
    border: 0;
  }
  .out{
    width: 606px;
    height: 606px;
    margin: 0 auto;
    border: 1px solid black;
  }
  .in{
    width: 200px;
    height: 200px;
    background-color:red;
    float: left;
    border: 1px solid black;
  }
  .no_see{
    width: 200px;
    height: 200px;
    background-color:white;
    float: left;
    border: 1px solid black;
  }
  .btn{
    width: 50px;
    height: 25px;
    margin: 50px auto;
  }
  .begin{
    width: 50px;
    height: 25px;
  }
</style>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>my game</title>
</head>
<body>
  <div class="out">
    <div class="in"><img src="1.png" alt="" /></div>
    <div class="in"><img src="2.png" alt="" /></div>
    <div class="in"><img src="3.png" alt="" /></div>
    <div class="in"><img src="4.png" alt="" /></div>
    <div class="in"><img src="5.png" alt="" /></div>
    <div class="in"><img src="6.png" alt="" /></div>
    <div class="in"><img src="7.png" alt="" /></div>
    <div class="in"><img src="8.png" alt="" /></div>
    <div class='no_see'></div>
  </div>
</body>
</html>

这里使用div来布局。具体实现就不??铝恕N恼碌闹氐闶?s的实现。

实现图片的互换

图片的互换其实就是html中的div互换。当点击图片时,和游戏中的空白图进行交换。

$('.in').click(function(){
  var t = $(this).clone(); //复制当前点击的div
  $('.no_see').before(t); //在空白div的前面插入复制的div
  $(this).before($('.no_see')); //把空白div插入到点击div的前面
  t.before($(this)) //把点击的div插入到复制div的前面
  t.remove(); //移除复制的div
})

这里可能会有疑问。为什么后边要多一步 “把点击的div插入到复制div的前面”。测试过程中,发现clone()不会保留js操作节点。也就是点击的div所拥有的class,不能被继承。所以多这一步是为了点击过的div后面还能再继续点击。

保证只有相邻才能互换

当然,只有在空白div旁边的图片才能与其互换。不然游戏就太简单了。如何实现?下面先使用一种比较笨的方式来实现。

<script>
  $(function(){
    var menu = {
      "1":["2","4"],
      "2":["1","3","5"],
      "3":["2","6"],
      "4":["1","5","7"],
      "5":["2","4","6","8"],
      "6":["3","5","9"],
      "7":["4","8"],
      "8":["5","7","9"],
      "9":["6","8"]
    }
    $('.in').click(function(){
      var click_num = $(this).index()+1;
      var no_see_num = $('.no_see').index()+1;
      var arr = menu[no_see_num];
      if(jQuery.inArray(String(click_num), arr)=='-1'){
        //这里是无法交换位置的逻辑。可以做点什么。
      }else{
        var t = $(this).clone();
        $('.no_see').before(t);
        $(this).before($('.no_see'));
        t.before($(this))
        t.remove();
      }
    })
  })
</script>

是的,这种方法很蠢,但是可以实现。通过数组的方式,先找到空白div,再查看空白div所在位置四周有哪些位置的图片可以与其交换。

当然,九宫格使用这样的方式来实现没有问题,毕竟数组是可列的。但是如果变成16宫格,36宫格呢?先不说要去列数组,还要修改代码。这样就很费劲了。所以我需要通过别的方式,让代码以后扩展更容易。

通过算法保证互换条件

<script>
  $(function(){

    $('.in').click(function(){
      var tmp = false;
      var click_num = $(this).index();
      var no_see_num = $('.no_see').index();

      var click_x = click_num % 3;
      var click_y = Math.floor(click_num / 3);

      var no_see_x = no_see_num % 3;
      var no_see_y = Math.floor(no_see_num / 3);

      if (click_x==no_see_x) { //同一行
        if (click_y==no_see_y+1||click_y==no_see_y-1) {
          tmp = true; //保证相邻
        }
      }else if (click_y==no_see_y) { //同一列
        if (click_x==no_see_x+1||click_x==no_see_x-1) {
          tmp = true; //保证相邻
        }
      }

      if (tmp) {
        var t = $(this).clone();
        t.addClass('bit');
        $('.no_see').before(t);
        $(this).before($('.no_see'));
        t.before($(this))
        t.remove();
      }

    })

  })
</script>

算法看起来会比较乱。简单的说是通过求余和相除取最小整数的方式来计算。

画几个表可能就清楚了。

1.在九宫格下每个图的顺序如下。

基于jquery实现九宫格拼图小游戏

2.在九宫格下每个位置求余后的值如下。

基于jquery实现九宫格拼图小游戏

3.在九宫格下每个位置除法取最小整数的值如下。

基于jquery实现九宫格拼图小游戏

现在看起来应该简单多了。当取余相等时,两个位置在一列上。当除法取最小整数相等时,两个位置在一行上。
但是此时还存在一个问题,在一行或者一列上也有可能中间有间隔。所以采取当取余相等时,用除法的结果+1或者-1。此时就可以判断是否有间隔值了。

最后

到这里,游戏的主体就算写完了。当然,如何想丰富游戏趣味,可以加入计时器、完成所用步骤等等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jquery实现异步加载图片(懒加载图片一种方式)
Apr 24 jQuery
JQuery实现图片轮播效果
May 08 jQuery
Jquery EasyUI $.Parser
Jun 02 jQuery
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
jQuery常用选择器详解
Jul 17 jQuery
jQuery实现的表格前端排序功能示例
Sep 18 jQuery
jQuery实现IE输入框完成placeholder标签功能的方法
Sep 20 jQuery
jQuery选择器之属性过滤选择器详解
Sep 28 jQuery
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 jQuery
JQuery Ajax跨域调用和非跨域调用问题实例分析
Apr 16 jQuery
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 #jQuery
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 #jQuery
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
jQuery 同时获取多个标签的指定内容并储存为数组
Nov 20 #jQuery
IE8中jQuery.load()加载页面不显示的原因
Nov 15 #jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 #jQuery
详解jQuery获取特殊属性的值以及设置内容
Nov 14 #jQuery
You might like
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
奥巴马就职演讲稿
2014/05/15 职场文书
企业年度评优方案
2014/06/02 职场文书
二人合伙经营协议书
2014/09/13 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
单独二胎证明
2015/06/24 职场文书
Python实现批量自动整理文件
2022/03/16 Python