本文实例为大家分享了javascript实现拼图游戏的具体代码,供大家参考,具体内容如下
< 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 >
CSS:
*{
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.3 s; /*浏览器前缀,兼容其他浏览器 chrome*/
-moz-transition: 0.3 s; /*firefox*/
-ms-transition: 0.3 s; /*ie*/
-o-transition: 0.3 s; /*opera*/
transition: 0.3 s;
}
/* 这就是小方块的大小了,定位为绝对定位,这样改变位置不会影响其他元素的位置。宽高都是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按钮设置属性*/
#d 1 {
left : 0px ;
}
#d 2 {
left : 150px ;
}
#d 3 {
left : 300px ;
}
#d 4 {
top : 150px ;
}
#d 5 {
top : 150px ;
left : 150px ;
}
#d 6 {
top : 150px ;
left : 300px ;
}
#d 7 {
top : 300px ;
}
#d 8 {
left : 150px ;
top : 300px ;
}
/*这是预先给每个小方块按照顺序排好位置*/
JS:
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();
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_41309350/article/details/113184594
查看更多关于javascript实现拼图游戏的详细内容...