连连看的原生JS实现V2

对上一次的连连看程序进行了一点修改:

   1 var llk = function () {
   2             this.ReStart();
   3         }
   4         llk.prototype = {
   5             Init: function () {
   6                 //初始化游戏界面
   7                 for (var i = 0; i < 5; i++) {
   8                     this.Data.sort(function () { return 0.5 - Math.random() });
   9                 }
  10                 for (var i = 0; i < 140; i++) {
  11                     var shucai = this.Images[i];
  12                     shucai.className = this.className;
  13                     if(this.Data[i]!==null && this.Data[i]!=undefined){
  14                         shucai.innerText = this.Data[i];
  15                     }else{
  16                         this.removeItem(shucai);
  17                     }
  18                 }
  19                 this.showLevel();
  20                 this.showLife();
  21                 this.Start();
  22
  23
  24                 if (!this.HasNext()) {
  25                     if (!this.decreaseLife()) {
  26                         return;
  27                     }
  28                     this.Init();
  29                 }
  30             },
  31             InitData: function () {//随机生成游戏数据
  32                 if(this.leaveCount ==0 ){
  33                     var Data = [];
  34                     var level = Math.min(this.currentLevel - 1, 5);
  35                     for (var i = 0; i < 70; i++) {
  36                         var _d = Math.round(Math.random() * (10+level));
  37                         Data.push(_d);
  38                         Data.push(_d);
  39                     }
  40                     this.Data = Data;
  41                     this.leaveCount =140;
  42                 }
  43             },
  44             Select: function (item) {
  45                 //点击元素,选择元素
  46                 if (this.isRemoved(item))
  47                     return;
  48                 var from = this.getFrom();
  49                 if (from == null) {
  50
  51                     this.UnselectAll();
  52
  53                     this.setFrom(item);
  54                     //shucai.className = this.selectClassName;
  55
  56                 } else if (from.target == item) {
  57                     return;
  58                 }
  59                 else {
  60                     this.setTo(item);
  61                     this.Check();
  62                 }
  63             },
  64             clearFrom: function () {//清楚起始点
  65                 var from = this.getFrom();
  66                 if (from!=null) {
  67                     this.removeClassName(from.target, this.selectClassName);
  68                 }
  69                 this.From = null;
  70                 if (this.To != null) {
  71                     this.From = this.To;
  72                     this.To = null;
  73                 }
  74             },
  75             clearTo: function () {//清楚终止点
  76                 if (this.To != null) {
  77                     this.removeClassName(this.To.target, this.selectClassName);
  78                 }
  79                 this.To = null;
  80             },
  81             getFrom: function () { return this.From;},
  82             setFrom: function (item) {
  83                 this.From = this.Parse(item);
  84                 this.addClassName(item, this.selectClassName);
  85             },
  86             getTo: function () { return this.To;},
  87             setTo: function (item) {
  88                 this.To = this.Parse(item);
  89                 this.addClassName(item, this.selectClassName);
  90             },
  91             getItem: function (x, y) {
  92                 if(y == null||y == undefined){
  93                     return this.Images[x];
  94                 }else{
  95                     return this.Images[y*14+x];
  96                 }
  97             },
  98             addClassName: function (item, className) {
  99                 if (!this.hasClassName(item, className)) {
 100                     item.className = item.className + " " + className;
 101                 }
 102             },
 103             hasClassName: function (item, className) {
 104                 if (item.className.indexOf(className) > -1) {
 105                     return true;
 106                 }
 107                 return false;
 108             },
 109             removeClassName: function (item, className) {
 110                 if (this.hasClassName(item, className)) {
 111                     var _class = item.className.split(‘ ‘);
 112                     item.className = "";
 113                     for (var i = 0; i < _class.length; i++) {
 114                         if (_class[i] != className) {
 115                             item.className += _class[i] + " ";
 116                         }
 117                     }
 118                 }
 119             },
 120             isRemovedByXY: function (x, y) {
 121                 return this.isRemoved(this.getItem(x,y));
 122             },
 123             isRemoved: function (item) {
 124                 return this.hasClassName(item, this.removedClassName);
 125             },
 126             removeItem: function (item) {
 127                 item.innerHTML = "&nbsp;";
 128                 this.addClassName(item, this.removedClassName);
 129             },
 130             UnselectAll: function () {
 131                 var select = document.getElementsByClassName(this.selectClassName);
 132                 for (var i = select.length - 1; i >= 0; i--) {
 133                     this.removeClassName(select[i], this.selectClassName);
 134                 }
 135             },
 136             Unselect: function (index) {
 137                 this.removeClassName(this.Images[index], this.selectClassName);
 138
 139                 this.From = null;
 140                 if(this.To!=null){
 141                     this.Select(this.To);
 142                 }
 143                 this.To = null;
 144             },
 145             Check: function () {
 146                 if (this.CheckType() && this.CheckPath()) {
 147                     var from = this.getFrom();
 148                     var to = this.getTo();
 149                     this.clearTo();
 150                     this.clearFrom();
 151                     this.Remove(from, to);
 152                 } else {
 153                     this.clearFrom();
 154                 }
 155             },
 156             CheckType: function (fIndex, tIndex) {
 157                 //检查选择的两个 点数据类型是否一致
 158                 if (fIndex != null && tIndex != null) {
 159                     if (this.Data[fIndex] != this.Data[tIndex]) {
 160                         return false;
 161                     }
 162                 } else {
 163                     var from = this.getFrom(),
 164                         to = this.getTo();
 165
 166                     if (this.Data[from.index] != this.Data[to.index]) {
 167                         return false;
 168                     }
 169                 }
 170                 return true;
 171             },
 172             isBeside: function (p1, p2) {//相邻
 173                 if ((p1.x == p2.x && Math.abs(p1.y - p2.y) == 1) ||
 174                     (p1.y == p2.y && Math.abs(p1.x - p2.x) == 1)) {
 175                     this.addPath(p2);
 176                     return true;
 177                 }
 178                 return false;
 179             },
 180             isLine: function (from, to) {
 181                 //检查两个点是否直线相连
 182                 var flag = true;
 183                 if (from.x == to.x) {
 184                     for (var i = Math.min(from.y, to.y) + 1 ; i < Math.max(from.y, to.y) ; i++) {
 185                         if (!this.isRemovedByXY(from.x, i)) {
 186                             flag = false;
 187                             break;
 188                         }
 189                     }
 190                 } else {
 191                     for (var i = Math.min(from.x, to.x) + 1 ; i < Math.max(from.x, to.x) ; i++) {
 192                         if (!this.isRemovedByXY(i, from.y)) {
 193                             flag = false;
 194                             break;
 195                         }
 196                     }
 197                 }
 198                 return flag;
 199             },
 200             isBorder: function (p1, p2) {//邻边
 201                 if (0 == p1.x && 0 == p2.x) {
 202                     this.addPath([{ x: -1, y: p1.y }, { x: -1, y: p2.y },p2]);
 203                     return true;
 204                 } else if (0 == p1.y && 0 == p2.y) {
 205                     this.addPath([{ x: p1.x, y: -1 }, { x: p2.x, y: -1 },p2]);
 206                     return true;
 207                 } else if (13 == p1.x && 13 == p2.x) {
 208                     this.addPath([{ x: 14, y: p1.y }, { x: 14, y: p2.y },p2]);
 209                     return true;
 210                 } else if (9 == p1.y && 9 == p2.y) {
 211                     this.addPath([{ x: p1.x, y: 10 }, { x: p2.x, y: 10 },p2]);
 212                     return true;
 213                 }
 214                 return false;
 215             },
 216             isCross: function (p1, p2) {//对角相邻
 217                 if (this.isRemovedByXY(p1.x,p2.y)) {
 218                     this.addPath([{ x: p1.x, y: p2.y },p2]);
 219                     return true;
 220                 }
 221                 else if (this.isRemovedByXY(p2.x,p1.y)) {
 222                     this.addPath([{ x: p2.x, y: p1.y },p2]);
 223                     return true;
 224                 }
 225                 return false;
 226             },
 227             isHasPath: function (from, to) {
 228                 //从两点之间连接
 229                 var flag = true;
 230
 231                 //矩形边相通
 232                 if (this.isRemovedByXY(from.x, to.y)) {
 233                     if (this.isLine(from, { x: from.x, y: to.y })
 234                         && this.isLine({ x: from.x, y: to.y }, to)) {
 235                         this.addPath([{ x: from.x, y: to.y },to]);
 236                         return true;
 237                     }
 238                 } else if (this.isRemovedByXY(to.x, from.y)) {
 239                     if (this.isLine(from, { x: to.x, y: from.y })
 240                         && this.isLine({ x: to.x, y: from.y }, to)) {
 241                         this.addPath([{ x: to.x, y: from.y }, to]);
 242                         return true;
 243                     }
 244                 } else {
 245                     flag = false;
 246                 }
 247
 248                 var maxX = Math.max(from.x, to.x), minX = Math.min(from.x, to.x),
 249                     maxY = Math.max(from.y, to.y), minY = Math.min(from.y, to.y);
 250
 251
 252                 var y = from.x == minX ? from.y : to.y;
 253                 for (var x = minX + 1; x <= maxX; x++) {
 254                     flag = true;
 255                     if (!this.isRemovedByXY(x, y)) {
 256                         flag = false;
 257                         break;
 258                     }
 259
 260                     var p1 = { x: x, y: y }, p2 = { x: x, y: y == minY ? maxY : minY };
 261                     if (!this.isRemovedByXY(p2.x, p2.y)) {
 262                         flag = false;
 263                         continue;
 264                     }
 265                     if (this.isLine(p1, p2)
 266                         && this.isLine(p2, { x: maxX, y: p2.y })) {
 267                         this.addPath([p1,p2]);
 268                         flag = true;
 269                         break;
 270                     } else {
 271                         flag = false;
 272                     }
 273                 }
 274
 275                 if (!flag) {
 276                     var x = from.y == minY ? from.x : to.x;
 277
 278                     for (var y = minY + 1; y <= maxY; y++) {
 279                         flag = true;
 280                         if (!this.isRemovedByXY(x, y)) {
 281                             flag = false;
 282                             break;
 283                         }
 284
 285                         var p1 = { x: x, y: y }, p2 = { x: x == minX ? maxX : minX, y: y };
 286                         if (!this.isRemovedByXY(p2.x, p2.y)) {
 287                             flag = false;
 288                             continue;
 289                         }
 290                         if (this.isLine(p1, p2) && this.isLine(p2, { x: p2.x, y: maxY })) {
 291                             this.addPath([p1,p2]);
 292                             flag = true;
 293                             break;
 294                         } else {
 295                             flag = false;
 296                         }
 297                     }
 298                 }
 299
 300                 if (flag) {
 301                     this.addPath(to);
 302                     return true;
 303                 }
 304
 305                 //从左边往回连接
 306                 flag = true;
 307                 var y = from.x == minX ? from.y : to.y;
 308                 for (var x = minX - 1; x >= -1; x--) {
 309                     if (x == -1) {
 310                         var p2 = { x: 0, y: y == minY ? maxY : minY };
 311
 312                         if (!this.isRemovedByXY(p2.x, p2.y)) {
 313                             flag = false;
 314                             break;
 315                         }
 316
 317                         flag = this.isLine(p2, { x: maxX, y: p2.y });
 318
 319                         if (flag) {
 320                             this.addPath([{ x: -1, y: from.y }, { x: -1, y: to.y }]);
 321                         }
 322
 323                         break;
 324                     }
 325                     flag = true;
 326
 327                     if (this.isRemovedByXY(x, minY) && this.isRemovedByXY(x, maxY)) {
 328                     } else {
 329                         flag = false;
 330                         break;
 331                     }
 332
 333                     var p1 = { x: x, y: y }, p2 = { x: x, y: y == minY ? maxY : minY };
 334                     if (!this.isRemovedByXY(p2.x, p2.y)) {
 335                         flag = false;
 336                         continue;
 337                     }
 338                     if (this.isLine(p1, p2) && this.isLine(p2, { x: maxX, y: p2.y })) {
 339                         this.addPath([p1,p2]);
 340                         flag = true;
 341                         break;
 342                     } else {
 343                         flag = false;
 344                     }
 345                 }
 346                 if (flag) {
 347                     this.addPath(to);
 348                     return true;
 349                 }
 350
 351
 352                 //从右边连接
 353                 flag = true;
 354                 var y = from.x == maxX ? from.y : to.y;
 355                 for (var x = maxX + 1; x <= 14; x++) {
 356                     if (x == 14) {
 357                         var p2 = { x: 13, y: y == minY ? maxY : minY };
 358                         if (!this.isRemovedByXY(p2.x, p2.y)) {
 359                             flag = false;
 360                             break;
 361                         }
 362                         flag = this.isLine(p2, { x: minX, y: p2.y });
 363                         if (flag) {
 364                             this.addPath([{ x: x, y: from.y }, { x: x, y: to.y }]);
 365                         }
 366                         break;
 367                     }
 368                     flag = true;
 369
 370                     if (this.isRemovedByXY(x, minY) && this.isRemovedByXY(x, maxY)) {
 371                     } else {
 372                         flag = false;
 373                         break;
 374                     }
 375                     var p1 = { x: x, y: y }, p2 = { x: x, y: y == minY ? maxY : minY };
 376                     if (!this.isRemovedByXY(p2.x, p2.y)) {
 377                         flag = false;
 378                         continue;
 379                     }
 380                     if (this.isLine(p1, p2) && this.isLine(p2, { x: minX, y: p2.y })) {
 381                         this.addPath([p1,p2]);
 382                         flag = true;
 383                         break;
 384                     } else {
 385                         flag = false;
 386                     }
 387
 388                 }
 389                 if (flag) {
 390                     this.addPath(to);
 391                     return true;
 392                 }
 393
 394
 395                 //从上边连接
 396                 flag = true;
 397                 var x = from.y == minY ? from.x : to.x;
 398                 for (var y = minY - 1; y >= -1; y--) {
 399                     if (y == -1) {
 400                         var p2 = { x: x == minX ? maxX : minX, y: 0 };
 401                         if (!this.isRemovedByXY(p2.x, p2.y)) {
 402                             flag = false;
 403                             break;
 404                         }
 405                         flag = this.isLine(p2, { x: p2.x, y: maxY });
 406                         if (flag) {
 407                             this.addPath([{ x: from.x, y: y }, { x: to.x, y: y }]);
 408                         }
 409                         break;
 410                     }
 411                     flag = true;
 412
 413                     if (this.isRemovedByXY(minX, y) && this.isRemovedByXY(maxX, y)) {
 414                     } else {
 415                         flag = false;
 416                         break;
 417                     }
 418
 419                     var p1 = { x: x, y: y }, p2 = { x: x == minX ? maxX : minX, y: y };
 420                     if (!this.isRemovedByXY(p2.x, p2.y)) {
 421                         flag = false;
 422                         continue;
 423                     }
 424                     if (this.isLine(p1, p2) && this.isLine(p2, { x: p2.x, y: maxY })) {
 425                         this.addPath([p1,p2]);
 426                         flag = true;
 427                         break;
 428                     } else {
 429                         flag = false;
 430                     }
 431
 432                 }
 433                 if (flag) {
 434                     this.addPath(to);
 435                     return true;
 436                 }
 437
 438                 //从下边连接
 439                 flag = true;
 440                 var x = from.y == maxY ? from.x : to.x;
 441                 for (var y = maxY + 1; y <= 10; y++) {
 442                     if (y == 10) {
 443                         var p2 = { x: x == minX ? maxX : minX, y: 9 };
 444                         if (!this.isRemovedByXY(p2.x, p2.y)) {
 445                             flag = false;
 446                             break;
 447                         }
 448                         flag = this.isLine(p2, { x: p2.x, y: minY });
 449                         if (flag) {
 450                             this.addPath([{ x: from.x, y: y }, { x: to.x, y: y }]);
 451                         }
 452                         break;
 453                     }
 454                     flag = true;
 455
 456                     if (this.isRemovedByXY(minX, y) && this.isRemovedByXY(maxX, y)) {
 457                     } else {
 458                         flag = false;
 459                         break;
 460                     }
 461
 462                     var p1 = { x: x, y: y }, p2 = { x: x == minX ? maxX : minX, y: y };
 463                     if (!this.isRemovedByXY(p2.x, p2.y)) {
 464                         flag = false;
 465                         continue;
 466                     }
 467                     if (this.isLine(p1, p2) && this.isLine(p2, { x: p2.x, y: minY })) {
 468                         this.addPath([p1,p2]);
 469                         flag = true;
 470                         break;
 471                     } else {
 472                         flag = false;
 473                     }
 474                 }
 475                 if (flag) {
 476                     this.addPath(to);
 477                     return true;
 478                 }
 479                 return false;
 480             },
 481             CheckPath: function (fIndex,tIndex) {
 482                 var from , to ;
 483                 if (fIndex != null && tIndex != null) {
 484                     from = this.parseIndexToXY(fIndex);
 485                     to = this.parseIndexToXY(tIndex);
 486                 } else {
 487                     from = this.getFrom().pos;
 488                     to = this.getTo().pos;
 489                 }
 490
 491                 if (from == null || to == null)
 492                     return false;
 493
 494                 this.pointArray = [];
 495                 this.addPath(from);
 496                 //相邻
 497                 if (this.isBeside(from,to)) {
 498                     return true;
 499                 }
 500
 501                 //邻边
 502                 if(this.isBorder(from,to)){
 503                     return true;
 504                 }
 505
 506
 507                 // 相同行
 508                 if (from.y == to.y)
 509                 {
 510                     return this.CheckSameRow(from,to);
 511                 }
 512
 513                 //相同列
 514                 if (from.x == to.x)
 515                 {
 516                     return this.CheckSameColumns(from, to);
 517                 }
 518
 519
 520                 //对角相邻
 521                 if (Math.abs(from.x - to.x) == 1 && Math.abs(from.y - to.y) == 1)
 522                 {
 523                     if (this.isCross(from, to)) {
 524                         return true;
 525                     }
 526                     return false;
 527                 }
 528
 529                 //任意位置
 530                 return this.isHasPath(from, to);
 531             },
 532             CheckSameColumns: function (from, to) {
 533                 var flag = true;
 534                 //直线路径
 535                 flag = this.isLine(from, to);
 536                 if (!flag) {
 537                     flag = true;
 538                     //往左
 539                     var x = from.x - 1;
 540                     var _pf, _pt;
 541                     while (x >= -1) {
 542                         flag = true;
 543                         _pf = { x: x, y: from.y };
 544                         _pt = { x: x, y: to.y };
 545
 546                         if (x == -1) {
 547                             break;
 548                         }
 549
 550                         if (this.isRemovedByXY(_pf.x, _pf.y) && this.isRemovedByXY(_pt.x, _pt.y)) {
 551                             flag = this.isLine(_pf, _pt);
 552                         }
 553                         else {
 554                             flag = false;
 555                             break;
 556                         }
 557
 558                         if (flag)
 559                             break;
 560                         x--;
 561                     }
 562                     if (flag) {
 563                         this.addPath(_pf);
 564                         this.addPath(_pt);
 565                     }
 566                 }
 567
 568
 569                 if (!flag) {
 570                     flag = true;
 571                     //往下
 572                     var x = from.x + 1;
 573                     var _pf, _pt;
 574                     while (x <= 14) {
 575                         flag = true;
 576                         _pf = { x: x, y: from.y };
 577                         _pt = { x: x, y: to.y };
 578
 579                         if (x == 14) {
 580                             break;
 581                         }
 582
 583                         if (this.isRemovedByXY(_pf.x, _pf.y) && this.isRemovedByXY(_pt.x, _pt.y)) {
 584                             flag = this.isLine(_pf, _pt);
 585                         }
 586                         else {
 587                             flag = false;
 588                             break;
 589                         }
 590                         if (flag)
 591                             break;
 592                         x++;
 593                     }
 594                     if (flag) {
 595                         this.addPath(_pf);
 596                         this.addPath(_pt);
 597                     }
 598                 }
 599                 if (flag) {
 600                     this.addPath(to);
 601                 }
 602                 return flag;
 603             },
 604             CheckSameRow: function (from, to) {
 605                 var flag = true;
 606                 //直线路径
 607                 flag = this.isLine(from, to);
 608
 609                 if (!flag) {
 610                     flag = true;
 611                     //往上
 612                     var y = from.y - 1;
 613                     var _pf, _pt;
 614                     while (y >= -1) {
 615                         flag = true;
 616                         _pf = { x: from.x, y: y };
 617                         _pt = { x: to.x, y: y };
 618
 619                         if (y == -1) {
 620                             break;
 621                         }
 622
 623                         if (this.isRemovedByXY(_pf.x, _pf.y) && this.isRemovedByXY(_pt.x, _pt.y)) {
 624                             flag = this.isLine(_pf, _pt);
 625                         }
 626                         else {
 627                             flag = false;
 628                             break;
 629                         }
 630                         if (flag) {
 631                             break;
 632                         }
 633                         y--;
 634                     }
 635                     if (flag) {
 636                         this.addPath(_pf);
 637                         this.addPath(_pt);
 638                     }
 639                 }
 640
 641
 642                 if (!flag) {
 643                     flag = true;
 644                     //往下
 645                     var y = from.y + 1;
 646                     var _pf, _pt;
 647                     while (y <= 10) {
 648                         flag = true;
 649                         _pf = { x: from.x, y: y };
 650                         _pt = { x: to.x, y: y };
 651
 652                         if (y == 10) {
 653                             break;
 654                         }
 655
 656                         if (this.isRemovedByXY(_pf.x, _pf.y) && this.isRemovedByXY(_pt.x, _pt.y)) {
 657                             flag = this.isLine(_pf, _pt);
 658                         } else {
 659                             flag = false;
 660                             break;
 661                         }
 662                         if (flag)
 663                             break;
 664                         y++;
 665                     }
 666                     if (flag) {
 667                         this.addPath(_pf);
 668                         this.addPath(_pt);
 669                     }
 670                 }
 671
 672                 if (flag) {
 673                     this.addPath(to);
 674                 }
 675                 return flag;
 676             },
 677             Parse: function (item) {
 678                 return { index: item.id, target: item, pos: this.parseIndexToXY(item.id) };
 679             },
 680             parseIndexToXY: function (index) {
 681                 var y = Math.floor(index / 14);
 682                 var x = index % 14;
 683                 return { x: x, y: y };
 684             },
 685             getHasPath: function () {
 686                 var flag = false;
 687                 var i = 0, j = 0;
 688                 if (this.leaveCount > 0) {
 689                     for (; i < 140 - 1; i++) {
 690                         if (this.Data[i] != null) {
 691                             for (j = i + 1; j < 140; j++) {
 692                                 if (this.Data[j] != null) {
 693                                     if (this.CheckType(i, j)) {
 694                                         if (this.CheckPath(i, j)) {
 695                                             flag = true;
 696                                             break;
 697                                         }
 698                                     }
 699                                 }
 700                             }
 701
 702                             if (flag)
 703                                 break;
 704                         }
 705                     }
 706                 }
 707
 708                 if (flag)
 709                     return {from:i,to:j};
 710                 return null;
 711             },
 712             Clue: function () {
 713                 //提示可消除的两个点
 714                 this.clearTo();
 715                 this.clearFrom();
 716
 717                 var next = this.getHasPath();
 718
 719                 if (next!=null) {
 720                     if (!this.decreaseLife())
 721                         return;
 722                     var pos = this.parseIndexToXY(next.from);
 723                     var item = this.getItem(pos.x, pos.y);
 724                     this.addClassName(item, this.selectClassName);
 725
 726                     var pos = this.parseIndexToXY(next.to);
 727                     var item = this.getItem(pos.x, pos.y);
 728                     this.addClassName(item, this.selectClassName);
 729                 }
 730             },
 731             HasNext: function () {
 732                 //检查是否存在可消除的两个 点
 733                 return this.getHasPath() != null;
 734             },
 735             Remove: function (from, to) {
 736                 //消除元素
 737                 var lines = this.drawLine();
 738
 739                 var _this = this;
 740                 this.addTime();
 741
 742                 this.addScores();
 743
 744                 this.Data[from.index] = null;
 745                 this.Data[to.index] = null;
 746                 this.leaveCount -=2;
 747                 setTimeout(function () {
 748                     _this.removeItem(from.target);
 749                     _this.removeItem(to.target);
 750
 751                     for (var i = 0; i < lines.length; i++) {
 752                         document.body.removeChild(lines[i]);
 753                     }
 754
 755                     lines = null;
 756                     _this.Change();
 757                 }, 100);
 758             },
 759             Change: function () {
 760                 //关卡布局方法,比如左右分离,上下分离等
 761                 if (this.leaveCount == 0) {
 762                     this.NextLevel();
 763                     return;
 764                 }
 765
 766                 var leavel = this.currentLevel;
 767
 768                 if (leavel == 3) {//左右分离
 769                     for (var y = 0; y < 10; y++) {
 770                         for (var x = 0; x < 7; x++) {
 771                             var index = y * 14 + x;
 772                             if (this.Data[index] != null) {
 773                                 continue;
 774                             }
 775                             var flag = false;
 776                             for (var i = x + 1; i < 7; i++) {
 777                                 var _index = y * 14 + i;
 778                                 if (this.Data[_index] != null) {
 779                                     this.Data[index] = this.Data[_index];
 780                                     this.Data[_index] = null;
 781                                     flag = true;
 782                                     break;
 783                                 }
 784                             }
 785
 786                             if (!flag)
 787                                 break;
 788                         }
 789
 790                         for (var x = 13; x >= 7; x--) {
 791                             var index = y * 14 + x;
 792                             if (this.Data[index] != null) {
 793                                 continue;
 794                             }
 795                             var flag = false;
 796                             for (var i = x - 1; i >= 7; i--) {
 797                                 var _index = y * 14 + i;
 798                                 if (this.Data[_index] != null) {
 799                                     this.Data[index] = this.Data[_index];
 800                                     this.Data[_index] = null;
 801                                     flag = true;
 802                                     break;
 803                                 }
 804                             }
 805
 806                             if (!flag)
 807                                 break;
 808                         }
 809                     }
 810                 }
 811                 else if (leavel == 4) {//上下分离
 812                     for (var x = 0; x < 14; x++) {
 813                         for (var y = 0; y < 5; y++) {
 814                             var index = y * 14 + x;
 815                             if (this.Data[index] != null) {
 816                                 continue;
 817                             }
 818                             var flag = false;
 819                             for (var i = y + 1; i < 5; i++) {
 820                                 var _index = i * 14 + x;
 821                                 if (this.Data[_index] != null) {
 822                                     this.Data[index] = this.Data[_index];
 823                                     this.Data[_index] = null;
 824                                     flag = true;
 825                                     break;
 826                                 }
 827                             }
 828
 829                             if (!flag)
 830                                 break;
 831                         }
 832
 833                         for (var y = 9; y >= 5; y--) {
 834                             var index = y * 14 + x;
 835                             if (this.Data[index] != null) {
 836                                 continue;
 837                             }
 838                             var flag = false;
 839                             for (var i = y - 1; i >= 5; i--) {
 840                                 var _index = i * 14 + x;
 841                                 if (this.Data[_index] != null) {
 842                                     this.Data[index] = this.Data[_index];
 843                                     this.Data[_index] = null;
 844                                     flag = true;
 845                                     break;
 846                                 }
 847                             }
 848
 849                             if (!flag)
 850                                 break;
 851                         }
 852                     }
 853                 }
 854                 else if (leavel == 5) {//往左移
 855                     for (var y = 0; y < 10; y++) {
 856                         for (var x = 0; x < 14; x++) {
 857                             var index = y * 14 + x;
 858                             if (this.Data[index] != null) {
 859                                 continue;
 860                             }
 861                             var flag = false;
 862                             for (var i = x + 1; i < 14; i++) {
 863                                 var _index = y * 14 + i;
 864                                 if (this.Data[_index] != null) {
 865                                     this.Data[index] = this.Data[_index];
 866                                     this.Data[_index] = null;
 867                                     flag = true;
 868                                     break;
 869                                 }
 870                             }
 871
 872                             if (!flag)
 873                                 break;
 874                         }
 875                     }
 876                 }
 877                 else if (leavel == 6) {//向右移
 878                     for (var y = 0; y < 10; y++) {
 879                         for (var x = 13; x >= 0; x--) {
 880                             var index = y * 14 + x;
 881                             if (this.Data[index] != null) {
 882                                 continue;
 883                             }
 884                             var flag = false;
 885                             for (var i = x - 1; i >= 0; i--) {
 886                                 var _index = y * 14 + i;
 887                                 if (this.Data[_index] != null) {
 888                                     this.Data[index] = this.Data[_index];
 889                                     this.Data[_index] = null;
 890                                     flag = true;
 891                                     break;
 892                                 }
 893                             }
 894
 895                             if (!flag)
 896                                 break;
 897                         }
 898                     }
 899                 }
 900                 else if (leavel == 7) {//向下移
 901                     for (var x = 0; x < 14; x++) {
 902                         for (var y = 9; y >= 0; y--) {
 903                             var index = y * 14 + x;
 904                             if (this.Data[index] != null) {
 905                                 continue;
 906                             }
 907                             var flag = false;
 908                             for (var i = y - 1; i >= 0; i--) {
 909                                 var _index = i * 14 + x;
 910                                 if (this.Data[_index] != null) {
 911                                     this.Data[index] = this.Data[_index];
 912                                     this.Data[_index] = null;
 913                                     flag = true;
 914                                     break;
 915                                 }
 916                             }
 917
 918                             if (!flag)
 919                                 break;
 920                         }
 921                     }
 922                 }
 923                 else if (leavel == 8) {//向上移
 924                     for (var x = 0; x < 14; x++) {
 925                         for (var y = 0; y < 10; y++) {
 926                             var index = y * 14 + x;
 927                             if (this.Data[index] != null) {
 928                                 continue;
 929                             }
 930                             var flag = false;
 931                             for (var i = y + 1; i < 10; i++) {
 932                                 var _index = i * 14 + x;
 933                                 if (this.Data[_index] != null) {
 934                                     this.Data[index] = this.Data[_index];
 935                                     this.Data[_index] = null;
 936                                     flag = true;
 937                                     break;
 938                                 }
 939                             }
 940
 941                             if (!flag)
 942                                 break;
 943                         }
 944                     }
 945                 }
 946                 else if (leavel == 9) {//向内紧缩
 947                     for (var y = 5; y < 10; y++) {
 948                         for (var x = 7; x < 14; x++) {
 949                             var index = y * 14 + x;
 950                             if (this.Data[index] != null) {
 951                                 continue;
 952                             }
 953                             var flag = false;
 954                             for (var i = x + 1; i < 14; i++) {
 955                                 var _index = y * 14 + i;
 956                                 if (this.Data[_index] != null) {
 957                                     this.Data[index] = this.Data[_index];
 958                                     this.Data[_index] = null;
 959                                     flag = true;
 960                                     break;
 961                                 }
 962                             }
 963
 964                             if (!flag)
 965                                 break;
 966                         }
 967
 968                         for (var x = 6; x >= 0; x--) {
 969                             var index = y * 14 + x;
 970                             if (this.Data[index] != null) {
 971                                 continue;
 972                             }
 973                             var flag = false;
 974                             for (var i = x - 1; i >= 0; i--) {
 975                                 var _index = y * 14 + i;
 976                                 if (this.Data[_index] != null) {
 977                                     this.Data[index] = this.Data[_index];
 978                                     this.Data[_index] = null;
 979                                     flag = true;
 980                                     break;
 981                                 }
 982                             }
 983
 984                             if (!flag)
 985                                 break;
 986                         }
 987                     }
 988
 989                     for (var y = 4; y > 0; y--) {
 990                         for (var x = 7; x < 14; x++) {
 991                             var index = y * 14 + x;
 992                             if (this.Data[index] != null) {
 993                                 continue;
 994                             }
 995                             var flag = false;
 996                             for (var i = x + 1; i < 14; i++) {
 997                                 var _index = y * 14 + i;
 998                                 if (this.Data[_index] != null) {
 999                                     this.Data[index] = this.Data[_index];
1000                                     this.Data[_index] = null;
1001                                     flag = true;
1002                                     break;
1003                                 }
1004                             }
1005
1006                             if (!flag)
1007                                 break;
1008                         }
1009
1010                         for (var x = 6; x >= 0; x--) {
1011                             var index = y * 14 + x;
1012                             if (this.Data[index] != null) {
1013                                 continue;
1014                             }
1015                             var flag = false;
1016                             for (var i = x - 1; i >= 0; i--) {
1017                                 var _index = y * 14 + i;
1018                                 if (this.Data[_index] != null) {
1019                                     this.Data[index] = this.Data[_index];
1020                                     this.Data[_index] = null;
1021                                     flag = true;
1022                                     break;
1023                                 }
1024                             }
1025
1026                             if (!flag)
1027                                 break;
1028                         }
1029                     }
1030
1031                     for (var x = 0; x < 7; x++) {
1032                         for (var y = 5; y < 10; y++) {
1033                             var index = y * 14 + x;
1034                             if (this.Data[index] != null) {
1035                                 continue;
1036                             }
1037                             var flag = false;
1038                             for (var i = y + 1; i < 10; i++) {
1039                                 var _index = i * 14 + x;
1040                                 if (this.Data[_index] != null) {
1041                                     this.Data[index] = this.Data[_index];
1042                                     this.Data[_index] = null;
1043                                     flag = true;
1044                                     break;
1045                                 }
1046                             }
1047
1048                             if (!flag)
1049                                 break;
1050                         }
1051
1052                         for (var y = 4; y >= 0; y--) {
1053                             var index = y * 14 + x;
1054                             if (this.Data[index] != null) {
1055                                 continue;
1056                             }
1057                             var flag = false;
1058                             for (var i = y - 1; i >= 0; i--) {
1059                                 var _index = i * 14 + x;
1060                                 if (this.Data[_index] != null) {
1061                                     this.Data[index] = this.Data[_index];
1062                                     this.Data[_index] = null;
1063                                     flag = true;
1064                                     break;
1065                                 }
1066                             }
1067
1068                             if (!flag)
1069                                 break;
1070                         }
1071                     }
1072
1073                     for (var x = 7; x < 14; x++) {
1074                         for (var y = 5; y < 10; y++) {
1075                             var index = y * 14 + x;
1076                             if (this.Data[index] != null) {
1077                                 continue;
1078                             }
1079                             var flag = false;
1080                             for (var i = y + 1; i < 10; i++) {
1081                                 var _index = i * 14 + x;
1082                                 if (this.Data[_index] != null) {
1083                                     this.Data[index] = this.Data[_index];
1084                                     this.Data[_index] = null;
1085                                     flag = true;
1086                                     break;
1087                                 }
1088                             }
1089
1090                             if (!flag)
1091                                 break;
1092                         }
1093
1094                         for (var y = 4; y >= 0; y--) {
1095                             var index = y * 14 + x;
1096                             if (this.Data[index] != null) {
1097                                 continue;
1098                             }
1099                             var flag = false;
1100                             for (var i = y - 1; i >= 0; i--) {
1101                                 var _index = i * 14 + x;
1102                                 if (this.Data[_index] != null) {
1103                                     this.Data[index] = this.Data[_index];
1104                                     this.Data[_index] = null;
1105                                     flag = true;
1106                                     break;
1107                                 }
1108                             }
1109
1110                             if (!flag)
1111                                 break;
1112                         }
1113                     }
1114                 }
1115                 for (var i = 0; i < 140; i++) {
1116                     var shucai = this.getItem(i);
1117                     shucai.className = this.className;
1118                     if (this.Data[i] !== null && this.Data[i] != undefined) {
1119                         shucai.innerText = this.Data[i];
1120                     } else {
1121                         this.removeItem(shucai);
1122                     }
1123                 }
1124
1125                 if (!this.HasNext()) {
1126                     if (!this.decreaseLife()) {
1127                         return;
1128                     }
1129                     this.Init();
1130                 }
1131             },
1132             NextLevel: function () {
1133                 //下一关
1134                 this.addLife();
1135                 this.currentLevel++;
1136                 if (this.currentLevel > this.maxLevel) {
1137                     this.Stop();
1138                 } else {
1139                     this.InitData();
1140                     this.Init();
1141                 }
1142             },
1143             Start: function () {
1144                 //开始游戏
1145                 if (this.time == null || this.time == undefined) {
1146                     this.timeout = this.getTime();
1147                     this.showTime();
1148
1149                     this.TimeStart();
1150                 }
1151             },
1152             ReStart: function () {//游戏重新开始
1153                 for (var i in this.setting) {
1154                     this[i] = this.setting[i];
1155                 }
1156
1157                 var container = document.getElementById("Container");
1158                 container.innerHTML = "";
1159                 var _this = this;
1160                 var Images = [];
1161                 //生成游戏主要点,共14列*10行
1162                 for (var i = 0; i < 140; i++) {
1163                     var shucai = document.createElement("div");
1164                     shucai.className = this.className;
1165                     shucai.innerText = i;
1166                     shucai.id = i;
1167                     shucai.onclick = function () {
1168                         _this.Select(this);
1169                     }
1170                     container.appendChild(shucai);
1171
1172                     Images.push(shucai);
1173                 }
1174                 //保存游戏中元素数据的数组
1175                 this.Data = [];
1176                 //保存两点间折线的顶点坐标数组
1177                 this.pointArray = [];
1178                 //消除的起始点
1179                 this.From = null;
1180                 //结束点
1181                 this.To = null;
1182                 //保存显示的元素数据
1183                 this.Images = Images;
1184                 //剩余可消除数量
1185                 this.leaveCount = 0;
1186                 this.showScores();
1187                 //随机生成游戏数据this.Data
1188                 this.InitData();
1189                 //初始化游戏,把数据随机显示在游戏界面
1190                 this.Init();
1191             },
1192             TimeStart: function () {//游戏时间开始
1193                 var _this = this;
1194                 this.time = setTimeout(function () {
1195                     _this.timeout--;
1196                     _this.showTime();
1197                     if (_this.timeout <= 0) {
1198                         _this.Over();
1199                     }
1200                     else {
1201                         _this.TimeStart();
1202                     }
1203                 }, 1000);
1204             },
1205             TimeStop: function () {//游戏时间暂停,开始
1206                 if (this.time != null) {
1207                     clearTimeout(this.time);
1208                     this.time = null;
1209
1210                     var div = document.createElement("div");
1211                     div.className = "Pause";
1212                     div.innerText = "暂停游戏";
1213                     document.body.appendChild(div);
1214                 } else {
1215                     this.TimeStart();
1216
1217                     var div = document.getElementsByClassName("Pause");
1218                     if (div) {
1219                         document.body.removeChild(div[0]);
1220                     }
1221                 }
1222             },
1223             Stop: function () {//通关游戏
1224                 alert("恭喜你通关了游戏!");
1225                 var container = document.getElementById("Container");
1226                 container.innerHTML = "";
1227                 container.innerText = "恭喜你通关了游戏!";
1228             },
1229             Over: function () {//游戏结束
1230                 if (this.time != null) {
1231                     clearTimeout(this.time);
1232                     this.time = null;
1233                 }
1234                 alert("游戏结束了!");
1235                 var container = document.getElementById("Container");
1236                 container.innerHTML = "";
1237                 container.innerText = "游戏结束了!";
1238             },
1239             addPath: function (pt) {//增加消除两点之间的拆线的顶点坐标
1240                 if (Object.prototype.toString.call(pt) === ‘[object Array]‘) {
1241                     for (var i = 0; i < pt.length; i++) {
1242                         this.pointArray.push(pt[i]);
1243                     }
1244                 } else {
1245                     this.pointArray.push(pt);
1246                 }
1247             },
1248             drawLine: function () {//画轨迹
1249                 var points = this.pointArray;
1250                 if(points.length ==4){
1251                     if(points[1].x!==points[0].x && points[1].y!=points[0].y){
1252                         var temp = points[1];
1253                         points[1]=points[2];
1254                         points[2] = temp;
1255                     }
1256                 }
1257                 var lines = [];
1258                 for (var i = 0; i < points.length - 1; i++) {
1259                     lines.push(this.draw(points[i], points[i + 1]));
1260                 }
1261                 return lines;
1262             },
1263             draw: function (from, to) {//画消除时,两个元素之间的连线轨迹
1264                 //同列
1265                 var div = document.createElement("div");
1266                 div.className = "line";
1267                 if (from.x == to.x)
1268                 {
1269                     var minY = Math.min(from.y, to.y),
1270                         maxY = Math.max(from.y, to.y);
1271
1272                     div.style.width = "2px";
1273
1274                     div.style.height = ((maxY - minY) * (30+2) +2) + "px";
1275                         div.style.top = (100 + (30 +2) * minY + 15) + "px";
1276                         div.style.left = (115 + (30 +2) * from.x) + "px";
1277
1278                     //this.lines.push(div);
1279
1280                 }
1281                     //同行
1282                 else if (from.y == to.y)
1283                 {
1284                     var minX = Math.min(from.x, to.x),
1285                         maxX = Math.max(from.x, to.x);
1286
1287                     div.style.height = "2px";
1288
1289                     div.style.width = ((maxX - minX ) * (30+2) +2) + "px";
1290                         div.style.left = (100 + (30+2) * minX +15) + "px";
1291                         div.style.top = (100 + 15 + (30+2) * from.y) + "px";
1292                     //this.lines.push(div);
1293                 }
1294
1295                 document.body.appendChild(div);
1296                 return div;
1297
1298             },
1299             showScores: function () {//显示游戏所得分数
1300                 document.getElementById("scores").innerText = this.Scores;
1301             },
1302             addScores: function () {//第消除一对,游戏分数会增加
1303                 this.Scores += 20;
1304                 this.showScores();
1305             },
1306             addTime: function () {//每消除一对,游戏时间会增加
1307                 this.timeout += 5;
1308                 this.timeout = Math.min(this.timeout, this.getTime());
1309                 this.showTime();
1310             },
1311             showTime: function () {//显示游戏剩余时间
1312                 this.timeout = Math.max(this.timeout, 0);
1313                 document.getElementById("time").innerText = this.timeout;
1314             },
1315             showLife: function () {//显示生命值
1316                 document.getElementById("life").innerText = this.Life;
1317             },
1318             addLife: function () {//过关后,生命值增加
1319                 this.Life++;
1320                 this.showLife();
1321             },
1322             decreaseLife: function () {//生命值减少
1323                 this.Life--;
1324                 //当生命值小于0时,游戏结束
1325                 if (this.Life < 0) {
1326                     this.Over();
1327                     return false;
1328                 }
1329
1330                 this.showLife();
1331                 return true;
1332             },
1333             showLevel: function () {//显示级别
1334                 document.getElementById("level").innerText = this.currentLevel;
1335             }
1336         };
1337         llk.prototype.setting = {
1338             currentLevel: 1,//当前关数
1339             maxLevel: 9,    //总关数
1340             Scores: 0,      //分数
1341             Life:6,         //生命值
1342             minTime: 180,   //最少时间
1343             className: "shucai",//默认CSS样式
1344             removedClassName: "removed",//被消除的CSS样式
1345             selectClassName:"select",//选择好的CSS样式
1346             getTime:function(){//当前关闯关时间
1347                 return (this.currentLevel -1) * 10 + this.minTime;
1348             }
1349         }
时间: 2024-11-05 20:29:42

