资料出处
资料来源于博客园一位博主的资料,连接如下:
https://www.cnblogs.com/chrischen98/p/10659336.html
第一阶段:静态画面
html
<! DOCTYPE html >
< html lang = " en" >
< head> < meta charset = " UTF-8" > < title> Title</ title> < link rel = " stylesheet" href = " index.css" > < script src = " index.js" > </ script>
</ head>
< body>
< div id = " pop_star" > < div id = " targetScore" > Target Score : 2000</ div> < div id = " nowScore" > Current Score : 0</ div> < div id = " selectScore" > 0 blocks 0 scores</ div>
</ div>
</ body>
</ html>
css
* { margin : 0; padding : 0;
}
html,body { height : 100%; width : 100%;
} #pop_star { height : 100%; width : 500px; margin : 0 auto; background : url ( "./pic/background.png" ) ; position : relative; color : white; background-size : cover;
}
#targetScore { width : 100%; height : 50px; position : relative; line-height : 50px; text-align : center; font-size : 20px; background-size : cover;
} #nowScore { width : 100%; height : 50px; position : relative; line-height : 50px; text-align : center; font-size : 20px; background-size : cover;
} #selectScore { width : 100%; height : 50px; position : relative; line-height : 50px; text-align : center; font-size : 20px; background-size : cover; opacity : 0;
}
js
var table;
var squareWidth = 50 ;
var boardWidth = 10 ;
var squareSet = [ ] ; function createSquare ( value, row, col ) { var temp = document. createElement ( 'div' ) ; temp. style. height = squareWidth + "px" ; temp. style. width = squareWidth + "px" ; temp. style. position = "absolute" ; temp. num = value; temp. col = col; temp. row = row; return temp;
} function refresh ( ) { for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { squareSet[ i] [ j] . style. backgroundImage = "url(./pic/" + squareSet[ i] [ j] . num + ".png)" squareSet[ i] [ j] . style. left = squareSet[ i] [ j] . col * squareWidth + "px" ; squareSet[ i] [ j] . style. bottom = squareSet[ i] [ j] . row * squareWidth + "px" ; } }
} function init ( ) { table = document. getElementById ( 'pop_star' ) ; for ( var i = 0 ; i < boardWidth; i ++ ) { squareSet[ i] = new Array ( ) ; for ( var j = 0 ; j < boardWidth ; j ++ ) { var square = createSquare ( Math. floor ( Math. random ( ) * 5 ) , i , j) ; squareSet[ i] [ j] = square; table. appendChild ( square) ; } } refresh ( ) ;
} window. onload = function ( ) { init ( ) ;
}
效果
第二阶段:鼠标选中后,闪烁
只有JavaScript需要修改
var table;
var squareWidth = 50 ;
var boardWidth = 10 ;
var squareSet = [ ] ;
var baseScore = 5 ;
var stepScore = 10 ;
var totalScore = 0 ;
var targetScore = 1500 ; var choose = [ ] ;
var timer = null ;
var flag = true ;
var tempSquare = null ; function refresh ( ) { for ( var i = 0 ; i < squareSet. length; i++ ) { for ( var j = 0 ; j < squareSet[ i] . length; j++ ) { squareSet[ i] [ j] . style. background= "url(pic/" + squareSet[ i] [ j] . num+ ".png)" squareSet[ i] [ j] . style. left= squareSet[ i] [ j] . col* squareWidth+ "px" ; squareSet[ i] [ j] . style. bottom= squareSet[ i] [ j] . row* squareWidth+ "px" ; } }
} function createSquare ( value, row, col ) { var temp = document. createElement ( 'div' ) ; temp. style. height = squareWidth + "px" ; temp. style. width = squareWidth + "px" ; temp. style. position = "absolute" ; temp. num = value; temp. col = col; temp. row = row; return temp;
} function goBack ( ) { if ( timer != null ) { clearInterval ( timer) ; } for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { squareSet[ i] [ j] . style. border = "0px solid white" ; squareSet[ i] [ j] . style. transform = "scale(0.95)" ; } }
} function checkLinked ( square , arr ) { arr. push ( square) ; if ( square. col > 0 && squareSet[ square. row] [ square. col - 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col - 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col - 1 ] , arr) ; } if ( square. col < boardWidth - 1 && squareSet[ square. row] [ square. col + 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col + 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col + 1 ] , arr) ; } if ( square. row < boardWidth - 1 && squareSet[ square. row + 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row + 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row + 1 ] [ square. col] , arr) ; } if ( square. row > 0 && squareSet[ square. row - 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row - 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row - 1 ] [ square. col] , arr) ; }
} function flicker ( arr ) { var num = 0 ; timer = setInterval ( function ( ) { for ( var i = 0 ; i < arr. length ; i ++ ) { arr[ i] . style. border = "3px solid #BFEFFF" ; arr[ i] . style. transform = "scale(" + ( 0.9 + ( 0.05 * Math. pow ( - 1 , num) ) ) + ")" ; } num ++ ; } , 300 ) ;
} function mouseOver ( obj ) { goBack ( ) ; choose = [ ] ; checkLinked ( obj , choose) ; flicker ( choose) ; selectScore ( ) ;
} function init ( ) { table = document. getElementById ( 'pop_star' ) ; document. getElementById ( 'targetScore' ) . innerHTML = "Target Score : " + targetScore; for ( var i = 0 ; i < boardWidth ; i ++ ) { squareSet[ i] = new Array ( ) ; for ( var j = 0 ; j < boardWidth ; j ++ ) { var square = createSquare ( Math. floor ( Math. random ( ) * 5 ) , i , j) ; square. onmouseover = function ( ) { mouseOver ( this ) ; } squareSet[ i] [ j] = square; table. appendChild ( square) ; } } refresh ( ) ;
} window. onload = function ( ) { init ( ) ;
}
效果2.1
加入这段代码,便会计算闪烁方块得分
function selectScore ( ) { var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } document. getElementById ( 'selectScore' ) . innerHTML = choose. length + " blocks " + score + " points" ; document. getElementById ( 'selectScore' ) . style. opacity = 1 ; setTimeout ( function ( ) { document. getElementById ( 'selectScore' ) . style. opacity = 0 ; document. getElementById ( 'selectScore' ) . style. transition = "opacity 1s" ; } , 1000 ) ;
}
完整代码为:
var table;
var squareWidth = 50 ;
var boardWidth = 10 ;
var squareSet = [ ] ;
var baseScore = 5 ;
var stepScore = 10 ;
var totalScore = 0 ;
var targetScore = 1500 ; var choose = [ ] ;
var timer = null ;
var flag = true ;
var tempSquare = null ; function refresh ( ) { for ( var i = 0 ; i < squareSet. length; i++ ) { for ( var j = 0 ; j < squareSet[ i] . length; j++ ) { squareSet[ i] [ j] . style. background= "url(pic/" + squareSet[ i] [ j] . num+ ".png)" squareSet[ i] [ j] . style. left= squareSet[ i] [ j] . col* squareWidth+ "px" ; squareSet[ i] [ j] . style. bottom= squareSet[ i] [ j] . row* squareWidth+ "px" ; } }
} function createSquare ( value, row, col ) { var temp = document. createElement ( 'div' ) ; temp. style. height = squareWidth + "px" ; temp. style. width = squareWidth + "px" ; temp. style. position = "absolute" ; temp. num = value; temp. col = col; temp. row = row; return temp;
} function goBack ( ) { if ( timer != null ) { clearInterval ( timer) ; } for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { squareSet[ i] [ j] . style. border = "0px solid white" ; squareSet[ i] [ j] . style. transform = "scale(0.95)" ; } }
} function checkLinked ( square , arr ) { arr. push ( square) ; if ( square. col > 0 && squareSet[ square. row] [ square. col - 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col - 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col - 1 ] , arr) ; } if ( square. col < boardWidth - 1 && squareSet[ square. row] [ square. col + 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col + 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col + 1 ] , arr) ; } if ( square. row < boardWidth - 1 && squareSet[ square. row + 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row + 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row + 1 ] [ square. col] , arr) ; } if ( square. row > 0 && squareSet[ square. row - 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row - 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row - 1 ] [ square. col] , arr) ; }
} function flicker ( arr ) { var num = 0 ; timer = setInterval ( function ( ) { for ( var i = 0 ; i < arr. length ; i ++ ) { arr[ i] . style. border = "3px solid #BFEFFF" ; arr[ i] . style. transform = "scale(" + ( 0.9 + ( 0.05 * Math. pow ( - 1 , num) ) ) + ")" ; } num ++ ; } , 300 ) ;
} function selectScore ( ) { var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } document. getElementById ( 'selectScore' ) . innerHTML = choose. length + " blocks " + score + " points" ; document. getElementById ( 'selectScore' ) . style. opacity = 1 ; setTimeout ( function ( ) { document. getElementById ( 'selectScore' ) . style. opacity = 0 ; document. getElementById ( 'selectScore' ) . style. transition = "opacity 1s" ; } , 1000 ) ;
} function mouseOver ( obj ) { goBack ( ) ; choose = [ ] ; checkLinked ( obj , choose) ; flicker ( choose) ; selectScore ( ) ;
} function init ( ) { table = document. getElementById ( 'pop_star' ) ; document. getElementById ( 'targetScore' ) . innerHTML = "Target Score : " + targetScore; for ( var i = 0 ; i < boardWidth ; i ++ ) { squareSet[ i] = new Array ( ) ; for ( var j = 0 ; j < boardWidth ; j ++ ) { var square = createSquare ( Math. floor ( Math. random ( ) * 5 ) , i , j) ; square. onmouseover = function ( ) { mouseOver ( this ) ; } squareSet[ i] [ j] = square; table. appendChild ( square) ; } } refresh ( ) ;
} window. onload = function ( ) { init ( ) ;
}
效果2.2
第三阶段:消灭星星(只消灭一次)
只消除选中的星星,但是不会掉下来。
在function init(){}里面添加以下代码:
square. removed = function ( ) { for ( var i = 0 ; i < choose. length ; i ++ ) { ( function ( i ) { setTimeout ( function ( ) { squareSet[ choose[ i] . row] [ choose[ i] . col] = null ; table. removeChild ( choose[ i] ) ; } , i * 100 ) ; } ) ( i) ; } }
效果
使得星星移动(原作者这里出现错误)
function move ( ) { for ( var i = 0 ; i < boardWidth ; i ++ ) { var pointer = 0 ; for ( var j = 0 ; j < boardWidth ; j ++ ) { if ( squareSet[ j] [ i] != null ) { if ( pointer != j) { squareSet[ pointer] [ i] = squareSet[ j] [ i] ; squareSet[ j] [ i] . row = pointer; squareSet[ j] [ i] = null ; } pointer ++ ; } } }
完整代码如下:
var table;
var squareWidth = 50 ;
var boardWidth = 10 ;
var squareSet = [ ] ;
var baseScore = 5 ;
var stepScore = 10 ;
var totalScore = 0 ;
var targetScore = 1500 ; var choose = [ ] ;
var timer = null ;
var flag = true ;
var tempSquare = null ; function refresh ( ) { for ( var i = 0 ; i < squareSet. length; i++ ) { for ( var j = 0 ; j < squareSet[ i] . length; j++ ) { squareSet[ i] [ j] . style. background= "url(pic/" + squareSet[ i] [ j] . num+ ".png)" squareSet[ i] [ j] . style. left= squareSet[ i] [ j] . col* squareWidth+ "px" ; squareSet[ i] [ j] . style. bottom= squareSet[ i] [ j] . row* squareWidth+ "px" ; } }
} function createSquare ( value, row, col ) { var temp = document. createElement ( 'div' ) ; temp. style. height = squareWidth + "px" ; temp. style. width = squareWidth + "px" ; temp. style. position = "absolute" ; temp. num = value; temp. col = col; temp. row = row; return temp;
} function goBack ( ) { if ( timer != null ) { clearInterval ( timer) ; } for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { squareSet[ i] [ j] . style. border = "0px solid white" ; squareSet[ i] [ j] . style. transform = "scale(0.95)" ; } }
} function checkLinked ( square , arr ) { arr. push ( square) ; if ( square. col > 0 && squareSet[ square. row] [ square. col - 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col - 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col - 1 ] , arr) ; } if ( square. col < boardWidth - 1 && squareSet[ square. row] [ square. col + 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col + 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col + 1 ] , arr) ; } if ( square. row < boardWidth - 1 && squareSet[ square. row + 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row + 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row + 1 ] [ square. col] , arr) ; } if ( square. row > 0 && squareSet[ square. row - 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row - 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row - 1 ] [ square. col] , arr) ; }
} function flicker ( arr ) { var num = 0 ; timer = setInterval ( function ( ) { for ( var i = 0 ; i < arr. length ; i ++ ) { arr[ i] . style. border = "3px solid #BFEFFF" ; arr[ i] . style. transform = "scale(" + ( 0.9 + ( 0.05 * Math. pow ( - 1 , num) ) ) + ")" ; } num ++ ; } , 300 ) ;
} function selectScore ( ) { var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } document. getElementById ( 'selectScore' ) . innerHTML = choose. length + " blocks " + score + " points" ; document. getElementById ( 'selectScore' ) . style. opacity = 1 ; setTimeout ( function ( ) { document. getElementById ( 'selectScore' ) . style. opacity = 0 ; document. getElementById ( 'selectScore' ) . style. transition = "opacity 1s" ; } , 1000 ) ;
} function mouseOver ( obj ) { goBack ( ) ; choose = [ ] ; checkLinked ( obj , choose) ; flicker ( choose) ; selectScore ( ) ;
} function move ( ) { for ( var i = 0 ; i < boardWidth ; i ++ ) { var pointer = 0 ; for ( var j = 0 ; j < boardWidth ; j ++ ) { if ( squareSet[ j] [ i] != null ) { if ( pointer != j) { squareSet[ pointer] [ i] = squareSet[ j] [ i] ; squareSet[ j] [ i] . row = pointer; squareSet[ j] [ i] = null ; } pointer ++ ; } } } for ( var i = 0 ; i < squareSet[ 0 ] . length ; ) { if ( squareSet[ 0 ] [ i] == null ) { for ( var j = 0 ; j < boardWidth ; j ++ ) { squareSet[ j] . splice ( i , 1 ) ; } continue ; } i ++ ; } refresh ( ) ;
} function init ( ) { table = document. getElementById ( 'pop_star' ) ; document. getElementById ( 'targetScore' ) . innerHTML = "Target Score : " + targetScore; for ( var i = 0 ; i < boardWidth ; i ++ ) { squareSet[ i] = new Array ( ) ; for ( var j = 0 ; j < boardWidth ; j ++ ) { var square = createSquare ( Math. floor ( Math. random ( ) * 5 ) , i , j) ; square. onmouseover = function ( ) { mouseOver ( this ) ; } square. removed = function ( ) { if ( ! flag || choose. length == null ) { return ; } flag = false ; tempSquare = null ; var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } totalScore += score; document. getElementById ( 'nowScore' ) . innerHTML = "Current Score : " + totalScore; for ( var i = 0 ; i < choose. length ; i ++ ) { ( function ( i ) { setTimeout ( function ( ) { squareSet[ choose[ i] . row] [ choose[ i] . col] = null ; table. removeChild ( choose[ i] ) ; } , i * 100 ) ; } ) ( i) ; } setTimeout ( function ( ) { move ( ) ; } , choose. length * 100 ) ; } squareSet[ i] [ j] = square; table. appendChild ( square) ; } } refresh ( ) ;
} window. onload = function ( ) { init ( ) ;
}
效果(下降成功,但是有点小bug只有部分下降了)
解决方案:只需要在function refresh(){}的双循环里面增加以下代码:if(squareSet[i][j] == null) continue;
完整代码如下:
var table;
var squareWidth = 50 ;
var boardWidth = 10 ;
var squareSet = [ ] ;
var baseScore = 5 ;
var stepScore = 10 ;
var totalScore = 0 ;
var targetScore = 1500 ; var choose = [ ] ;
var timer = null ;
var flag = true ;
var tempSquare = null ; function refresh ( ) { for ( var i = 0 ; i < squareSet. length; i++ ) { for ( var j = 0 ; j < squareSet[ i] . length; j++ ) { if ( squareSet[ i] [ j] == null ) continue ; squareSet[ i] [ j] . style. background= "url(pic/" + squareSet[ i] [ j] . num+ ".png)" squareSet[ i] [ j] . style. left= squareSet[ i] [ j] . col* squareWidth+ "px" ; squareSet[ i] [ j] . style. bottom= squareSet[ i] [ j] . row* squareWidth+ "px" ; } }
} function createSquare ( value, row, col ) { var temp = document. createElement ( 'div' ) ; temp. style. height = squareWidth + "px" ; temp. style. width = squareWidth + "px" ; temp. style. position = "absolute" ; temp. num = value; temp. col = col; temp. row = row; return temp;
} function goBack ( ) { if ( timer != null ) { clearInterval ( timer) ; } for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { squareSet[ i] [ j] . style. border = "0px solid white" ; squareSet[ i] [ j] . style. transform = "scale(0.95)" ; } }
} function checkLinked ( square , arr ) { arr. push ( square) ; if ( square. col > 0 && squareSet[ square. row] [ square. col - 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col - 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col - 1 ] , arr) ; } if ( square. col < boardWidth - 1 && squareSet[ square. row] [ square. col + 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col + 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col + 1 ] , arr) ; } if ( square. row < boardWidth - 1 && squareSet[ square. row + 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row + 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row + 1 ] [ square. col] , arr) ; } if ( square. row > 0 && squareSet[ square. row - 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row - 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row - 1 ] [ square. col] , arr) ; }
} function flicker ( arr ) { var num = 0 ; timer = setInterval ( function ( ) { for ( var i = 0 ; i < arr. length ; i ++ ) { arr[ i] . style. border = "3px solid #BFEFFF" ; arr[ i] . style. transform = "scale(" + ( 0.9 + ( 0.05 * Math. pow ( - 1 , num) ) ) + ")" ; } num ++ ; } , 300 ) ;
} function selectScore ( ) { var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } document. getElementById ( 'selectScore' ) . innerHTML = choose. length + " blocks " + score + " points" ; document. getElementById ( 'selectScore' ) . style. opacity = 1 ; setTimeout ( function ( ) { document. getElementById ( 'selectScore' ) . style. opacity = 0 ; document. getElementById ( 'selectScore' ) . style. transition = "opacity 1s" ; } , 1000 ) ;
} function mouseOver ( obj ) { goBack ( ) ; choose = [ ] ; checkLinked ( obj , choose) ; flicker ( choose) ; selectScore ( ) ;
} function move ( ) { for ( var i = 0 ; i < boardWidth ; i ++ ) { var pointer = 0 ; for ( var j = 0 ; j < boardWidth ; j ++ ) { if ( squareSet[ j] [ i] != null ) { if ( pointer != j) { squareSet[ pointer] [ i] = squareSet[ j] [ i] ; squareSet[ j] [ i] . row = pointer; squareSet[ j] [ i] = null ; } pointer ++ ; } } } for ( var i = 0 ; i < squareSet[ 0 ] . length ; ) { if ( squareSet[ 0 ] [ i] == null ) { for ( var j = 0 ; j < boardWidth ; j ++ ) { squareSet[ j] . splice ( i , 1 ) ; } continue ; } i ++ ; } refresh ( ) ;
} function init ( ) { table = document. getElementById ( 'pop_star' ) ; document. getElementById ( 'targetScore' ) . innerHTML = "Target Score : " + targetScore; for ( var i = 0 ; i < boardWidth ; i ++ ) { squareSet[ i] = new Array ( ) ; for ( var j = 0 ; j < boardWidth ; j ++ ) { var square = createSquare ( Math. floor ( Math. random ( ) * 5 ) , i , j) ; square. onmouseover = function ( ) { mouseOver ( this ) ; } square. removed = function ( ) { if ( ! flag || choose. length == null ) { return ; } flag = false ; tempSquare = null ; var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } totalScore += score; document. getElementById ( 'nowScore' ) . innerHTML = "Current Score : " + totalScore; for ( var i = 0 ; i < choose. length ; i ++ ) { ( function ( i ) { setTimeout ( function ( ) { squareSet[ choose[ i] . row] [ choose[ i] . col] = null ; table. removeChild ( choose[ i] ) ; } , i * 100 ) ; } ) ( i) ; } setTimeout ( function ( ) { move ( ) ; } , choose. length * 100 ) ; } squareSet[ i] [ j] = square; table. appendChild ( square) ; } } refresh ( ) ;
} window. onload = function ( ) { init ( ) ;
}
第四阶段:消灭全部星星,返回结果
最终完整版代码如下:
var table;
var squareWidth = 50 ;
var boardWidth = 10 ;
var squareSet = [ ] ;
var baseScore = 5 ;
var stepScore = 10 ;
var totalScore = 0 ;
var targetScore = 1500 ; var choose = [ ] ;
var timer = null ;
var flag = true ;
var tempSquare = null ; function refresh ( ) { for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { if ( squareSet[ i] [ j] == null ) continue ; squareSet[ i] [ j] . row = i; squareSet[ i] [ j] . col = j; squareSet[ i] [ j] . style. backgroundImage = "url(./pic/" + squareSet[ i] [ j] . num + ".png)" squareSet[ i] [ j] . style. backgroundSize = "cover" ; squareSet[ i] [ j] . style. transform = "scale(0.95)" ; squareSet[ i] [ j] . style. left = squareSet[ i] [ j] . col * squareWidth + "px" ; squareSet[ i] [ j] . style. bottom = squareSet[ i] [ j] . row * squareWidth + "px" ; squareSet[ i] [ j] . style. transition = "left 0.3s, bottom 0.3s" ; } }
} function createSquare ( value, row, col ) { var temp = document. createElement ( 'div' ) ; temp. style. height = squareWidth + "px" ; temp. style. width = squareWidth + "px" ; temp. style. display = "inline-block" ; temp. style. position = "absolute" ; temp. style. boxSizing = "border-box" ; temp. style. borderRadius = "12px" ; temp. num = value; temp. col = col; temp. row = row; return temp;
} function goBack ( ) { if ( timer != null ) { clearInterval ( timer) ; } for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { if ( squareSet[ i] [ j] == null ) continue ; squareSet[ i] [ j] . style. border = "0px solid white" ; squareSet[ i] [ j] . style. transform = "scale(0.95)" ; } }
} function checkLinked ( square , arr ) { if ( square == null ) return ; arr. push ( square) ; if ( square. col > 0 && squareSet[ square. row] [ square. col - 1 ] && squareSet[ square. row] [ square. col - 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col - 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col - 1 ] , arr) ; } if ( square. col < boardWidth - 1 && squareSet[ square. row] [ square. col + 1 ] && squareSet[ square. row] [ square. col + 1 ] . num == square. num && arr. indexOf ( squareSet[ square. row] [ square. col + 1 ] ) == - 1 ) { checkLinked ( squareSet[ square. row] [ square. col + 1 ] , arr) ; } if ( square. row < boardWidth - 1 && squareSet[ square. row + 1 ] [ square. col] && squareSet[ square. row + 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row + 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row + 1 ] [ square. col] , arr) ; } if ( square. row > 0 && squareSet[ square. row - 1 ] [ square. col] && squareSet[ square. row - 1 ] [ square. col] . num == square. num && arr. indexOf ( squareSet[ square. row - 1 ] [ square. col] ) == - 1 ) { checkLinked ( squareSet[ square. row - 1 ] [ square. col] , arr) ; }
} function flicker ( arr ) { var num = 0 ; timer = setInterval ( function ( ) { for ( var i = 0 ; i < arr. length ; i ++ ) { arr[ i] . style. border = "3px solid #BFEFFF" ; arr[ i] . style. transform = "scale(" + ( 0.9 + ( 0.05 * Math. pow ( - 1 , num) ) ) + ")" ; } num ++ ; } , 300 ) ;
} function selectScore ( ) { var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } if ( score == 0 ) return ; document. getElementById ( 'selectScore' ) . innerHTML = choose. length + " blocks " + score + " points" ; document. getElementById ( 'selectScore' ) . style. opacity = 1 ; document. getElementById ( 'selectScore' ) . style. transition = null ; setTimeout ( function ( ) { document. getElementById ( 'selectScore' ) . style. opacity = 0 ; document. getElementById ( 'selectScore' ) . style. transition = "opacity 1s" ; } , 1000 ) ;
} function mouseOver ( obj ) { if ( ! flag) { tempSquare = obj; return ; } goBack ( ) ; choose = [ ] ; checkLinked ( obj , choose) ; if ( choose. length <= 1 ) { choose = [ ] ; return ; } flicker ( choose) ; selectScore ( ) ;
} function move ( ) { for ( var i = 0 ; i < boardWidth ; i ++ ) { var pointer = 0 ; for ( var j = 0 ; j < boardWidth ; j ++ ) { if ( squareSet[ j] [ i] != null ) { if ( pointer != j) { squareSet[ pointer] [ i] = squareSet[ j] [ i] ; squareSet[ j] [ i] . row = pointer; squareSet[ j] [ i] = null ; } pointer ++ ; } } } for ( var i = 0 ; i < squareSet[ 0 ] . length ; ) { if ( squareSet[ 0 ] [ i] == null ) { for ( var j = 0 ; j < boardWidth ; j ++ ) { squareSet[ j] . splice ( i , 1 ) ; } continue ; } i ++ ; } refresh ( ) ;
} function isFinish ( ) { flag = true ; for ( var i = 0 ; i < squareSet. length ; i ++ ) { for ( var j = 0 ; j < squareSet[ i] . length ; j ++ ) { if ( squareSet[ i] [ j] == null ) continue ; var temp = [ ] ; checkLinked ( squareSet[ i] [ j] , temp) ; if ( temp. length > 1 ) return false ; } } return flag;
} function init ( ) { table = document. getElementById ( 'pop_star' ) ; document. getElementById ( 'targetScore' ) . innerHTML = "Target Score : " + targetScore; for ( var i = 0 ; i < boardWidth ; i ++ ) { squareSet[ i] = new Array ( ) ; for ( var j = 0 ; j < boardWidth ; j ++ ) { var square = createSquare ( Math. floor ( Math. random ( ) * 5 ) , i , j) ; square. onmouseover = function ( ) { mouseOver ( this ) ; } square. removed = function ( ) { if ( ! flag || choose. length == null ) { return ; } flag = false ; tempSquare = null ; var score = 0 ; for ( var i = 0 ; i < choose. length ; i ++ ) { score += ( baseScore + i * stepScore) ; } totalScore += score; document. getElementById ( 'nowScore' ) . innerHTML = "Current Score : " + totalScore; for ( var i = 0 ; i < choose. length ; i ++ ) { ( function ( i ) { setTimeout ( function ( ) { squareSet[ choose[ i] . row] [ choose[ i] . col] = null ; table. removeChild ( choose[ i] ) ; } , i * 50 ) ; } ) ( i) ; } setTimeout ( function ( ) { move ( ) ; setTimeout ( function ( ) { var judge = isFinish ( ) ; if ( judge) { if ( totalScore > targetScore) { alert ( 'Congratulations! You win!' ) ; } else { alert ( 'Mission Failed!' ) ; } } else { flag = true ; choose = [ ] ; mouseOver ( tempSquare) ; } } , 300 + choose. length * 75 ) ; } , choose. length * 50 ) ; } squareSet[ i] [ j] = square; table. appendChild ( square) ; } } refresh ( ) ;
} window. onload = function ( ) { init ( ) ;
}
效果