C言語作成2048ミニゲーム

9447 ワード

この「C言語制作2048」は、実験棟のプロジェクトチュートリアルです.
あまり言わないで、効果図を書きます.
ここに画像の説明を入力します
設計構想:
私たちの2048ゲームで最も重要なのは、ブロックを消去し、画面の任意の位置でデータを出力することです.後者はncursesライブラリで簡単に実現でき、前者は脳筋を開く必要があります.
ざっと考えてみると、2048ゲームを実現するには2つのポイントがあります.
  • は、条件を満たす場合にブロック
  • を除去する.
  • は、ゲームのメインインタフェース(16宮格)における任意の1格の出力データ
  • を許可する.
    ここで、第2のポイントはncursesライブラリを使用すると容易に実現できますが、第1のポイントは少し面倒です.
    第1の実装構想は,2048ゲームにおける各格子のデータと状態を維持するために配列行列によってゲームマップと同じ次元の配列行列を作成することである.これにより、プレイヤーの移動操作を配列マトリクスに対する操作にマッピングすることができる.
    コードコア関数の作成:
    上記の考え方に従ってゲーム実行のコアプレイ関数を作成します.
    W,S,A,D,方向キーにより上下左右方向の移動をそれぞれ制御する.実は全体の構造はとても簡単で、ただ過程は比較的に煩雑です.
    void play()
    {
        int x, y, i, new_x, new_y, temp;
        int old_empty, move;
        char ch;
    
        while(1) 
        {
            move = 0;
            old_empty = empty;
            ch = getch(); 
            switch(ch) {
                case 97:    //    a
                case 104:   // h
                case 68:    //      
                    for(y = 0; y < 4; y++)
                        for(x = 0; x < 4; ) 
                        {
                            if(a[y][x] == 0) 
                            {
                                x++;
                                continue;
                            } 
                            else 
                            {
                                for(i = x + 1; i < 4; i++) 
                                {
                                    if(a[y][i] == 0) 
                                    {
                                        continue;
                                    }
                                    else 
                                    {
                                        if(a[y][x] == a[y][i]) 
                                        {
                                            a[y][x] += a[y][i];
                                            a[y][i] = 0;
                                            empty++;
                                            break;
                                        }
                                        else 
                                        {
                                            break;
                                        }
                                    }
                                }
                                x = i;
                            }
                        }
                    for(y = 0; y < 4; y++)
                        for(x = 0; x < 4; x++) 
                        {
                            if(a[y][x] == 0) 
                            {
                                continue;
                            } 
                            else 
                            {
                                for(i = x; (i > 0) && (a[y][i-1] == 0); i--) 
                                {
                                    a[y][i-1] = a[y][i];
                                    a[y][i] = 0;
                                    move = 1;
                                }
                            }
                        }
                    break;
                case 100:   //   d 
                case 108:   // l
                case 67:    //     
                    for(y = 0; y < 4; y++)
                        for(x = 3; x >= 0; ) 
                        {
                            if(a[y][x] == 0) 
                            {
                                x--;
                                continue;
                            } 
                            else 
                            {
                                for(i = x - 1; i >= 0; i--)
                                {
                                    if(a[y][i] == 0)
                                    {
                                        continue;
                                    } 
                                    else if(a[y][x] == a[y][i]) 
                                    {
                                        a[y][x] += a[y][i];
                                        a[y][i] = 0;
                                        empty++;
                                        break;
                                    } 
                                    else 
                                    {
                                        break;
                                    }
                                }
                                x = i;
                            }
                        }
                    for(y = 0; y < 4; y++)
                        for(x = 3; x >= 0; x--) 
                        {
                            if(a[y][x] == 0) 
                            {
                                continue;
                            } else 
                            {
                                for(i = x; (i < 3) && (a[y][i+1] == 0); i++) 
                                {
                                    a[y][i+1] = a[y][i];
                                    a[y][i] = 0;
                                    move = 1;
                                }
                            }
                        }
                    break;
                case 119:   //   w 
                case 107:   //k
                case 65:    //     
                    for(x = 0; x < 4; x++)
                        for(y = 0; y < 4; ) 
                        {
                            if(a[y][x] == 0)
                            {
                                y++;
                                continue;
                            } 
                            else 
                            {
                                for(i = y + 1; i < 4; i++) 
                                {
                                    if(a[i][x] == 0) 
                                    {
                                        continue;
                                    } 
                                    else if(a[y][x] == a[i][x]) 
                                    {
                                        a[y][x] += a[i][x];
                                        a[i][x] = 0;
                                        empty++;
                                        break;
                                    } else 
                                    {
                                        break;
                                    }
                                }
                                y = i;
                            }
                        }
                    for(x = 0; x < 4; x++)
                        for(y = 0; y < 4; y++) 
                        {
                            if(a[y][x] == 0) 
                            {
                                continue;
                            } 
                            else
                            {
                                for(i = y; (i > 0) && (a[i-1][x] == 0); i--) 
                                {
                                    a[i-1][x] = a[i][x];
                                    a[i][x] = 0;
                                    move = 1;
                                }
                            }
                        }
                    break;
                case 115:   //   s 
                case 106:   //j
                case 66:    //     
                    for(x = 0; x < 4; x++)
                        for(y = 3; y >= 0; ) 
                        {
                            if(a[y][x] == 0) 
                            {
                                y--;
                                continue;
                            } 
                            else 
                            {
                                for(i = y - 1; i >= 0; i--) 
                                {
                                    if(a[i][x] == 0) 
                                    {
                                        continue;
                                    } 
                                    else if(a[y][x] == a[i][x])
                                    {
                                        a[y][x] += a[i][x];
                                        a[i][x] = 0;
                                        empty++;
                                        break;
                                    } 
                                    else
                                    {
                                        break;
                                    }
                                }
                                y = i;
                            }
                        }
                    for(x = 0; x < 4; x++)
                        for(y = 3; y >= 0; y--) 
                        {
                            if(a[y][x] == 0) 
                            {
                                continue;
                            } 
                            else 
                            {
                                for(i = y; (i < 3) && (a[i+1][x] == 0); i++) 
                                {
                                    a[i+1][x] = a[i][x];
                                    a[i][x] = 0;
                                    move = 1;
                                }
                            }
                        }
                    break;
                case 'Q':
                case 'q':
                    game_over();
                    break;
                default:
                    continue;
                    break;
            }
            if(empty <= 0)
                game_over();
            if((empty != old_empty) || (move == 1)) 
            { 
                do{
                    new_x = rand() % 4;
                    new_y = rand() % 4;
                }while(a[new_y][new_x] != 0);
    
                cnt_value(&new_y, &new_x);
    
                do {
                    temp = rand() % 4;
                }while(temp == 0 || temp == 2);
                a[new_y][new_x] = temp + 1;
                empty--;
            }
            draw();
        }
    }
    

    開発に関するその他の手順:
    ゲーム実行のコア関数playの作成については、main関数、ライブラリ導入などの他の関数については、ここでは説明しませんが、コア関数のコードを見て、このようなASCII文字版の2048をどのように完全に開発するか分からない場合は、「C言語作成2048」をクリックすると、完全なプロジェクト開発手順とコードが表示されます.