JS实现九宫格拼图游戏


Posted in Javascript onJune 28, 2022

本文实例为大家分享了JS实现九宫格拼图游戏的具体代码,供大家参考,具体内容如下

<!doctype html>
<html>
<head>
 <meta charset="UTF-8">
 <title>九宫格拼图</title>
 <style>
  *{
   padding: 0;
   margin: 0;
   border: 0;
  }
  /* *是通配符,给所有的元素去掉默认样式,因为有的浏览器会默认加上一些样式,这可能会给布局带来问题 */
  body{
   width: 100%;
   height: 100%;
  }
  /* 给body设置100%的高度和宽度,这样就会根据浏览器屏幕大小自动适配 */
  #container{
   position: relative;
   width: 620px;
   height: 450px;
   margin: 0 auto;
   margin-top: 100px;
   border-radius: 1px;
  }
  /* 这是包裹所有元素的DIV,给他设置620px的宽和450px的高,这个大小可以设置为更大,但是不能小,至少要能包含里面所有的元素 */
  #game{
   position: absolute;
   width: 450px;
   height: 450px;
   border-radius: 5px;
   display: inline-block;
   background-color: #ffe171;
   box-shadow: 0 0 10px #ffe171;
  }
  /* 这是游戏区的DIV,这个大小是计算出来的,取决于你的小方块的大小。这里我们设置小方块的大小为150px 150px,所以这个大小是150px*3,为450px */
  #game div{
   position: absolute;
   width: 149px;
   height: 149px;
   box-shadow: 1px 1px 2px #777;
   background-color: #20a6fa;
   color: white;
   text-align: center;
   font-size: 150px;
   line-height: 150px;
   cursor: pointer;
   -webkit-transition: 0.3s;/*浏览器前缀,兼容其他浏览器 chrome*/
    -moz-transition: 0.3s;/*firefox*/
    -ms-transition: 0.3s;/*ie*/
     -o-transition: 0.3s;/*opera*/
     transition: 0.3s;
  }
  /* 这就是小方块的大小了,定位为绝对定位,这样改变位置不会影响其他元素的位置。宽高都是149px。注意了,我们还设置了box-shadow:1px 1px 2px #777 ;
  它还有边框阴影,所以149px 加上边框1px,它的总宽度是150px 下面的transition:0.3s是设置过渡时间,这是css3的属性,它会让属性改变呈现过渡动画,所以
  当我们改变方块的位置时,它会有一个动画,我们不必自己编写动画函数,这回让你疯狂*/
  #game div:hover{
   color: #ffe171;
  }
  /*给方块设置鼠标悬停动画,当鼠标悬停在元素上面时,会用这里的属性替换上面的属性,移开后又会变为原来的,这里我们是把字体颜色改变*/
  #control{
   width: 150px;
   height: 450px;
   display: inline-block;
   float: right;
  }
  /*控制区,display:inline-block会让元素呈现块状元素的特性,使得可以改变大小,同时也会具有行内元素的特性,使得不会占据一行空间,float:right让元素浮动到右边*/
  #control rowspan{
   height: 25px;
   font-size: 20px;
   color: #222;
   margin-top: 10px;
  }
  /*设置控制区按钮的共同样式*/
  #start{
   display: inline-block;
   font-size: 28px;
   width: 100px;
   height: 28px;
   background-color: #20a6fa;
   color: #ffe171;
   text-shadow: 1px 1px 2px #ffe171;
   border-radius: 5px;
   box-shadow: 2px 2px 5px #4c98f5;
   text-align: center;
   cursor: pointer;
  }
  /*给start按钮设置属性。cursor:pointer属性让鼠标移到元素上面时会显示不同的鼠标形状,pointer是手型*/
  #reset{
   display: inline-block;
   font-size: 28px;
   width: 100px;
   height: 28px;
   background-color: #20a6fa;
   color: #ffe171;
   text-shadow: 1px 1px 2px #ffe171;/*字体阴影*/
   border-radius: 5px;/*圆角属性*/
   box-shadow: 2px 2px 5px #4c98f5;/*盒子阴影*/
   text-align: center;/*文字居中*/
   cursor: pointer;
  }
  /*给Reset按钮设置属性*/
  #d1{
   left: 0px;
  }
  #d2{
   left: 150px;
  }
  #d3{
   left: 300px;
  }
  #d4{
   top: 150px;
  }
  #d5{
   top: 150px;
   left: 150px;
  }
  #d6{
   top: 150px;
   left: 300px;
  }
  #d7{
   top: 300px;
  }
  #d8{
   left: 150px;
   top: 300px;
  }
  /*这是预先给每个小方块按照顺序排好位置*/
 </style>
