基于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实现的简单在线计算器功能
May 11 jQuery
jQuery Jsonp跨域模拟搜索引擎
Jun 17 jQuery
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
Sep 20 jQuery
jquery ajaxfileupload异步上传插件
Nov 21 jQuery
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
20个最常见的jQuery面试问题及答案
May 23 jQuery
jQuery利用FormData上传文件实现批量上传
Dec 04 jQuery
JQuery属性操作与循环用法示例
May 15 jQuery
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
jquery实现拖拽添加元素功能
Dec 01 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 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
php的4种常见运行方式
2015/03/20 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
python 提取文件的小程序
2009/07/29 Python
利用Python获取操作系统信息实例
2016/09/02 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
python使用epoll实现服务端的方法
2018/10/16 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
医生进修自我鉴定
2014/01/19 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js