/ * DOSのWindows 25 * 80 * / 書式#include <アルゴリズム> 書式#include <WINDOWS.H> 書式#include <iostreamの> の#include <CStringの> の#include <cstdlib> 書式#include <conio.h> 書式#include <のctype.h> #include <cstdioを> する#include <cmath> の#include <ctimeの> 使用して名前空間STD; INT game_answer = 0; / * 1 = 9 =水色青色 2ライトグリーン=緑= 10 3 = 11 =ライトブルーレーキ淡緑色の 4 = 12 =は、淡赤色赤色 5バイオレット13 =ラベンダー= 6 = 14 =淡黄色黄色 7明るい白=白= 15 * / / *設定背景色* / INT SetBackColor(unsigned char型のbcolor){ HANDLEのHD = GetStdHandle(STD_OUTPUT_HANDLE)。 CONSOLE_SCREEN_BUFFER_INFO csbInfo; GetConsoleScreenBufferInfo(HD、&csbInfo)。 SetConsoleTextAttribute(HD、(bColor << 4)|(csbInfo.wAttributes&〜0xF0が))を返します。 } / *设置字体颜色* / int型SETTEXTCOLOR(unsigned char型のFCOLOR){ HANDLEのHD = GetStdHandle(STD_OUTPUT_HANDLE)。 CONSOLE_SCREEN_BUFFER_INFO csbInfo; GetConsoleScreenBufferInfo(HD、&csbInfo)。 SetConsoleTextAttribute(HD、FCOLOR |(csbInfo.wAttributes&〜0x0Fの))を返します。 } ボイドappGetXY()//得到光标位置 { hStdoutをハンドルと CONSOLE_SCREEN_BUFFER_INFO pBuffer; hStdout = GetStdHandle(STD_OUTPUT_HANDLE)。 GetConsoleScreenBufferInfo(hStdout、&pBuffer)。 coutの<< pBuffer.dwCursorPosition.X <<」「<< pBuffer.dwCursorPosition.Y <<てendl ;; } ボイドappGotoXY(int型のx、int型のY)//移动光标 { スワップ(X、Y) CONSOLE_SCREEN_BUFFER_INFO csbiInfo; hConsoleOutをHANDLE。 hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)。 GetConsoleScreenBufferInfo(hConsoleOut、&csbiInfo)。 csbiInfo.dwCursorPosition.X = xで。 csbiInfo.dwCursorPosition.Y = Y。 SetConsoleCursorPosition(hConsoleOut、csbiInfo.dwCursorPosition)。 } インラインINT Get_X(int型のx、int型のY){ IF(X == 1)リターン5。 (x == 3)13を返す場合、 (x == 4)17を返す場合、 } インラインINT Get_Y(int型のx、int型のY){ IF(Y == 1)リターン24。 もし(Y == 2)リターン34。 もし(Y == 3)リターン44。 もし(Y == 4)リターン54。 } ボイドHideCursor(){//隐藏光标 CONSOLE_CURSOR_INFO cursor_info = {1,0}。 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE)、&cursor_info)。 } INT [5] [5]。 ブールif_game_over(){ ため(I = 1 int型、iは<= 4; I ++) のための(INT J = 1; J <= 4; J ++) IF([I] [J]!) リターン1。 ための式(I = 2 int型、iは<= 4; I ++) のための(INT J = 1; J <= 4であり、j ++){ IF([J] [I] == A [J] [I-1]) リターン1; IF([1-I] [I] [J]は[J] ==) リターン1; } リターン0; } BOOL VIS [20]; Pr_a_num_with_color(INT X){無効 スイッチ(X){/ * 1 = 9 =水色青色 2ライトグリーン=緑= 10 3 = 11 =光ターコイズ青色光を緑色 4 = 12 =淡赤色赤色 5バイオレット13 =ラベンダー= 6 = 14 =淡黄色黄色 7 = 15 =明るい白白* / ケース2:SETTEXTCOLOR(9);のprintf( "%4D"、X); SETTEXTCOLOR(0 ); BREAK; ケース4:SETTEXTCOLOR(10);のprintf( "%4D"、X); SETTEXTCOLOR(0); BREAK。 ケース8:SETTEXTCOLOR(11);のprintf( "%4D"、X); SETTEXTCOLOR(0);破ります。 ケース16:SETTEXTCOLOR(12);のprintf( "%4D"、X); SETTEXTCOLOR(0);破ります。 ケース32:SETTEXTCOLOR(13);のprintf( "%4D"、X); SETTEXTCOLOR(0);破ります。 ケース64:SETTEXTCOLOR(14);のprintf( "%4D"、X); SETTEXTCOLOR(0);破ります。 ケース128:SETTEXTCOLOR(15);のprintf( "%4D"、X); SETTEXTCOLOR(0);破ります。 ケース256:SETTEXTCOLOR(1);のprintf( "%の4D"、X); SETTEXTCOLOR(0);破ります。 ケース512:SETTEXTCOLOR(2);のprintf( "%の4D"、X); SETTEXTCOLOR(0);破ります。 ケース1024:SETTEXTCOLOR(3);のprintf( "%の4D"、X); SETTEXTCOLOR(0);破ります。 ケース2048:SETTEXTCOLOR(4)のprintf( "%の4D"、X); SETTEXTCOLOR(0);破ります。 ケース4096:SETTEXTCOLOR(5);のprintf( "%の4D"、X); SETTEXTCOLOR(0);破ります。 } } ボイドPr_all_num(){ (INT i = 1; iが<= 4; I ++)のため のために(INT J = 1; J <= 4; jは++){ intはGet_X(i、j)は、YはGet_Yを=を= X( i、j)は、 appGotoXY(X、Y) IF([I] [J] == 0) のprintf(」「)。 他{ Pr_a_num_with_color([I] [J])。 //のprintf( "%の4D"、[I] [J])。 } } を返します。 } // *********************************************** *** BOOL clear_up(){ BOOL BB = 0。 (; kは整数のK = 1 <= 4であり、k ++) のための(I 3 = int型、I> (J ++; J <= 4 INT J = 1)のための (![I] [J] == 0 && [I + 1] [j] = 0){もし スワップ([I]、[J]、A [I + 1] [J])。 BB = 1。 } IF(BB == 1) リターン1。 0を返します。 } BOOL do_up(){ IF(if_game_over()!) リターン1。 BOOL BB = 1。 (!clear_up())//没空间不能移动場合 BB = 0; 用(INTのJ = 1; J <= 4であり、j ++){ int型I = 1。 {(私は4 <)しながら (![I + 1] [J])場合 、ブレーク IF([I] [J] = [I + 1] [J]!){ I ++。 持続する ; } {([I] [j]は[I + 1] [j] ==)場合 [I] [J] + = [I + 1] [j]を。game_answer + = A [I + 1]〜[J]。 [I + 1] [j]は= 0。 I + = 2; BB = 1; //可以合并 } } } もし(BB == 0)//没空间又不能合并 0を返します。 片付ける(); 1を返します。 } // *********************************************** *** BOOL clear_down(){ BOOL BB = 0。 用(int型K = 1; kは<= 4; ++ K) のための(INT I = 2; I ++; iが= 4 <) のための(INT J = 1; J <= 4; J ++) IF([I] [Jを] == 0 && [I-1] [j] = 0){! スワップ([I]、[J]、[I-1]〜[J])。 BB = 1。 } IF(BB == 1) リターン1。 0を返します。 } BOOL do_down(){ IF(if_game_over()!) リターン1。 BOOL BB = 1。 (もし!clear_down()) BB = 0; 用(INTのJ = 1; J <= 4であり、j ++){ int型I = 4。 しばらく(I> 1){ 場合([I-1]を[J]!) 破ります。 IF([I] [J] = [I-1]〜[J]!){ i--。 持続する ; } {([I] [j]は[I-1]〜[J] ==)場合 [I] [J] + = [I-1] [j]を。game_answer + = A [I-1]〜[J]。 [I-1] [j] = 0; I- = 2。 BB = 1。 } } } もし(BB == 0) 戻り0; clear_down(); 1を返します。 } // *********************************************** *** BOOL clear_left(){ BOOL BB = 0。 用(int型K = 1; kは<= 4; ++ K) のための(INT I = 1; I ++; iは= 4 <) のための(INT J = 3、J> = 1; j--) IF([I] [J] == 0 && [I]、[J + 1] = 0){! スワップ([I]、[J]、[I]、[J + 1])。 BB = 1。 } IF(BB == 1) リターン1。 0を返します。 } BOOL do_left(){ (!if_game_over())であれば 、戻り1; BOOL BB = 1。 (もし!clear_left()) BB = 0; 以下のために(INT i = 1; iが<= 4; I ++){ int型のJ = 1。 一方、(J <4){ IF([I]、[J + 1]!) ブレーク。 IF(![I] [J] = [I]、[J + 1]){ J ++。 持続する ; } {([I] [j]は[I]、[J + 1] ==)場合 [I] [J] + = [I] [J + 1]。game_answer + = A [i]は[J + 1]。 [I]、[J + 1] = 0; J + = 2; BB = 1。 } } } もし(BB == 0) 戻り0; clear_left(); 1を返します。 } // *********************************************** *** BOOL clear_right(){ BOOL BB = 0。 用(int型K = 1; kは<= 4; ++ K) のための(INT I = 1; I ++; iが= 4 <) のための(INT J = 2、J <= 4; J ++) IF([I] [Jを] == 0 && [I]、[J-1] = 0){! スワップ([I]、[J]、[I]、[J-1])。 BB = 1。 } IF(BB == 1) リターン1。 0を返します。 } ブールdo_right(){ IF(if_game_over()!) リターン1。 BOOL BB = 1。 (もし!clear_right()) BB = 0; 以下のために(; iは4 = <; I = 1 int型私は++){ int型J = 4; (J> 1){しばらく するif(![I] [J-1]) ブレーク。 IF([I] [J] = [I]、[J-1]!){ j--。 持続する ; } {([I] [j]は[I]、[J-1] ==)場合 [I] [J] + = [I] [J-1]。game_answer + = A [i]は[J-1]。 A [i]は[J-1] = 0; J- = 2。 BB = 1。 } } } もし(BB == 0) 戻り0; clear_right(); 1を返します。 } ボイドSTART(); 空END(); INTメイン(){ srand関数(時間(0))。 HideCursor(); //隐藏光标 START(); 一方、(if_game_over()){ //システム( "CLS")。 // appGotoXY(0,0); int型BB = 0; // BB判断是否有空位 のための(int型I = 1;私は<= 4; I ++) のための(int型J = 1; J <= 4; J ++) !IF([I] [J] ) BB = 1。 IF(BB == 1){ int型num_new =ランド()%10 + 1; //新出现4还是2 (num_new == 1)num_new = 4であれば、 他num_new = 2; INT place_new = 0、X = 0、Y = 0。 一方、(1){ place_new =ランド()%16 + 1。 X =(place_new-1)/ 4 + 1、yはplace_new%4 + 1 =。 IF(![X] [Y]) 破ります; } [X] [Y] = num_new。 } Pr_all_num()。 再び: チャーCH_1 = getchは()、CH_2。 IF(CH_1 = - 32!){ appGotoXY(20,30)。 チャーS_1 [30] = "您输入的字符不合法。"; 以下のために(; iは20 <; I = 0 int型私は++){ COUT << S_1 [I]。 (1)スリープ。 } スリープ(200)。 以下のために(int型I = 1; I ++;私は= 19 <) のprintf( "\ bは\ bの"); 後藤再び; } CH_2 = getchは()。 もし(CH_2 == 72)//アップ するif(!do_up()) 後藤再び; もし(CH_2 == 80)//ダウン するif(!do_down()) 後藤再び。 もし(CH_2 == 75)//左の 場合(!do_left()) 後藤再び。 もし(CH_2 == 77)//右の 場合(!do_right()) 後藤再び。 appGotoXY(20,30)。 printf( "您当前的总分为た:%d"、game_answer)。 } appGotoXY(20,30)。 printf(」「); 終わり(); 0を返します。 } ボイドSTART(){ appGotoXY(0,0)。 setBackColor(15); //大背景颜色 ための(int型I = 1;私は= 26 * 80 <; I ++) 「<< COUTを「。 appGotoXY(0,0)。 裁判所未満<<」「; appGotoXY(20,19)。 setBackColor(7); //小背景颜色 ため(I = 1 int型、iは<= 42; I ++) COUT <<」「。 SETTEXTCOLOR(0); //字体颜色 appGotoXY(3,19)。 printf( "┏━━━━┳━━━━┳━━━━┳━━━━┓\ nを"); appGotoXY(4,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(5,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(6,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(7,19)。 printf( "┣━━━━╋━━━━╋━━━━╋━━━━┫\ nを"); appGotoXY(8,19)。 printf(」 appGotoXY(9,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(10,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(11,19)。 printf( "┣━━━━╋━━━━╋━━━━╋━━━━┫\ nを"); appGotoXY(12,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(13,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(14,19)。 printf( "┃┃┃┃┃\ N"); appGotoXY(15,19)。 printf( "┣━━━━╋━━━━╋━━━━╋━━━━┫\ nを"); appGotoXY(16,19)。 printf( "┃┃┃┃┃\ N"); printf( "┃┃┃┃┃\ N-"); appGotoXY(18、19である); のprintf( "┃┃┃┃┃\ N-"); appGotoXY(19、19); のprintf(「┗━━━━┻━ ━━━┻━━━━┻━━━━┛\ N- "); //スリープ(100000); 返す; } (){ENDを無効 SetBackColor(15); appGotoXY(21,30); CHAR S_1 [30 ] = "あなたのスコアゲームオーバー:"; {ため(; I 22は、<I ++はI = 0 INT) COUT << S_1 [I]は、 スリープ(30); } スリープ(500); COUT << game_answerをENDL <<; 睡眠(500); appGotoXY(22、30); CHAR S_2 [30] = "ゲームを終了する任意のキーを押してください。"; I 20は<;(I = 0 int型のために、I ++){ COUT << S_2 [I]。 睡眠(30)。 } }