</head>
<body>
 <div id="container">
 <!--最外面的DIV,用来包含里面的结构-->
  <div id="game">
  <!--游戏区,大DIV方块-->
   <div id="d1" onclick="move(1)">1</div>
   <!--小DIV,也就是8个小方块。当点击的时候执行move()函数,参数是显示的编号,这样我们就知道点击了哪个方块-->
   <div id="d2" onclick="move(2)">2</div>
   <div id="d3" onclick="move(3)">3</div>
   <div id="d4" onclick="move(4)">4</div>
   <div id="d5" onclick="move(5)">5</div>
   <div id="d6" onclick="move(6)">6</div>
   <div id="d7" onclick="move(7)">7</div>
   <div id="d8" onclick="move(8)">8</div>
  </div>
  <div id="control">
  <!--游戏控制区-->
   <p>
    <rowspan id="timeText">总用时</rowspan>
    <rowspan id="timer"></rowspan>
   </p>
   <!--显示游戏时间区域-->
   <p>
    <rowspan id="start" onclick="start()">开始</rowspan>
    <rowspan id="reset" onclick="reset()">重来</rowspan>
   </p>
   <!--显示控制按钮区域-->
  </div>
 </div>
 <script>
  var time=0; //保存定时时间
  var pause=true; //设置是否暂停标志,true表示暂停
  var set_timer; //设置定时函数
  var d=new Array(10); //保存大DIV当前装的小DIV的编号
  var d_direct=new Array(
    [0],//为了逻辑更简单,第一个元素我们不用,我们从下标1开始使用
    [2,4],//大DIV编号为1的DIV可以去的位置,比如第一块可以去2,4号位置
    [1,3,5],
    [2,6],
    [1,5,7],
    [2,4,6,8],
    [3,5,9],
    [4,8],
    [5,7,9],
    [6,8]
   ); //保存大DIV编号的可移动位置编号
  var d_posXY=new Array(
    [0],//同样,我们不使用第一个元素
    [0,0],//第一个表示left,第二个表示top,比如第一块的位置为let:0px,top:0px
    [150,0],
    [300,0],
    [0,150],
    [150,150],
    [300,150],
    [0,300],
    [150,300],
    [300,300]
   ); //大DIV编号的位置
  d[1]=1;d[2]=2;d[3]=3;d[4]=4;d[5]=5;d[6]=6;d[7]=7;d[8]=8;d[9]=0; //默认按照顺序排好,大DIV第九块没有,所以为0,我们用0表示空白块
  function move(id){
   //移动函数,前面我们已将讲了
   var i=1;
   for(i=1; i<10; ++i){
    if( d[i] == id )
     break;
   }
   //这个for循环是找出小DIV在大DIV中的位置
   var target_d=0;
   //保存小DIV可以去的编号,0表示不能移动
   target_d=whereCanTo(i);
   //用来找出小DIV可以去的位置,如果返回0,表示不能移动,如果可以移动,则返回可以去的位置编号
   if( target_d != 0){
    d[i]=0;
    //把当前的大DIV编号设置为0,因为当前小DIV已经移走了,所以当前大DIV就没有装小DIV了
    d[target_d]=id;
    //把目标大DIV设置为被点击的小DIV的编号
    document.getElementById("d"+id).style.left=d_posXY[target_d][0]+"px";
    document.getElementById("d"+id).style.top=d_posXY[target_d][1]+"px";
    //最后设置被点击的小DIV的位置,把它移到目标大DIV的位置
   }
   //如果target_d不为0,则表示可以移动,且target_d就是小DIV要去的大DIV的位置编号
   var finish_flag=true;
   //设置游戏是否完成标志,true表示完成
   for(var k=1; k<9; ++k){
    if( d[k] != k){
     finish_flag=false;
     break;
     //如果大DIV保存的编号和它本身的编号不同,则表示还不是全部按照顺序排的,那么设置为false,跳出循环,后面不用再判断了,因为只要一个不符,就没完成游戏
    }
   }
   //从1开始,把每个大DIV保存的编号遍历一下,判断是否完成
   if(finish_flag==true){
    if(!pause)
     start();
    alert("congratulation");
   }
   //如果为true,则表示游戏完成,如果当前没有暂停,则调用暂停韩式,并且弹出提示框,完成游戏。
   //start()这个函数是开始,暂停一起的函数,如果暂停,调用后会开始,如果开始,则调用后会暂停
  }
  function whereCanTo(cur_div){
   //判断是否可移动函数,参数是大DIV的编号,不是小DIV的编号,因为小DIV编号跟可以去哪没关系,小DIV是会动的
   var j=0;
   var move_flag=false;
   for(j=0; j<d_direct[cur_div].length; ++j){
    //把所有可能去的位置循环遍历一下
    if( d[ d_direct[cur_div][j] ] == 0 ){
     move_flag=true;
     break;
    }
    //如果目标的值为0,说明目标位置没有装小DIV,则可以移动,跳出循环
   }
   if(move_flag == true){
    return d_direct[cur_div][j];
   }else{
    return 0;
   }
   //可以移动,则返回目标位置的编号,否则返回0,表示不可移动
  }
  //定时函数,每一秒执行一次
  function timer(){
   time+=1;//一秒钟加一,单位是秒
   var min=parseInt(time/60);//把秒转换为分钟,一分钟60秒,取商就是分钟
   var sec=time%60;//取余就是秒
   document.getElementById("timer").innerHTML=min+"分"+sec+"秒";//然后把时间更新显示出来
  }
  //开始暂停函数
  function start(){
   if(pause){
    document.getElementById("start").innerHTML="暂停";//把按钮文字设置为暂停
    pause=false;//暂停表示设置为false
    set_timer=setInterval(timer,1000);//启动定时
    //如果当前是暂停,则开始
   }else{
    document.getElementById("start").innerHTML="开始";
    pause=true;
    clearInterval(set_timer);
   }
  }
  //重置函数
  function reset(){
   time=0;//把时间设置为0
   random_d();//把方块随机打乱函数
   if(pause)//如果暂停,则开始计时
    start();
  }
  //随机打乱方块函数,我们的思路是从第九块开始,随机生成一个数,然后他们两块对调一下
  function random_d(){
   for(var i=9; i>1; --i){
    var to=parseInt(Math.random()*(i-1)+1);//产生随机数,范围为1到i,不能超出范围,因为没这个id的DIV
    if(d[i]!=0){
     document.getElementById("d"+d[i]).style.left=d_posXY[to][0]+"px";
     document.getElementById("d"+d[i]).style.top=d_posXY[to][1]+"px";
    }
    //把当前的DIV位置设置为随机产生的DIV的位置
    if(d[to]!=0){
     document.getElementById("d"+d[to]).style.left=d_posXY[i][0]+"px";
     document.getElementById("d"+d[to]).style.top=d_posXY[i][1]+"px";
    }
    //把随机产生的DIV的位置设置为当前的DIV的位置
    var tem=d[to];
    d[to]=d[i];
    d[i]=tem;
    //然后把它们两个的DIV保存的编号对调一下
   }
  }
  //初始化函数,页面加载的时候调用重置函数,重新开始
  window.onload=function(){
   reset();
  }
 </script>
