zoukankan      html  css  js  c++  java
  • [模仿]html5游戏_2048

    模仿了下html5游戏_2048

    可以PC上用键盘玩

    手机上用手势玩

    应该是内存管理存在问题,虽然在UC上速度可以,但在默认浏览器下时间一长就卡,代码仅供参考

    效果图:

    代码:

    index.htm:

     1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta charset="utf-8">
     5         <meta name="description" content="An HTML5 canvas game.">
     6         <meta name="keywords" content="html5, canvas, web, game">
     7         <meta name="author" content="Wang Xin Sheng">
     8         <meta name="apple-mobile-web-app-capable" content="yes">
     9         <meta name="apple-mobile-web-app-status-bar-style" content="black">
    10         <meta name="viewport" id="viewport" content="width = device-width, initial-scale = 1, minimum-scale = 1, maximum-scale = 1, user-scalable=no">
    11         <meta http-equiv="X-UA-Compatible" content="chrome=1">
    12         <meta http-equiv="Pragma" content="no-cache">
    13         <meta http-equiv="Cache-Control" content="no-cache">
    14         <meta equiv="Expires" content="0">
    15         <meta http-equiv="content-script-type" content="text/javascript">
    16         <title>[WXS]2048</title>
    17         <!--<script src="requestNextAnimationFrame.js"></script>-->
    18         <style type="text/css">
    19          html {color:#000;background:#222;margin:0px;}
    20          body {-webkit-user-select:none;margin:0px;}
    21         #BirdWorld{cursor:pointer;background:#fff;/*border:6px #333333 solid;*/}
    22         #btn_start{color:white;font-size:38px;font-weight:bold;z-index:999;display:none;background:rgba(150,150,150,0.8);text-align:center;cursor:pointer;}
    23         </style>
    24     </head>
    25     <body>
    26     <section>
    27         <div style='position:absolute;left:0px;top:0px;' id='btn_start'></div>
    28         <canvas id="GameWorld" width="900" height="400" style="position: absolute; left: 0px; top: 0px;">
    29             <p>You need a <a href="http://www.google.com/chrome">modern browser</a> to view this.</p>
    30         </canvas>
    31     </section>
    32     </body>
    33     <script src="CGM009.js"></script>
    34 </html>
    View Code

    CGM009.js

      1 ;
      2 var gameWorld = new function(){
      3     function doResize(){
      4         caW = window.innerWidth;
      5         caH = window.innerHeight;
      6         btn_start.style.width=caW+"px";
      7         btn_start.style.height=caH+"px";
      8         btn_start.style.display="inline";
      9         btn_start.innerHTML = "<div style='margin:auto; position:absolute;100%;text-align:center; top:"+caH * 0.4 +"px'>由WangXinsheng创建<br />点击屏幕开始游戏</div>";
     10         caObj.width = caW;
     11         caObj.height = caH;
     12         scoreTotal = 0;
     13         scoreShow = "滑动屏幕开始游戏";
     14         if(caH>caW){
     15             cellW = Math.ceil(caW * 0.25);
     16             cellH = cellW;
     17             cellBL = Math.ceil((caW - cellW * 4) * 0.5);
     18             cellBT = Math.ceil((caH - cellW * 4) * 0.5);
     19             wordT = cellBT * 0.5;
     20             wordL = caW * 0.5;
     21         }else{
     22             cellW = Math.ceil(caH * 0.25);
     23             cellH = cellW;
     24             cellBL = Math.ceil((caW - cellW * 4) * 0.5);
     25             cellBT = Math.ceil((caH - cellW * 4) * 0.5);
     26             wordT = caH * 0.5;
     27             wordL = cellBL * 0.5;
     28         }
     29     }
     30     function doTouchStart(e){
     31         e.preventDefault();
     32         //console.log("ts",e);
     33         pageXs = e.changedTouches[0].pageX;
     34         pageYs = e.changedTouches[0].pageY;
     35         e.stopPropagation();
     36     }
     37     function doTouchEnd(e){
     38         e.preventDefault();
     39         //console.log("te",e);
     40         pageXe = e.changedTouches[0].pageX;
     41         pageYe = e.changedTouches[0].pageY;
     42         var offsetX = pageXe - pageXs;
     43         var offsetY = pageYe - pageYs;
     44         var parm = "";
     45         //console.log(pageXe,pageYe,pageXs,pageYs,offsetX,offsetY);
     46         if(Math.abs(offsetX)==Math.abs(offsetY)){
     47             //45度,不予理睬
     48         }else if(Math.abs(offsetX)>Math.abs(offsetY)){
     49             if(offsetX>0){
     50                 parm="right";
     51             }else{
     52                 parm="left";
     53             }
     54         }else{
     55             if(offsetY<0){
     56                 parm="up";
     57             }else{
     58                 parm="down";
     59             }
     60         }
     61         //console.log(parm);
     62         if(parm!="")
     63             doMove(parm);
     64         e.stopPropagation();
     65     }
     66     function stopEvent(e){e.preventDefault();e.stopPropagation();}
     67     function BindEvent(){
     68         btn_start.addEventListener("click", 
     69         function(){
     70             btn_start.style.display="none";
     71             if(scoreShow == "你输了!")
     72                 reStart();
     73         }, false);
     74         if(v){
     75             caObj.addEventListener("touchstart", doTouchStart, false);
     76             caObj.addEventListener("touchend", doTouchEnd, false);
     77             
     78             caObj.addEventListener("touchmove", stopEvent, false);
     79             caObj.addEventListener("touchcancel", stopEvent, false);
     80             caObj.addEventListener("gesturestart", stopEvent, false);
     81             caObj.addEventListener("gesturechange", stopEvent, false);
     82             caObj.addEventListener("gestureend", stopEvent, false);
     83         }else{
     84         document.addEventListener("keyup", doKeyPress, false);
     85         }
     86     }
     87     function doKeyPress(e){
     88         if(window.event) // IE
     89         {
     90             keynum = e.keyCode
     91         }
     92         else if(e.which) // Netscape/Firefox/Opera
     93         {
     94             keynum = e.which
     95         }
     96         switch(keynum){
     97             case 38:
     98                 doMove("up");
     99                 break;
    100             case 40:
    101                 doMove("down");
    102                 break;
    103             case 37:
    104                 doMove("left");
    105                 break;
    106             case 39:
    107                 doMove("right");
    108                 break;
    109         }
    110     }
    111     function doMove(direction){
    112         //up down left right
    113         var scoreToAdd = 0;
    114         
    115         for(var i=0;i<cells.length;i++){
    116             for(var j=0;j<cells[i].length;j++){
    117                 cells[i][j].newFlg =false;
    118             }
    119         }
    120         
    121         switch(direction){
    122             case "up":
    123                 // 先列,后行
    124                 for(var j=0;j<cells[1].length ;j++ )
    125                 {
    126                     var step = 1;
    127                     var conFlg = false;
    128                     for (var i=1;i<cells.length ;i++ )
    129                     {
    130                         if(cells[i][j].n==0)
    131                         {
    132                             step++;
    133                             conFlg=true;
    134                             continue;
    135                         }
    136                         if(!conFlg){
    137                             step = 1;
    138                         }//else{console.log(i,j,"Step:"+step);}
    139                         if(cells[i][j].n==cells[i-step][j].n && !cells[i-step][j].hbFlg)
    140                         {
    141                             //合并
    142                             scoreToAdd += cells[i-step][j].n;
    143                             cells[i-step][j].n *= 2;
    144                             cells[i-step][j].index += 1;
    145                             cells[i][j].n = 0;
    146                             cells[i][j].index = 0;
    147                             for(var kk=i-step;kk>=0;kk--)
    148                                 cells[kk][j].hbFlg = true;
    149                         }else{
    150                             if(conFlg)step--;
    151                             if(cells[i-step][j].n==0){
    152                                 //移动
    153                                 cells[i-step][j].n = cells[i][j].n;
    154                                 cells[i-step][j].index = cells[i][j].index;
    155                                 cells[i][j].n = 0;
    156                                 cells[i][j].index = 0;
    157                                 if(!conFlg){
    158                                     i--;
    159                                 }
    160                             }
    161                         }
    162                         if(conFlg){
    163                             i=1-1;
    164                         }
    165                         conFlg=false;
    166                         step = 1;
    167                     }
    168                 }
    169                 break;
    170             case "down":
    171                 // 先列,后行
    172                 for(var j=0;j<cells[1].length ;j++ )
    173                 {
    174                     var step = 1;
    175                     var conFlg = false;
    176                     for (var i=cells.length-2;i>=0 ;i-- )
    177                     {
    178                         if(cells[i][j].n==0)
    179                         {
    180                             step++;
    181                             conFlg=true;
    182                             continue;
    183                         }
    184                         if(!conFlg){
    185                             step = 1;
    186                         }//else{console.log(step);}
    187                         if(cells[i][j].n==cells[i+step][j].n && !cells[i+step][j].hbFlg)
    188                         {
    189                             //合并
    190                             scoreToAdd += cells[i+step][j].n;
    191                             cells[i+step][j].n *= 2;
    192                             cells[i+step][j].index += 1;
    193                             cells[i][j].n = 0;
    194                             cells[i][j].index = 0;
    195                             for(var kk=i+step;kk<cells.length;kk++)
    196                                 cells[kk][j].hbFlg = true;
    197                         }else{
    198                             if(conFlg)step--;
    199                             if(cells[i+step][j].n==0){
    200                                 //移动
    201                                 cells[i+step][j].n = cells[i][j].n;
    202                                 cells[i+step][j].index = cells[i][j].index;
    203                                 cells[i][j].n = 0;
    204                                 cells[i][j].index = 0;
    205                                 if(!conFlg){
    206                                     i++;
    207                                 }
    208                             }
    209                         }
    210                         if(conFlg){
    211                             i=cells.length-2+1;
    212                         }
    213                         conFlg=false;
    214                         step = 1;
    215                     }
    216                 }
    217                 break;
    218             case "left":
    219                 // 先行,后列
    220                 for(var i=0;i<cells.length ;i++ )
    221                 {
    222                     var step = 1;
    223                     var conFlg = false;
    224                     for (var j=1;j<cells[i].length ;j++ )
    225                     {
    226                         if(cells[i][j].n==0)
    227                         {
    228                             step++;
    229                             conFlg=true;
    230                             continue;
    231                         }
    232                         if(!conFlg){
    233                             step = 1;
    234                         }//else{console.log(step);}
    235                         if(cells[i][j].n==cells[i][j-step].n && !cells[i][j-step].hbFlg)
    236                         {
    237                             //合并
    238                             scoreToAdd += cells[i][j-step].n;
    239                             cells[i][j-step].n *= 2;
    240                             cells[i][j-step].index += 1;
    241                             cells[i][j].n = 0;
    242                             cells[i][j].index = 0;
    243                             for(var kk=j-step;kk>=0;kk--)
    244                                 cells[i][kk].hbFlg = true;
    245                         }else{
    246                             if(conFlg)step--;
    247                             if(cells[i][j-step].n==0){
    248                                 //移动
    249                                 cells[i][j-step].n = cells[i][j].n;
    250                                 cells[i][j-step].index = cells[i][j].index;
    251                                 cells[i][j].n = 0;
    252                                 cells[i][j].index = 0;
    253                                 if(!conFlg){
    254                                     j--;
    255                                 }
    256                             }
    257                         }
    258                         if(conFlg){
    259                             j=1-1;
    260                         }
    261                         conFlg=false;
    262                         step = 1;
    263                     }
    264                 }
    265                 break;
    266             case "right":
    267                 // 先行,后列
    268                 for(var i=0;i<cells.length ;i++ )
    269                 {
    270                     var step = 1;
    271                     var conFlg = false;
    272                     for (var j=cells[i].length-2;j>=0 ;j-- )
    273                     {
    274                         if(cells[i][j].n==0)
    275                         {
    276                             step++;
    277                             conFlg=true;
    278                             continue;
    279                         }
    280                         if(!conFlg){
    281                             step = 1;
    282                         }//else{console.log(step);}
    283                         if(cells[i][j].n==cells[i][j+step].n && !cells[i][j+step].hbFlg)
    284                         {
    285                             //合并
    286                             scoreToAdd += cells[i][j+step].n;
    287                             cells[i][j+step].n *= 2;
    288                             cells[i][j+step].index += 1;
    289                             cells[i][j].n = 0;
    290                             cells[i][j].index = 0;
    291                             for(var kk=j+step;kk<cells[i].length;kk++)
    292                                 cells[i][kk].hbFlg = true;
    293                         }else{
    294                             if(conFlg)step--;
    295                             if(cells[i][j+step].n==0){
    296                                 //移动
    297                                 cells[i][j+step].n = cells[i][j].n;
    298                                 cells[i][j+step].index = cells[i][j].index;
    299                                 cells[i][j].n = 0;
    300                                 cells[i][j].index = 0;
    301                                 if(!conFlg){
    302                                     j++;
    303                                 }
    304                             }
    305                         }
    306                         if(conFlg){
    307                             j=cells[i].length-2+1;
    308                         }
    309                         conFlg=false;
    310                         step = 1;
    311                     }
    312                 }
    313                 break;
    314         }
    315         for(var i=0;i<cells.length;i++){
    316             for(var j=0;j<cells[i].length;j++){
    317                 cells[i][j].hbFlg =false;
    318             }
    319         }
    320         scoreTotal += scoreToAdd;
    321         scoreShow = "得分:"+scoreTotal;
    322         genNum(false);
    323         if(doJudge()=="t"){
    324             scoreShow = "恭喜你赢了!";
    325         }else if(doJudge()=="f"){
    326             scoreShow = "你输了!";
    327             btn_start.style.display="inline";
    328         }
    329         doDrawCanvas();
    330     }
    331     function addScroe(scoreToAdd){
    332     }
    333     function getZeroLst(){
    334         cellZeroLst = [];
    335         for(var i=0;i<cells.length;i++){
    336             for(var j=0;j<cells[i].length;j++){
    337                 if(cells[i][j].n==0)
    338                     cellZeroLst.push(cells[i][j]);
    339                     //cellZeroLst.push(i*cells.length+j);
    340             }
    341         }
    342         /*for(var h=0;h<cellZeroLst.length;h++){
    343             //var i= Math.round(cellZeroLst[h]/cells.length);
    344             //var j= cellZeroLst[h]%cells.length;
    345             //cells[i][j].n=2048;
    346             //cells[i][j].index=11;
    347             cellZeroLst[h].index=11;
    348             cellZeroLst[h].n = 2048;
    349         }*/
    350         //doDrawCells();
    351     }
    352     function doDrawCanvas(){
    353         caCt.fillStyle = "white";
    354         caCt.fillRect(0,0,caW,caH);
    355         doDrawWords();
    356         doDrawBorders();
    357         doDrawCells();
    358 //getZeroLst();
    359     }
    360     function doDrawCells(){
    361         for(var i=0;i<cells.length;i++){
    362             for(var j=0;j<cells[i].length;j++){
    363                 caCt.fillStyle = bgCLst[cells[i][j].index];
    364                 if(cells[i][j].newFlg){
    365                     caCt.fillStyle = "yellow";
    366                 }
    367                 caCt.fillRect(cellBL + cellW * j +0.5,cellBT + cellH * i +0.5,cellW-1,cellH-1);
    368                 caCt.fillStyle = fontCLst[cells[i][j].index];
    369                 if(cells[i][j].newFlg){
    370                     caCt.fillStyle = "red";
    371                 }
    372                 caCt.font=cells[i][j].fontSize + "px Arial";
    373                 caCt.textAlign="center";
    374                 caCt.textBaseline="middle";
    375                 caCt.fillText(cells[i][j].n,cellBL + cellW * j + cellW*0.5,cellBT + cellH * i + cellH*0.5);
    376             }
    377         }
    378     }
    379     function doDrawBorders(){
    380         var cellBTop = caH - cellW * 4;
    381         caCt.strokeStyle = borderC;
    382         //caCt.strokeRect(cellBL-0.5,cellBT-0.5,cellW * 4,cellH * 4);
    383         for(var i =0;i<=4;i++){
    384             //console.log(cellBT + cellH * i-0.5);
    385             caCt.moveTo(cellBL-0.5,cellBT + cellH * i-(i==0?0.5:0.5));
    386             caCt.lineTo(cellBL + cellW * 4 -0.5,cellBT + cellH * i-(i==0?0.5:0.5));
    387             caCt.stroke();
    388             caCt.moveTo(cellBL + cellW * i-(i==0?0.5:0.5),cellBT-0.5);
    389             caCt.lineTo(cellBL + cellW * i-(i==0?0.5:0.5),cellBT + cellH * 4 -0.5);
    390             caCt.stroke();
    391         }
    392     }
    393     function doDrawWords(){
    394         caCt.fillStyle = "black";
    395         if(scoreShow == "恭喜你赢了!"){
    396             caCt.fillStyle = "red";
    397         }
    398         else if(scoreShow == "你输了!"){
    399             caCt.fillStyle = "green";
    400         }
    401         caCt.font= ((caH>caW)?(wordT * 0.7):13) +"px Arial";
    402         caCt.textAlign="center";
    403         caCt.textBaseline="middle";
    404         caCt.fillText(scoreShow,wordL,wordT);
    405     }
    406     function reStart(){
    407         cells=[];
    408         /********init size of canvas and other vars**********/
    409         doResize();
    410         /*******init cell data************/
    411         initDate();
    412         /******init not zero data*********/
    413         genNum(false);
    414         genNum(false);
    415         /********bound the event such as keyenvet and suggestionEvent***********/
    416         BindEvent();
    417         /********draw canvas**************/
    418         doDrawCanvas();
    419         btn_start.style.display="none";
    420     }
    421     function initDate(){
    422         for(var i = 0;i<4;i++){
    423             var tmpCell = [];
    424             for(var j = 0;j<4;j++){
    425                 /*if(i==0 && j==0){
    426                     tmpCell.push(new cell(cellW * 0.4,0,0));
    427                 }else{
    428                     tmpCell.push(new cell(cellW * 0.4,Math.pow(2,(4*i+j)),(4*i+j)));
    429                 }*/
    430                 tmpCell.push(new cell(cellW * 0.4,0,0));
    431             }
    432             cells.push(tmpCell);
    433         }
    434         //console.log(cells);
    435     }
    436     function doJudge(){
    437         getZeroLst();
    438         if(cellZeroLst.length==0){
    439             var goOn = false;
    440             for(var i=0;i<cells.length;i++){
    441                 if(goOn){break;}
    442                 for(var j=0;j<cells[i].length;j++){
    443                     if((j>0 && cells[i][j].n==cells[i][j-1].n) || (j< cells[i].length-1 && cells[i][j].n==cells[i][j+1].n)){
    444                         goOn = true;
    445                         break;
    446                     }
    447                     if((i>0 && cells[i][j].n==cells[i-1][j].n) || (i< cells[j].length-1 && cells[i][j].n==cells[i+1][j].n)){
    448                         goOn = true;
    449                         break;
    450                     }
    451                 }
    452             }
    453             if(!goOn)
    454                 return "f";
    455         }else{
    456             for(var i=0;i<cells.length;i++){
    457                 for(var j=0;j<cells[i].length;j++){
    458                     if(cells[i][j].n == 2048){
    459                         return "t";
    460                     }
    461                 }
    462             }
    463         }
    464         return "g";
    465     }
    466     function genNum(only2){
    467         getZeroLst();
    468         if(cellZeroLst.length>0){
    469             var i = Math.round(Math.random()*(cellZeroLst.length-1));
    470             var number = 2;
    471             var index = 1;
    472             if(!only2){
    473                 if(Math.random()>0.8){
    474                     number = 4;
    475                     index = 2;
    476                 }
    477             }
    478             cellZeroLst[i].n=number;
    479             cellZeroLst[i].index=index;
    480             cellZeroLst[i].newFlg=true;
    481         }
    482     }
    483     var v = navigator.userAgent.toLowerCase().indexOf("android") != -1 || navigator.userAgent.toLowerCase().indexOf("iphone") != -1 || navigator.userAgent.toLowerCase().indexOf("ipad") != -1,
    484     caW = window.innerWidth,
    485     caH = window.innerHeight,
    486     btn_start = document.getElementById("btn_start"),
    487     caObj = document.getElementById("GameWorld"),
    488     caCt = caObj.getContext("2d"),
    489     cells = [],
    490     cellW = 0,
    491     cellH = 0,
    492     cellBT = 0,
    493     cellBL = 0,
    494     wordT = 0,
    495     wordL = 0,
    496     pageXs = 0,
    497     pageYs = 0,
    498     pageXe = 0,
    499     pageYe = 0,
    500     cellZeroLst = [],
    501     scoreTotal = 0,
    502     scoreShow = "滑动屏幕开始游戏",
    503     borderC = "blue",
    504     numLst = [0,2,4,8,16,32,64,128,256,512,1024,2048],
    505     bgCLst = ["white","gray","lightblue","lightgreen","#d3a4ff","#ffa6ff","#6A6AFF","#FFA042","#AD5A5A","orange","#6C3365","red"],
    506     fontCLst = ["white","white","white","white","white","white","white","white","black","black","white","white"];
    507     this.init = function(){
    508         /********init size of canvas and other vars**********/
    509         doResize();
    510         /*******init cell data************/
    511         initDate();
    512         /******init not zero data*********/
    513         genNum(false);
    514         genNum(false);
    515         /********bound the event such as keyenvet and suggestionEvent***********/
    516         BindEvent();
    517         /********draw canvas**************/
    518         doDrawCanvas();
    519     }
    520     
    521 }
    522 
    523 function cell(fontSize,n,index){
    524     this.c = "lightBlue";
    525     this.n = n!=null?n:0; // 指数
    526     this.fontSize = fontSize;
    527     this.isCaled = false;
    528     this.index = index;
    529     this.hbFlg = false;
    530     this.newFlg = false;
    531 }
    532 
    533 onload = function(){
    534     gameWorld.init();
    535 }

    CSDN下载

    http://download.csdn.net/detail/wangxsh42/7675671

  • 相关阅读:
    bootstrap 学习笔记
    js 学习笔记 -- webpack 简介
    js 学习笔记 -- webapi
    js 学习笔记 -- js基础知识
    css学习笔记二--IFC
    css 学习笔记一
    vim学习笔记
    Linux 网络命令
    Java中循环冗余校验(CRC32)的实现
    Tomcat8启动报there was insufficient free space available after evicting expired cache entries
  • 原文地址:https://www.cnblogs.com/wangxinsheng/p/3867392.html
Copyright © 2011-2022 走看看