林中侠客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分。废话不多说直接上源码。

效果图(ps 页面有点难看木有美工) 

代码总共456行,未经过严格测试

  1 <html lang="zh-CN">
  2 <head>
  3 <meta charset="utf-8">
  4 <meta http-equiv="X-UA-Compatible" content="IE=edge">
  5 <meta name="viewport" content="width=device-width, initial-scale=1">
  6 <title>消灭方块</title>
  7 </head>
  8 <body>
  9 <style type="text/css">
 10 #content{width:580px;height:620px;margin:0px auto;border:none;position:relative;background:#0b1a7f;}
 11 #top{width:100%;height:auto;position:absolute;top:20px;}
 12 #top tr td{width:5%;height:35px;border:none;text-align:left;line-height:20px;font-size:24px;color:#E9F8F4;font-weight:800;}
 13 #contenttab{width:100%;height:auto;position:absolute;bottom:0px;}
 14 #contenttab tr td{width:56px;height:56px;border:none;text-align:center;line-height:56px;cursor:pointer;}
 15 #showMessage{color:#FF0000 !important;font-size:22px !important;}
 16 </style>
 17 <div id="content">
 18 <table id="top">
 19 <tr>
 20 <td colspan=2>&nbsp;&nbsp;历史最高分</td>
 21 <td colspan=2 id="bestScore"></td>
 22 <td colspan=3></td>
 23 </tr>
 24 <tr>
 25 <td colspan=2>&nbsp;&nbsp;当前得分</td>
 26 <td colspan=2 id="currentLevelScore"></td>
 27 <td colspan=3></td>
 28 </tr>
 29 <tr>
 30 <td>&nbsp;&nbsp;关卡</td>
 31 <td id="currentLevel"></td>
 32 <td colspan=1></td>
 33 <td>目标</td>
 34 <td id="targetScore"></td>
 35 <td colspan=2></td>
 36 </tr>
 37 <tr>
 38 <td>&nbsp;&nbsp;总分</td>
 39 <td id="totalScore"></td>
 40 <td colspan=1></td>
 41 <td colspan=4 id="showMessage"></td>
 42 </tr>
 43 </table>
 44 <table id="contenttab">
 45 </table>
 46 </div>
 47 <script type="text/javascript">
 48 var colorArray=new Array('a','b','c','d','e'); //颜色数组
 49 var x=7; //x轴行数
 50 var y=10; //y轴行数
 51 var totalArray=new Array(); //方块总数
 52 var sameArray=new Array(); //消灭方块数组
 53 var contenttab=document.getElementById('contenttab'); //存放方块的盒子
 54 var isShow=false;
 55 var timer=null;
 56 var currentLevel=1; //当前关卡
 57 var currentLevelScore=0; //当前关卡得分
 58 var targetScore=getTargetScore(); //目标分数
 59 var totalScore=0; //总分
 60 //最高分
 61 var bestScore=getCookie('starBestScore');
 62 if(bestScore!=null && bestScore!=""){
 63 bestScore=Number(bestScore);
 64 }else{
 65 bestScore=0;
 66 }
 67 starScore(); //初始化分数
 68 starStar(); //初始化方块数组
 69 starTable(); //初始化方块页面
 70 
 71 //获取目标分数
 72 function getTargetScore(){
 73 return 1000*(1+currentLevel)*currentLevel/2;
 74 }
 75 
 76 //获取每次消除分数
 77 function getScore(length){
 78 return length*length*5;
 79 }
 80 
 81 //获取最后奖励分数
 82 function getRewardsScore(deadCount){
 83 if(deadCount<10){
 84 return (10-deadCount)*100;
 85 }else{
 86 return 0;
 87 }
 88 }
 89 
 90 //设置提示消息
 91 function setShowMessage(msg){
 92 if(document.getElementById('showMessage').innerHTML!='' && timer!=null){
 93 delShowMessage();
 94 }
 95 document.getElementById('showMessage').innerHTML=msg; //设置提示消息
 96 timer=setInterval("delShowMessage()",3000);
 97 }
 98 
 99 //消除提示消息
100 function delShowMessage(){
101 document.getElementById('showMessage').innerHTML='';
102 clearInterval(timer);
103 }
104 
105 //提示消息
106 function showMessage(length){
107 var msg='';
108 switch(length){
109 case 5:
110 msg='牛逼!';
111 break;
112 case 6:
113 msg='赞!';
114 case 7:
115 msg='吊炸天!';
116 break;
117 case 8:
118 msg='赞!';
119 break;
120 default:
121 msg=length+'连消'+getScore(length)+'分!';
122 }
123 setShowMessage(msg);
124 }
125 
126 //设置Cookie
127 function setCookie(c_name,value,expiredays){
128 var exp=new Date();
129 exp.setTime(exp.getTime()+expiredays*24*60*60*1000);
130 document.cookie=c_name+"="+escape(value)+";expires="+exp.toGMTString();
131 }
132 
133 //获取Cookie
134 function getCookie(c_name){
135 var arr,reg=new RegExp("(^| )"+c_name+"=([^;]*)(;|$)");
136 if(arr=document.cookie.match(reg)){
137 return unescape(arr[2]);
138 }else{
139 return "";
140 }
141 }
142 
143 //初始化分数
144 function starScore(){
145 document.getElementById('bestScore').innerHTML=bestScore;
146 document.getElementById('currentLevelScore').innerHTML=currentLevelScore;
147 document.getElementById('currentLevel').innerHTML=currentLevel;
148 document.getElementById('targetScore').innerHTML=targetScore;
149 document.getElementById('totalScore').innerHTML=totalScore;
150 }
151 
152 //初始化方块数组
153 function starStar(){
154 for(var i=x-1;i>=0;i--){
155 totalArray[i]=new Array();
156 for(var j=0;j<y;j++){
157 var color=getRound(); //获取随机颜色
158 totalArray[i][j]=new Array();    
159 totalArray[i][j]['color']=color;
160 totalArray[i][j]['col']=i;
161 totalArray[i][j]['row']=j;
162 }
163 }
164 }
165 
166 //初始化方块页面
167 function starTable(){
168 contenttab.innerHTML='';
169 for(var i=x-1;i>=0;i--){
170 var td='';
171 for(var j=0;j<y;j++){
172 td+='<td style=\'background:url('+totalArray[i][j]['color']+'.gif) no-repeat;\' onclick=\'onTouchesBegan('+i+','+j+')\' id=\'star'+i+''+j+'\'></td>';
173 }
174 contenttab.innerHTML+='<tr class=\'tr'+i+'\'>'+td+'</tr>';
175 }
176 }
177 
178 //获取随机颜色
179 function getRound(){
180 var num=Math.round(Math.random()*(colorArray.length-1));
181 return colorArray[num];
182 }
183 
184 //检查数组包含元素
185 Array.prototype.contains = function(item){
186 for(i=0;i<this.length;i++){
187 if(this[i]['col']==item['col'] && this[i]['row']==item['row']){
188 return true;
189 }
190 }
191 return false;
192 };
193 
194 //触发点击事件
195 function onTouchesBegan(col,row){    
196 checkSameColorStars(totalArray[col][row]); //检测方块相同颜色区域
197 removeSameColorStars(); //移除相同的方块
198 }
199 
200 //检测一方块的四个方向
201 function checkOneStarFourSide(sprite){
202 if(sprite==null){
203 retrun;
204 }
205 var col=sprite['col'];
206 var row=sprite['row'];
207 var color=sprite['color'];
208 var fourSideArray=new Array(); //四个方向的方块总数
209 //向上消除
210 if(col<x-1){
211 var upSprite=totalArray[col+1][row];
212 if(upSprite!=null && upSprite['color']==color){
213 fourSideArray.push(upSprite);
214 }
215 }
216 //向右消除
217 if(row<y-1){
218 var upSprite=totalArray[col][row+1];
219 if(upSprite!=null && upSprite['color']==color){
220 fourSideArray.push(upSprite);
221 }
222 }
223 //向下消除
224 if(col>0){
225 var upSprite=totalArray[col-1][row];
226 if(upSprite!=null && upSprite['color']==color){
227 fourSideArray.push(upSprite);
228 }
229 }
230 //向左消除
231 if(row>0){
232 var upSprite=totalArray[col][row-1];
233 if(upSprite!=null && upSprite['color']==color){
234 fourSideArray.push(upSprite);
235 }
236 }
237 return fourSideArray;
238 }
239 
240 //检测方块相同颜色区域
241 function checkSameColorStars(sprite){
242 if(sprite==null){
243 retrun;
244 }
245 var newSameArray=new Array(); //每次扩展新加入的方块总数
246 sameArray.push(sprite);
247 newSameArray.push(sprite);
248 while(newSameArray.length>0){
249 for(var i=0;i<newSameArray.length;i++){ 
250 var fourSide=checkOneStarFourSide(newSameArray[i]); //检测点击方块四周是否有相同的颜色的方块
251 if(fourSide.length>0){
252 for(var j=0;j<fourSide.length;j++){
253 if(!sameArray.contains(fourSide[j])){ 
254 sameArray.push(fourSide[j]); 
255 newSameArray.push(fourSide[j]);
256 } 
257 } 
258 }
259 newSameArray.splice(i,1);
260 } 
261 }
262 }
263 
264 //移除相同的方块
265 function removeSameColorStars(){
266 //相同颜色的方块是否大于1
267 var length=sameArray.length;
268 if(length>1){
269 for(var k=0;k<length;k++){
270 var simpleStar=sameArray[k];
271 if(simpleStar){
272 var col=simpleStar['col']; 
273 var row=simpleStar['row'];
274 totalArray[col].splice(row,1,null);
275 document.getElementById('star'+col+''+row).style.background='none';
276 }
277 }
278 showMessage(length); //提示消息
279 var score=getScore(length); //每次消灭的总数
280 currentLevelScore=currentLevelScore+score; //当前关卡得分
281 totalScore=totalScore+score; //总分
282 //总分大于目标分 过关
283 if(totalScore>targetScore && !isShow){
284 isShow=true;
285 setShowMessage('恭喜过关!');
286 }
287 document.getElementById('currentLevelScore').innerHTML=currentLevelScore; //设置当前关卡得分
288 document.getElementById('totalScore').innerHTML=totalScore; //设置总分
289 }
290 sameArray=[];
291 fallStar(); //方块掉落
292 }
293 
294 //转换数组 获取第j列的数组
295 function getLtotalArray(j){
296 var LtotalArray=new Array();
297 for(var i=0;i<x;i++){    
298 LtotalArray[i]=new Array();
299 if(totalArray[i][j]==null){
300 LtotalArray.splice(i,1,null);
301 }else{
302 LtotalArray[i]['color']=totalArray[i][j]['color'];    
303 LtotalArray[i]['col']=totalArray[i][j]['col'];
304 LtotalArray[i]['row']=totalArray[i][j]['row'];
305 }
306 }
307 return LtotalArray;
308 }
309 
310 //方块掉落 填充空缺
311 function fallStar(){
312 for(var j=0;j<y;j++){
313 //循环得到每一列的数组
314 var sprites=getLtotalArray(j);
315 var length=sprites.length;
316 for(var i=0;i<length;i++){
317 var pSprite0=sprites[i];
318 //找到空方块
319 if(pSprite0==null){
320 var k=i+1;
321 while(k<length){
322 var upSprite=sprites[k];
323 if(upSprite!=null){ 
324 upSprite['col']=i;
325 upSprite['row']=j;
326 totalArray[i].splice(j,1,upSprite);
327 totalArray[k].splice(j,1,null);
328 sprites.splice(i,1,upSprite);
329 sprites.splice(k,1,null);
330 document.getElementById('star'+i+''+j).style.cssText='background:url('+upSprite['color']+'.gif) no-repeat;';
331 document.getElementById('star'+k+''+j).style.background='none';
332 k=length;
333 }
334 k++;
335 }
336 }
337 }
338 }
339 combineStar(); //向左合并方块
340 deadStar(); //检测死局
341 }
342 
343 //向左合并方块
344 function combineStar(){
345 for(var j=0;j<y;j++){
346 //循环得到每一列的数组
347 var sprites=getLtotalArray(j);
348 var mSprite0=sprites[0];
349 //如果底部有空方块就向左合并
350 if (mSprite0==null){
351 if(j<y-1){
352 var k=j+1;
353 while(k<y){
354 var upSprite=getLtotalArray(k);
355 var pSprite0=upSprite[0];
356 if(pSprite0!=null){
357 for(var i=0;i<upSprite.length;i++){
358 if(upSprite[i]!=null){
359 upSprite[i]['col']=i;
360 upSprite[i]['row']=j;
361 totalArray[i].splice(j,1,upSprite[i]);
362 totalArray[i].splice(k,1,null);
363 document.getElementById('star'+i+''+j).style.cssText='background:url('+upSprite[i]['color']+'.gif) no-repeat;';
364 document.getElementById('star'+i+''+k).style.background='none';
365 }
366 }
367 k=y;
368 }
369 k++;
370 }
371 }
372 }
373 }
374 }
375 
376 //检测死局
377 function deadStar(){
378 var isDead=true; 
379 var deadCount=0; //剩余的方块个数    
380 for(var j=0;j<y;j++){
381 var sprites=getLtotalArray(j);
382 var length=sprites.length; 
383 for(var i=0;i<length;i++){ 
384 var pSprite0=sprites[i];
385 if(pSprite0!=null){ 
386 var fourSide=checkOneStarFourSide(pSprite0);
387 //还有可消灭的方块
388 if(fourSide.length>0){    
389 isDead=false;
390 return;
391 } 
392 } 
393 }
394 }
395 //没有可消灭的方块 
396 if(isDead){
397 for(var j=0;j<y;j++){
398 var sprites=getLtotalArray(j);
399 var length=sprites.length; 
400 for(var i=0;i<length;i++){ 
401 var pSprite0=sprites[i];
402 if(pSprite0!=null){
403 deadCount++;
404 }
405 }
406 }
407 var score=getRewardsScore(deadCount); //获取最后奖励分数
408 if(score>0){
409 currentLevelScore=currentLevelScore+score; //当前关卡得分
410 totalScore=totalScore+score; //总分
411 document.getElementById('currentLevelScore').innerHTML=currentLevelScore; //设置当前关卡得分
412 document.getElementById('totalScore').innerHTML=totalScore; //设置总分
413 }    
414 //剩余方块大于0
415 if(deadCount>0){
416 //总分大于目标分 过关
417 if(totalScore>targetScore){
418 currentLevel++; //关卡加1
419 targetScore=getTargetScore(); //获取当前关卡目标分
420 currentLevelScore=0; //当前得分清空
421 setShowMessage('剩余'+deadCount+'个方块,奖励'+score+'分!');
422 }else{
423 //游戏结束
424 currentLevel=1; //关卡清空
425 targetScore=getTargetScore(); //获取当前关卡目标分
426 currentLevelScore=0; //当前得分清空
427 //总分大于历史最高分
428 if(totalScore>bestScore){
429 bestScore=totalScore; //保存最高分
430 setCookie('starBestScore',bestScore,30);
431 }
432 totalScore=0; //总分清空
433 setShowMessage('游戏结束!');
434 }
435 }else{
436 //总分小于目标分
437 if(totalScore<targetScore){
438 var score=targetScore-totalScore; //获取最后奖励分数
439 currentLevelScore=currentLevelScore+score; //当前关卡得分
440 totalScore=totalScore+score; //总分
441 document.getElementById('currentLevelScore').innerHTML=currentLevelScore; //设置当前关卡得分
442 document.getElementById('totalScore').innerHTML=totalScore; //设置总分
443 }
444 currentLevel++; //关卡加1
445 targetScore=getTargetScore(); //获取当前关卡目标分
446 currentLevelScore=0; //当前得分清空
447 }
448 isShow=false;
449 starScore(); //初始化分数
450 starStar(); //初始化方块数组
451 starTable(); //初始化方块页面
452 }
453 }
454 </script>
455 </body>
456 </html>

 

posted on 2014-11-10 15:18  林中侠客  阅读(3873)  评论(32编辑  收藏  举报