【2048】IOI2019矩形シミュレーション

/ * 
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)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/yelir/p/11594595.html