欢迎光临散文网 会员登陆 & 注册

2048

2023-09-06 17:10 作者:离渊一道墙  | 我要投稿

#include #include #include #include #define WIN 256 // ゲームの勝敗を決定する値を変更することができる。 // 矩阵数组 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 }; // 補助配列 int move = 0; // 移動した歩数を記録する int score = 0; //スコアの記録 int max = 0; //maxはゲームの勝敗を表し、max=WINが勝つ。 int change = 1; //ランダムな位置と乱数を生成する void Srand( ) { int i, j; do//ランダムな場所を生成し、生成された場所にデータがある場合は、新しい場所をランダムに生成し続ける。 { i = ( ( unsigned )rand( ) ) % 4; j = ( ( unsigned )rand( ) ) % 4; } while ( num[ i ][ j ] != 0 ); if ( ( ( unsigned )rand( ) ) % 4 == 0 ) { //4以上の余りが0の場合、4でパディングされた乱数を生成する。 num[ i ][ j ] = 4; } else { num[ i ][ j ] = 2; } move++; } void Print( ) { system( "CLS" ); printf( "*~~~~~~~~2048~~~~~~~*\n" ); printf( "*author: 亚威 *\n" ); printf( "*スコア: %d 步数: %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-配列の前と途中に現れるゼロを取り除く 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つの数を組み合わせる void add( ) { fun( ); // 先頭と中間のゼロを取り除く hebing( ); // 隣接する等しい2つの数を組み合わせる fun( ); // ゼロを取り除く } int main( ) { int i, j; int gameover = 1; //ランダムな位置を生成する srand( ( unsigned )time( NULL ) ); max = 0; while ( gameover && ( max < WIN ) ) { if ( change ) { Srand( ); // ランダムな位置と乱数を生成する } 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列目のデータを順番に補助配列tに代入する。 t[ j ] = num[ j ][ i ]; } add( ); // 核心:隣接する等しい2つの数を組み合わせる 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列目のデータを順番に補助配列tに代入する。 t[ 3 - j ] = num[ j ][ i ]; } add( ); // 核心:隣接する等しい2つの数を組み合わせる 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列目のデータを順番に補助配列tに代入する。 t[ j ] = num[ i ][ j ]; } add( ); // 核心:隣接する等しい2つの数を組み合わせる 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列目のデータを順番に補助配列tに代入する。 t[ 3 - j ] = num[ i ][ j ]; } add( ); //核心:隣接する等しい2つの数を組み合わせる 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; } 

2048的评论 (共 条)

分享到微博请遵守国家法律