#include
#include
#include
#include
#define WIN 256 // ゲームの勝敗を決定する値を変更することができる。
// 矩陣數(shù)組
int num[ 4 ][ 4 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
int t[ 5 ] = { 0,0,0,0,0 }; // 補(bǔ)助配列
int move = 0; // 移動(dòng)した歩數(shù)を記録する
int score = 0; //スコアの記録
int max = 0; //maxはゲームの勝敗を表し、max=WINが勝つ。
int change = 1;
//ランダムな位置と亂數(shù)を生成する
void Srand( )
{
int i, j;
do//ランダムな場(chǎng)所を生成し、生成された場(chǎng)所にデータがある場(chǎng)合は、新しい場(chǎng)所をランダムに生成し続ける。
{
i = ( ( unsigned )rand( ) ) % 4;
j = ( ( unsigned )rand( ) ) % 4;
} while ( num[ i ][ j ] != 0 );
if ( ( ( unsigned )rand( ) ) % 4 == 0 )
{ //4以上の余りが0の場(chǎng)合、4でパディングされた亂數(shù)を生成する。
num[ i ][ j ] = 4;
}
else
{
num[ i ][ j ] = 2;
}
move++;
}
void Print( )
{
system( "CLS" );
printf( "*~~~~~~~~2048~~~~~~~*\n" );
printf( "*author: 亞威 *\n" );
printf( "*スコア: %d 步數(shù): %d \n", score, move );
printf( "*~~~~~~~~~~~~~~~~~~~*\n" );
for ( int i = 0; i <= 3; i++ )
{
for ( int j = 0; j <= 3; j++ )
{
if ( num[ i ][ j ] == 0 )
printf( "* " );
else
printf( "*%4d", num[ i ][ j ] );
}
printf( "*\n*~~~~~~~~~~~~~~~~~~~*\n" );
}
}
// t-配列の前と途中に現(xiàn)れるゼロを取り除く
void fun( )
{
int i, j;
for ( i = 0; i <= 3; i++ )
{
if ( t[ i ] == 0 )
{
for ( j = i + 1; j <= 3; j++ )
{
if ( t[ j ] != 0 )
{
change = 1;
break;
}
}
t[ i ] = t[ j ];
t[ j ] = 0;
}
if ( j >= 3 )
break;
}
}
// マージ操作
void hebing( )
{
for ( int i = 0; i <= 2; i++ )
{
if ( ( t[ i ] != 0 ) && ( t[ i ] == t[ i + 1 ] ) )
{
t[ i ] *= 2;
score += t[ i ];
change = 1;
t[ i + 1 ] = 0;
}
if ( max < t[ i ] )
max = t[ i ];
}
}
// 隣接する等しい2つの數(shù)を組み合わせる
void add( )
{
fun( ); // 先頭と中間のゼロを取り除く
hebing( ); // 隣接する等しい2つの數(shù)を組み合わせる
fun( ); // ゼロを取り除く
}
int main( )
{
int i, j;
int gameover = 1;
//ランダムな位置を生成する
srand( ( unsigned )time( NULL ) );
max = 0;
while ( gameover && ( max < WIN ) )
{
if ( change )
{
Srand( ); // ランダムな位置と亂數(shù)を生成する
}
change = 0;
Print( ); // 表示畫面
char in = getch(); // 読み取り操作コマンド
switch ( in )
{
case 'w':
case 'W':
for ( i = 0; i <= 3; i++ )
{ // 1列目から4列目まで順次
for ( j = 0; j <= 3; j++ )
{ // i列目のデータを順番に補(bǔ)助配列tに代入する。
t[ j ] = num[ j ][ i ];
}
add( ); //?核心:隣接する等しい2つの數(shù)を組み合わせる
for ( j = 0; j <= 3; j++ )
{ // 処理したデータを行列の対応する位置に順番に入れる。
num[ j ][ i ] = t[ j ];
}
}
break;
case 's':
case 'S':
for ( i = 0; i <= 3; i++ )
{ // 1列目から4列目まで順次
for ( j = 0; j <= 3; j++ )
{ // i列目のデータを順番に補(bǔ)助配列tに代入する。
t[ 3 - j ] = num[ j ][ i ];
}
add( ); // 核心:隣接する等しい2つの數(shù)を組み合わせる
for ( j = 0; j <= 3; j++ )
{ // 処理したデータを行列の対応する位置に順番に入れる
num[ j ][ i ] = t[ 3 - j ];
}
}
break;
case 'a':
case 'A':
for ( i = 0; i <= 3; i++ )
{ // 1列目から4列目まで順次
for ( j = 0; j <= 3; j++ )
{ // i列目のデータを順番に補(bǔ)助配列tに代入する。
t[ j ] = num[ i ][ j ];
}
add( ); // 核心:隣接する等しい2つの數(shù)を組み合わせる
for ( j = 0; j <= 3; j++ )
{ // 処理したデータを行列の対応する位置に順番に入れる。
num[ i ][ j ] = t[ j ];
}
}
break;
case 'd':
case 'D':
for ( i = 0; i <= 3; i++ )
{ // 1列目から4列目まで順次
for ( j = 0; j <= 3; j++ )
{ // i列目のデータを順番に補(bǔ)助配列tに代入する。
t[ 3 - j ] = num[ i ][ j ];
}
add( ); //核心:隣接する等しい2つの數(shù)を組み合わせる
for ( j = 0; j <= 3; j++ )
{ //処理したデータを行列の対応する位置に順番に入れる。
num[ i ][ j ] = t[ 3 - j ];
}
}
break;
}
gameover = 0;
for ( i = 0; i <= 3; i++ )
{
for ( j = 0; j <= 3; j++ )
{
if ( num[ i ][ j ] == 0 )
gameover = 1;
}
}
if ( ( gameover == 0 ) && ( change == 0 ) )
break;
}
Print( );
if ( max >= WIN )
{
printf( "You Win!\n" );
printf( "君はすごいよ。!!!\n" );
}
else
{
printf( "Gameover\n" );
printf( "頑張ってみて。!!!\n" );
}
system( "pause" );
return 0;
}?
標(biāo)簽: