C言語作成2048ミニゲーム
9447 ワード
この「C言語制作2048」は、実験棟のプロジェクトチュートリアルです.
あまり言わないで、効果図を書きます.
ここに画像の説明を入力します
設計構想:
私たちの2048ゲームで最も重要なのは、ブロックを消去し、画面の任意の位置でデータを出力することです.後者はncursesライブラリで簡単に実現でき、前者は脳筋を開く必要があります.
ざっと考えてみると、2048ゲームを実現するには2つのポイントがあります.は、条件を満たす場合にブロック を除去する.は、ゲームのメインインタフェース(16宮格)における任意の1格の出力データ を許可する.
ここで、第2のポイントはncursesライブラリを使用すると容易に実現できますが、第1のポイントは少し面倒です.
第1の実装構想は,2048ゲームにおける各格子のデータと状態を維持するために配列行列によってゲームマップと同じ次元の配列行列を作成することである.これにより、プレイヤーの移動操作を配列マトリクスに対する操作にマッピングすることができる.
コードコア関数の作成:
上記の考え方に従ってゲーム実行のコアプレイ関数を作成します.
W,S,A,D,方向キーにより上下左右方向の移動をそれぞれ制御する.実は全体の構造はとても簡単で、ただ過程は比較的に煩雑です.
開発に関するその他の手順:
ゲーム実行のコア関数playの作成については、main関数、ライブラリ導入などの他の関数については、ここでは説明しませんが、コア関数のコードを見て、このようなASCII文字版の2048をどのように完全に開発するか分からない場合は、「C言語作成2048」をクリックすると、完全なプロジェクト開発手順とコードが表示されます.
あまり言わないで、効果図を書きます.
ここに画像の説明を入力します
設計構想:
私たちの2048ゲームで最も重要なのは、ブロックを消去し、画面の任意の位置でデータを出力することです.後者はncursesライブラリで簡単に実現でき、前者は脳筋を開く必要があります.
ざっと考えてみると、2048ゲームを実現するには2つのポイントがあります.
ここで、第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」をクリックすると、完全なプロジェクト開発手順とコードが表示されます.