</body>
</html>

JS实现九宫格拼图游戏

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


Tags in this post...

Javascript 相关文章推荐
JQuery onload、ready概念介绍及使用方法
Apr 27 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
Javascript毫秒数用法实例
Feb 05 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
Sep 06 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
Oct 30 Javascript
vue-router重定向不刷新问题的解决
Jun 25 Javascript
微信小程序实现获取小程序码和二维码java接口开发
Mar 29 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
Jun 20 Javascript
javascript实现弹幕墙效果
Nov 28 Javascript
Java 生成随机字符的示例代码
Jan 13 Javascript
JavaScript实现九宫格拖拽效果
JS实现简单九宫格抽奖
Jun 28 #Javascript
Vite + React从零开始搭建一个开源组件库
Jun 25 #Javascript
React自定义hook的方法
Jun 25 #Javascript
小程序实现侧滑删除功能
Jun 25 #Javascript
小程序自定义轮播图圆点组件
Jun 25 #Javascript
微信小程序实现轮播图指示器
Jun 25 #Javascript
You might like
跟我学Laravel之请求与输入
2014/10/15 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
js switch case default 的用法示例介绍
2013/10/23 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
对django views中 request, response的常用操作详解
2019/07/17 Python
利用Python实现kNN算法的代码
2019/08/16 Python
python读取指定字节长度的文本方法
2019/08/27 Python
Python版中国省市经纬度
2020/02/11 Python
Python的in,is和id函数代码实例
2020/04/18 Python
python音频处理的示例详解
2020/12/23 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
小学教师管理制度
2014/01/18 职场文书
劳动竞赛活动方案
2014/02/20 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server
springboot读取resources下文件的方式详解
2022/06/21 Java/Android