javascript 拼图游戏

这是一个基于JavaScript实现的简单拼图游戏,玩家可以通过点击图片进行位置交换,最终完成拼图。游戏提供了不同难度级别的初始混乱状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

puzzle.js 

 

//节点对象 
function Node(id) 

    
this.ID=id; 
    
this.Top=null
    
this.Bottom=null
    
this.Left=null
    
this.Right=null

    
//当前节点与节点xNode是否相邻 
    this.IsAdjacent=function(xNode) 
    { 
        
if(this.Top==xNode || this.Bottom==xNode || this.Left==xNode || this.Right==xNode) 
        
return true
        
return false 
    } 

    
//在图g中id为idx的节点和id为idy节点是否在同一行 
    this.IsSameRow=function(g,idx,idy) 
    { 
        
return parseInt(idx/g.colCount)==parseInt(idy/g.colCount); 
    } 

    
//将当前图片链接到图中同时递归创建图 
    this.LinkToGraphics=function(g) 
    { 
        
if(this.Top==null && this.ID-g.colCount>=0
        {  
            
this.Top=g.GetNode(this.ID-g.colCount); 
            
this.Top.Bottom=this
            
this.Top.LinkToGraphics(g); 
        } 

        
if(this.Bottom==null && this.ID+g.colCount<=g.nodeCount-1
        { 
            
this.Bottom=g.GetNode(this.ID+g.colCount); 
            
this.Bottom.Top=this
            
this.Bottom.LinkToGraphics(g); 
        } 
        
if(this.Left==null && this.IsSameRow(g,this.ID-1,this.ID) && this.ID-1>=0
        { 
            
this.Left=g.GetNode(this.ID-1); 
            
this.Left.Right=this
            
this.Left.LinkToGraphics(g); 
        } 
        
if(this.Right==null && this.IsSameRow(g,this.ID+1,this.ID) && this.ID+1<=g.nodeCount-2
        { 
            
this.Right=g.GetNode(this.ID+1); 
            
this.Right.Left=this
            
this.Right.LinkToGraphics(g); 
        } 
    } 



//节点连接后的图对象 
function Graphics(nc,cc) 

    
this.nodeCount=nc;    //节点数 
    this.colCount=cc;    //列数 

    
this.NodeArray=new Array(this.nodeCount); 

    
//定位到某一节点 
    this.GetNode=function(j) 
    { 
        
if(this.NodeArray[j]==nullthis.NodeArray[j]=new Node(j); 
        
return this.NodeArray[j]; 
    } 

    
this.NodeArray[this.nodeCount-1]=new Node(this.nodeCount-1); 
    
//用于交换的节点 
    this.SwapNode=this.NodeArray[this.nodeCount-1

    
//将交换节点连接到图中 
    this.SwapNode.LinkToGraphics(this); 



var gps; 
var elapse=0;         

window.onload
=function() 

    
//创建有17格每行四列的拼图 
    gps=new Graphics(17,4); 
     
    
for(var i=0;i<gps.nodeCount;i++
    { 
        document.images[i].id
=i; 
        document.images[i].src
="res/"+i+".jpg"

        document.images[i].onclick
=function() 
        { 
            
var cid=this.id; 
            
var sid=gps.SwapNode.ID; 
            
var tmp; 
             
            
//如果当前图片与空白相邻则与空白交换 
            if(gps.GetNode(cid).IsAdjacent(gps.SwapNode)) 
            { 
                tmp
=document.images[cid].src; 
                document.images[cid].src
=document.images[sid].src; 
                document.images[sid].src
=tmp; 
                gps.SwapNode
=gps.GetNode(cid); 
            } 
        } 
    } 


//开始 
function Start() 

    elapse
=0
    Confuse(document.all[
"Level"].value);     
    CheckWin();    
//启动成功检查 


//打乱顺序 
function Confuse(level) 

    
for(var i=0;i<gps.nodeCount-1;i++
        document.images[i].src
="res/"+Level[level][i]+".jpg"
    document.images[gps.nodeCount
-1].src="res/"+(gps.nodeCount-1)+".jpg"
    gps.SwapNode
=gps.GetNode(gps.nodeCount-1); 


//对图片打乱的四个级别 
var Level= 

    child:        
new Array(0,1,2,3,4,5,6,7,9,10,14,11,12,8,13,15), 
    easy:        
new Array(1,2,3,7,0,5,6,11,4,9,10,15,12,8,13,14), 
    normal:        
new Array(3,10,7,6,2,0,11,5,1,15,8,14,12,9,4,13), 
    hard:        
new Array(3,7,6,5,8,9,0,11,15,10,14,13,12,1,2,4


//检查是否已经排列成功 
function CheckWin() 

    elapse
++
    document.all[
"Msg"].innerHTML=elapse; 
     
    
//如果交换图片未在最后一格则停止检查 
    if(gps.SwapNode.ID==gps.nodeCount-1
    { 
        
var isWin=true
        
for(var i=0;i<gps.nodeCount-1;i++
        { 
            
if(document.images[i].src.indexOf("/"+i+".")==-1)  
            { 
                isWin
=false
                
break
            } 
        } 
        
if(isWin)  
        { 
            document.all[
"Msg"].innerHTML="你已经成功!"
            
return
        } 
    } 
    window.setTimeout(
"CheckWin()",1000); 

 puzzle.css

 

table 
{}{ 
    border-collapse
:collapse; 
    border-color
:#D4D0C8; 
    border-width
:4px; 
    border-style
:solid; 
} 
 
img 
{}{ 
 height
:72; 
 width
:50; 
} 
 
span,input,select 
{}{ 
    font-family
:Arial; 
    font-size
:9pt; 
    font-weight
:bold; 
} 
 
#Msg 
{}{ 
    Color
:red; 
} 

 

puzzle.htm

 

<html> 
<head> 
    
<title>Puzzle</title> 
    
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
    
<link type="text/css" rel="stylesheet" href="res/puzzle.css"> 
     
<HTA:APPLICATION SCROLL="no" INNERBORDER="no" CONTEXTMENU="no" SINGLEINSTANCE="yes" BORDERSTYLE="sunken" BORDER="thin"/> 
    
<SCRIPT LANGUAGE="JavaScript" src="res/puzzle.js"></SCRIPT> 
</head> 
    
<body>  
            
<h4>拼图</h4> 
            
<select size="1" name="Level"> 
                
<option value="child">child</option> 
                
<option value="easy">easy</option> 
                
<option selected value="normal">normal</option> 
                
<option value="hard">hard</option> 
            
</select> 
            
<input type=button onclick="Start()" value=" 开始 "> <span id="Msg"></span><hr size=1> 
            
<table cellspacing="0" cellpadding="0" border="1" align="center"> 
                
<tr> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                
</tr> 
                
<tr> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                
</tr> 
                
<tr> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                
</tr> 
                
<tr> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                    
<td><img></td> 
                
</tr> 
                
<tr> 
                    
<td><img></td> 
                    
<td colspan="3" bgcolor="#D4D0C8"></td> 
                
</tr> 
            
</table>  
    
</body> 
</html> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值