2048ゲーム開発


2048ゲーム開発
14年の时を覚えていますか、2040の小さいゲームはとても人気があって、多くの会社も“アップグレード版”をして、その时私达はcocos 2 d-x(c++)エンジンを使って开発したので、各种の皮の游び方を交换します.しかし、当時私もゲーム開発の初心者だったので、バグが少なくありませんでした.このゲームは見ているだけで簡単に遊ぶのも簡単ですが、開発してみると難点があります.例えば、cellがアニメーションを移動するには、迅速に操作できることを保証しなければなりません.cellの移動位置が正しいことを保証しなければなりません.また、新しく現れたcellの位置が正しいことを保証しなければなりません.cocoscreatorエンジンで実装し、ロジックを最適化します.
一、主なロジック
2つの4 x 4の配列を維持することによって実現し,配列aはデータ(0はスペース,0ではなく対応する値)を格納し,操作のたびに配列の値を即時に更新する.配列bは画面にリアルに表示されてアニメーションができる格子ノードを格納し、操作するたびに直ちにノードの配列bにおける位置(配列aに対応)を更新するが、格子ノードにはアニメーションが存在し、表示の更新に遅れがあり、アニメーションが終了した後、現在位置する格子位置に基づいて配列aの値を取り、自分の値(例えばノードnの配列bにおける位置は(0,0)を更新する必要がある.その値は配列a[0][0]の値であるべきである)
二、具体的な実現
主に移動と移動可能かどうかを判断する論理であり、4つの方向が移動できない場合、ゲームは終了する.
1.移動可能か否かを判断する
上下左右の論理のように、左に移動する例を示します.
ある行が0 2 4 8の4つの格子であると仮定すると、左側の2番目の格子から順に前の格子と比較するだけで、前の格子が0であるか、前の格子の値が現在の格子の値と同じであれば、その方向は移動でき、そうでなければ移動できません.2左側は0なので移動できますが、コードは以下の通りです.
canMoveLeft() {
        for (let row = 3; row >= 0; row--) {
            for (let col = 1; col <= 3; col++) {
                if (this.board[row][col] != 0) {
                    if (this.board[row][col - 1] == 0 || this.board[row][col - 1] == this.board[row][col]) {
                        return true;
                    }
                }
            }
        }
        return false;
    },

2.移動と連結ロジック
ここでは左に合併する例を挙げます.例えば、ある行が2 0 2 4であれば、合併後は8 0 0ではなく4 4 4 0であるべきです.この論理はネット上では間違いが多いと思います.各数字は移動するたびに合併に参加するしかありません.ループの各行の開始時にflagを0に等しく設定し、左側の1番目の数字から右に値を取り、0の場合は次を見続けます.そうしないと、左側の0+flagの順に現在の値の前に対するまで比較し、後者が0の場合は現在の値を後者に割り当て、現在の値を0に設定し、後者が現在の値と同じ場合は、後者の値は、後者に現在値を加えた値に等しく、現在値を0に設定し、スコアを統計します.ポイントを引くと、合併が発生するとflagに1を加え、次の比較過程で左側の0番目から始まるのではなく、左側の0+flagから始まります.これは無視しやすいです.コードは以下の通りです.
moveLeft() {
     cc.log("   ");
     if (!this.canMoveLeft()) {
         return;
     }
     
     for (let row = 3; row >= 0; row--) {
         let tmp = 0;
         for (let col = 0; col <= 3; col++) {
             if (this.board[row][col] == 0) {
                 continue;
             }
             for (let k = 0 + tmp; k < col; k++) {
                 if (this.board[row][k] == 0 && this.noBlockHorizonal(row, k, col)) {
                     this.board[row][k] = this.board[row][col];
                     this.board[row][col] = 0;
                    
                     this.moveActionHorizonal(row, col, k, false);
                 } else if (this.board[row][k] == this.board[row][col] && this.noBlockHorizonal(row, k, col)) {
                     this.score += this.board[row][col] * 2;
                     this.board[row][k] += this.board[row][col];
                     this.board[row][col] = 0;
                     tmp++;

                     this.moveActionHorizonal(row, col, k, true);
                 }
             }
         }
     }
     this.randomCell();
 }

オンラインゲーム
githubソース