连连看的原生JS实现V2的相关文章

连连看的原生JS实现

那天闲来无事,便想找个小游戏来打发时间,后来便找到了连连看, 玩了一会儿感觉无聊,想到各位高手用JS做的各种小游戏,便想自己也来做一个,于是便有了这几天的成果. 代码是用 原生JS 实现的,只是用来学习和练习的,所以我也没有做美工,连连看的元素直接显示的数字, 以后有时间再把它变成图片. 上图: 贴代码: <script type="text/javascript"> var llk = function () { var container = document.getE

利用原生JS实现网页1920banner图滚动效果

内容描述:随着PC设备硬件性能的进步和分辨率的不断提高,现在主流网站逐渐开始采用1920banner图,为适应这一趋势,博主设计了1920banner图的滚动效果,代码利用了原生JS实现了1920banner图的切换效果,并针对低分辨率电脑设备进行了适配,实现了JS代码与HTML代码的完全分离,符合w3c的标准使用规范,希望能给各位开发者朋友以帮助和参考.如发现有缺陷和不足,欢迎大家予以指正,如有更好的意见或解决方法,可在评论区交流互动.一下为代码内容: <!DOCTYPE html> <

原生JS写的ajax函数

参照JQuery中的ajax功能,用原生JS写了一个ajax,功能相对JQuery要少很多,不过基本功能都有,包括JSONP. 调用的方式分为两种: 1. ajax(url, {}); 2. ajax({}); 调用的方法参照JQuery的ajax,只是 不需要写$.ajax ,只需要写 ajax 就可以了. 代码如下: !function () { var jsonp_idx = 1; return ajax = function (url, options) { if (typeof url

原生js自动触发事件

熟悉jquery的童鞋都知道在jq中有一个方法可以自动触发事件,那就是trigger(),那么通过原生js又怎么模拟触发呢? js中添加一个主动触发事件的方法有dispatch.该方法能模拟用户行为,如点击(click)操作等. 标准使用dispatchEvent方法,IE6/7/8则使用fireEvent方法. dispatchEvent() 方法给节点分派一个合成事件. 语法如下: dispatchEvent(eventObj) eventObj 参数是一个描述事件的 ActionScrip

使用原生js的scrollTop,刷新进入页面定位到某一个dom元素

原生js的scrollTop即可,与jquery方法的区别是jquery做了兼容封装.我想要实现的功能是时间定位,根据当前时间定位到滚动区的时间位置.页面为移动端页面,上下固定位置,中部为1小时4格的选择区域,从0点到24点. 开始我想发出现了偏差,总想定位到某个dom,这样使得scrollTop一直是0,怎么设置都不行,后来仔细分析才发现要设置在超出当前可视区域的dom上才可以. 所以设置在外层overflow-x:scroll;的dom上即可,根据时间匹配dom位置,根据索引及每格的高度计算

原生JS封装运动框架

昨天我们说了一下原生JS中常用的兼容性写法,今天我们来说一下运动框架. 正常情况下我们要写一个运动的效果会用到tween.js这么一个插件,这个东西不是一般人写出来的,因为里面涉及的运动效果都是经过一堆数学的函数运算出来的,我们平常人是写不出来的,所有我们就自己封装一个运动框架,有什么问题改起来也方便,下面我们就开始封装. 首先,我们先写一个div,设置一些简单的样式,我们就拿这个div举例子,如下代码: #div{ width: 100px; height: 100px; background

常用原生JS兼容写法

在我们前端开发中,经常会遇到兼容性的问题,因为要考虑用户会使用不同的浏览器来访问你的页面,你要保证你做的网页在任何一个浏览器中都能正常的运行,下面我就举几个常用原生JS的兼容写法: 1:添加事件方法 addHandler:function(element,type,handler){  if(element.addEventListener){//检测是否为DOM2级方法   element.addEventListener(type, handler, false);  }else if (e

原生js实现数据双向绑定

最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里 缺点:一旦HTML代码生成就没有办法改变,如果有新数据重新传入,就必须重新把模板和数据整合到一起插入到文档流中 数据双向绑定 数据模型和视图之间的双向绑定,用户在视图上的修改会自动同步到数据模型中,同样的,如果数据模型中的值发生变化,也会同步到视图中去

原生JS与jQuery操作DOM有什么异同点?

本文和大家分享的主要是原生JS与jQuery操作DOM相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 一.创建元素节点 1.1 原生 JS 创建元素节点 document.createElement("p"); 1.2 jQuery 创建元素节点 $('<p></p>');` 二.创建并添加文本节点 2.1 原生JS创建文本节点 document.createTextNode("Text Content"); 通常创建文