1. 程式人生 > >c語言控制檯推箱子小遊戲

c語言控制檯推箱子小遊戲

這是最早編寫的一個小程式,程式設計思路源於網路。

用CodeBlocks16.01編繹通過。

關卡設計參考易語言例程,十八個關卡的陣列初始值,看圖手工填寫了兩個多小時。

或許是很笨辦法,高手請多指教。

程式設計思路:

     二維陣列指定物件的位置和種類。

二   雙快取消除螢幕閃爍。

    核心程式碼 switch語句計算出字元的邏輯變化。

有了思路,程式碼就容易寫了,下面是介面圖:


十八關圖,好多箱子,眼都花了,對得起推箱仙人的稱號:


主程式程式碼:

/********************************
名稱:推箱子
描述:用控制檯程式實現推箱子小遊戲
編譯:codeblocks16.01 vs2010
建立:零千刻
日期:170502
*********************************/
#include <windows.h>//Sleep(100)
#include <stdlib.h>//system()
#include <stdio.h>
#include <conio.h> //getch需要
extern int map1[14][16], map2[14][16], map3[14][16], map4[14][16],map5[14][16],
       map6[14][16], map7[14][16], map8[14][16],map9[14][16], map10[14][16],
       map11[14][16], map12[14][16],map13[14][16], map14[14][16], map15[14][16],
       map16[14][16],map17[14][16], map18[14][16];
void DrawMap();
void PlayGame();
void TextManage();
void DrawMapBase();
void nextMap();
void TextChange();
void stopFlash();
HANDLE hOutput;
HANDLE hOutBuf;
COORD coord= {0,0}; //COORD是Windows API中定義的一種結構,表示一個字元在控制檯螢幕上的座標。
int stra=strlen("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
int map[14][16]= {};
bool mapNumWait=true;//地圖關卡數
int mapNumGoing=1;//地圖關卡數
int mapNumGoingC=1;//地圖關卡數副本
bool nextm=true;
bool textc=false;
bool nextK=true;
int iox=0;
int jox=0;
char data[720];//控制檯預設一行為80個半形字元,
DWORD bytes=0;


int main()
{


    //獲取預設標準顯示緩衝區控制代碼
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    // 獲取標準輸出裝置控制代碼
    //CONSOLE_SCREEN_BUFFER_INFO bInfo; // 視窗緩衝區資訊
    //GetConsoleScreenBufferInfo(hOutput, bInfo );
    // 獲取視窗緩衝區資訊
    //char strTitle[255];
    //GetConsoleTitle(strTitle, 255); // 獲取視窗標題
    //printf("當前視窗標題是:%s\n", strTitle);
    //_getch();
    SetConsoleTitle(TEXT("推箱子")); // 獲取視窗標題
    //_getch();
    COORD size = {80-20, 25+2};
    SetConsoleScreenBufferSize(hOutput,size); // 重新設定緩衝區大小
    //_getch();
    SMALL_RECT rc = {0,0, 80-20, 25+2}; // 重置視窗位置和大小
    SetConsoleWindowInfo(hOutput,true,&rc);
    //CloseHandle(hOutput); // 關閉標準輸出裝置控制代碼
    //建立新的緩衝區
    hOutBuf = CreateConsoleScreenBuffer(
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                  NULL,
                  CONSOLE_TEXTMODE_BUFFER,
                  NULL
              );


    //設定新的緩衝區為活動顯示緩衝
    SetConsoleActiveScreenBuffer(hOutBuf);


    //隱藏兩個緩衝區的游標
    CONSOLE_CURSOR_INFO cci;
    cci.bVisible=0;
    cci.dwSize=1;
    SetConsoleCursorInfo(hOutput, &cci);
    SetConsoleCursorInfo(hOutBuf, &cci);


    //雙緩衝處理顯示
    SetConsoleTextAttribute(hOutBuf,0|11);


    TextManage();


    while (1)
    {


        stopFlash();
        DrawMapBase();
        DrawMap();
        ReadConsoleOutputCharacterA(hOutBuf, data, 720, coord, &bytes);
        Sleep(30);
        WriteConsoleOutputCharacterA(hOutput, data,720, coord, &bytes);


        nextMap();//函式呼叫順序很重要,若放最後,會有推箱未完就換圖之狀
        TextChange();
        PlayGame();
    }
    return 0;


}


void DrawMapBase()
{
    if(mapNumWait)//bool判斷中勿再賦值
    {


        for(int m=0; m<14; m++)
        {
            for(int n=0; n<16; n++)
            {
                switch(mapNumGoing)
                {
                case 1:
                    map[m][n]=map1[m][n];
                    break;
                case 2:
                    map[m][n]=map2[m][n];
                    break;
                case 3:
                    map[m][n]=map3[m][n];
                    break;
                case 4:
                    map[m][n]=map4[m][n];
                    break;
                case 5:
                    map[m][n]=map5[m][n];
                    break;
                case 6:
                    map[m][n]=map6[m][n];
                    break;
                case 7:
                    map[m][n]=map7[m][n];
                    break;
                case 8:
                    map[m][n]=map8[m][n];
                    break;
                case 9:
                    map[m][n]=map9[m][n];
                    break;
                case 10:
                    map[m][n]=map10[m][n];
                    break;
                case 11:
                    map[m][n]=map11[m][n];
                    break;
                case 12:
                    map[m][n]=map12[m][n];
                    break;
                case 13:
                    map[m][n]=map13[m][n];
                    break;
                case 14:
                    map[m][n]=map14[m][n];
                    break;
                case 15:
                    map[m][n]=map15[m][n];
                    break;
                case 16:
                    map[m][n]=map16[m][n];
                    break;
                case 17:
                    map[m][n]=map17[m][n];
                    break;
                case 18:
                    map[m][n]=map18[m][n];
                    break;
                }


            }
        }
        mapNumWait=false;


    }


}
void DrawMap()
{


    //用for迴圈遍歷二維陣列
    for(int i=0; i<14; i++)
    {
        coord.X =2;
        coord.Y =i+4;
        SetConsoleCursorPosition( hOutBuf, coord );


        for(int j=0; j<16; j++)
        {


            switch(map[i][j])
            {
            case 0:
                //printf("  ");//空兩格對應一個全形符
                WriteConsole(hOutBuf, "  ", strlen("  "), NULL, NULL);
                break;
            case 1:
                //printf("■");
                WriteConsole(hOutBuf, "■", strlen("■"), NULL, NULL);
                break;
            case 3:
                //printf("◎");
                WriteConsole(hOutBuf, "+", strlen("+"), NULL, NULL);
                break;
            case 4:
                //printf("□");
                WriteConsole(hOutBuf, "□", strlen("□"), NULL, NULL);
                break;
            case 5:
                //printf("♀");
                WriteConsole(hOutBuf, "♀", strlen("♀"), NULL, NULL);
                break;
            case 7:
                //printf("¤");
                WriteConsole(hOutBuf, "¤", strlen("¤"), NULL, NULL);
                break;      //若不用break則執行case8打印出"♀" 出錯!
            case 8:
                //printf("♀");
                WriteConsole(hOutBuf, "♀", strlen("♀"),  NULL, NULL);
                break;


            }
        }
        //printf("\n");
        WriteConsole(hOutBuf, "\n", strlen("\n"), NULL, NULL);
        coord.X =2;
        coord.Y =4;
    }
}
void PlayGame()
{
    char ch;
    int pRow,pCol;//人的行和列
    int i,j;
    //時時刻刻得到人的下標,
    for (i=0; i<14; i++)
    {
        for(j=0; j<16; j++)
        {
            if(map[i][j]==5||map[i][j]==8)
            {
                pRow=i;
                pCol=j;
                break;//此break只能跳出第一個for迴圈
            }
        }
        if(map[i][j]==5||map[i][j]==8)//此句跳出第二個for迴圈 不可有goto語句
            break;


    }


    ch=getch();//getchar()接收字元,顯示迴文件 在按下回車的時候結束。
    //getch()接收字元    不顯示迴文件直接接收。
    switch(ch)
    {
    case 'W':
    case 'w':
    case 72:
        if(map[pRow-1][pCol]==0||map[pRow-1][pCol]==3)
        {
            map[pRow-1][pCol]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow-1][pCol]==4||map[pRow-1][pCol]==7)//人的前面是箱子
        {
            if(map[pRow-2][pCol]==0||map[pRow-2][pCol]==3)//判斷箱子的前面為空或目標
            {
                map[pRow-2][pCol]+=4;
                map[pRow-1][pCol]+=1;
                map[pRow][pCol]-=5;
            }
        }


        break;
    case 'S':
    case 's':
    case 80:
        if(map[pRow+1][pCol]==0||map[pRow+1][pCol]==3)
        {
            map[pRow+1][pCol]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow+1][pCol]==4||map[pRow+1][pCol]==7)
        {
            if(map[pRow+2][pCol]==0||map[pRow+2][pCol]==3)
            {
                map[pRow+2][pCol]+=4;
                map[pRow+1][pCol]+=1;
                map[pRow][pCol]-=5;
            }
        }
        break;
    case 'A':
    case 'a':
    case 75:
        if(map[pRow][pCol-1]==0||map[pRow][pCol-1]==3)
        {
            map[pRow][pCol-1]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow][pCol-1]==4||map[pRow][pCol-1]==7)
        {
            if(map[pRow][pCol-2]==0||map[pRow][pCol-2]==3)
            {
                map[pRow][pCol-2]+=4;
                map[pRow][pCol-1]+=1;
                map[pRow][pCol]-=5;
            }
        }
        break;
    case 'D':
    case 'd':
    case 77:
        if(map[pRow][pCol+1]==0||map[pRow][pCol+1]==3)
        {
            map[pRow][pCol+1]+=5;
            map[pRow][pCol]-=5;
        }
        else if(map[pRow][pCol+1]==4||map[pRow][pCol+1]==7)
        {
            if(map[pRow][pCol+2]==0||map[pRow][pCol+2]==3)
            {
                map[pRow][pCol+2]+=4;
                map[pRow][pCol+1]+=1;
                map[pRow][pCol]-=5;
            }
        }
        break;
    case '=':
        mapNumGoing=mapNumGoingC;
        mapNumWait=true;
        nextm=true;
        iox=0;
        break;
    case 0xe://0xe是ctrl+N的鍵值
        nextK=false;
        jox=iox;
        break;
    default:
        break;;
    }
    return;
}
void nextMap()
{


    if(nextm)
    {
        for(int m=0; m<14; m++)
        {
            for(int n=0; n<16; n++)
            {
                if(map[m][n]==3||map[m][n]==7)
                {
                    iox++;


                }
            }
        }
        nextm=false;
    }
    if(nextK)
    {
        jox=0;
        for(int i=0; i<14; i++)
        {


            for(int j=0; j<16; j++)
            {
                if(map[i][j]==7)
                {
                    jox++;


                }
            }
        }
    }
    if(jox==iox)
    {
        if(mapNumGoing<18)
        {
            mapNumGoing++;
        }
        mapNumGoingC=mapNumGoing;
        mapNumWait=true;
        nextm=true;
        nextK=true;
        iox=0;
        textc=true;
        Sleep(2000);
        DrawMapBase();
        DrawMap();
        ReadConsoleOutputCharacterA(hOutBuf, data, 720, coord, &bytes);
        Sleep(30);
        WriteConsoleOutputCharacterA(hOutput, data,720, coord, &bytes);
        nextMap();//函式呼叫順序很重要,若放最後,會有推箱未完就換圖之狀
        TextChange();
    }
}


void TextManage()
{
    WriteConsole(hOutBuf, "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┃************************推箱子**************************┃\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┣━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┫\n", stra,  NULL, NULL);
    for(int h=0; h<15; h++)
    {
        WriteConsole(hOutBuf, "┃                                ┃                      ┃\n", stra,  NULL, NULL);
    }


    WriteConsole(hOutBuf, "┣━━━━━━━━━━━━━━━━┻━━━━━━━━━━━┫\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┃推箱程序:推箱新手,開始吧!生命不息,推箱不止!        ┃\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┃遊戲操作:按下“=”鍵,重新開始當前關                   ┃\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┃作    者:零千刻****************************************┃\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┃程式碼要點:關卡框架;控制檯消除閃爍。********************┃\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┃關卡設計:參考易語言例程推箱子;程式碼:參考網路資源******┃\n", stra,  NULL, NULL);
    WriteConsole(hOutBuf, "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛", stra,  NULL, NULL);
    coord.X =36;
    coord.Y =4;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "關卡:第 一 關", strlen("關卡:第 一 關"),  NULL, NULL);
    coord.Y =6;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "稱號:推箱新手", strlen( "稱號:推箱新手"),  NULL, NULL);
    //新手,識途,有成,悟心,得道,仙人
    coord.Y =8;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "操作:按鍵WSAD或wsad", strlen("操作:按鍵WSAD或wsad"),  NULL, NULL);
    coord.Y =9;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "      或↑↓→←", strlen("      或↑↓→←"),  NULL, NULL);
    coord.Y =11;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "說明:所有 □ 推至 十", strlen("說明:所有 □ 推至 十"),  NULL, NULL);
    coord.Y =12;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "    共十八關,難度遞增", strlen("    共十八關,難度遞增"),  NULL, NULL);
    coord.Y =13;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "    目標達成,推箱仙人", strlen("    目標達成,推箱仙人"),  NULL, NULL);
    coord.Y =15;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, "激勵:做得到,做得好!", strlen( "激勵:做得到,做得好!"),  NULL, NULL);
}
void stopFlash()
{
    coord.X =52;
    coord.Y =4;
    SetConsoleCursorPosition( hOutBuf, coord );
    WriteConsole(hOutBuf, " ", strlen(" "),  NULL, NULL);//初行閃爍,用空代替。防閃
}
void TextChange()
{
    if(textc)
    {
        switch(mapNumGoing)
        {
        case 2:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 二", strlen(" 二"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱識途", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱識途,好的開始,向前向前!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 3:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 三", strlen(" 三"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱識途", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱識途,略有進步,努力努力!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 4:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 四", strlen(" 四"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱識途", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱識途,大有進步,向前向前!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 5:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 五", strlen(" 五"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱識途", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱識途,即將升級,過關過關!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 6:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 六", strlen(" 六"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱有成", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱有成,不忘初心,方得始終!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 7:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 七", strlen(" 六"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱有成", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱有成,萬里長城推不倒!                ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 8:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 八", strlen(" 六"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱有成", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱有成,千里黃河水滔滔!                ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 9:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 九", strlen(" 六"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱有成", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱有成,江山秀麗,疊彩峰嶺!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 10:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, " 十", strlen(" 六"),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱悟心", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱悟心,天地任我行,實力在先!          ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 11:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十一", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱悟心", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱悟心,推箱不語,正悟心得!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 12:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十二", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱悟心", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱悟心,新的境界,感悟期待!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 13:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十三", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱得道", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱得道,道可道,非常道,莫言!          ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 14:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十四", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱得道", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱得道,一生二,二生三,三生萬物!      ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 15:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十五", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱得道", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱得道,若要昇仙,先過此關!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 16:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十六", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱仙人", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱仙人,有仙術,ctrl+ n 跳到下一關!!  ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 17:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十七", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱仙人", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱仙人,飛昇雲天,勝利在望!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        case 18:
            coord.X =44;
            coord.Y =4;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "十八", strlen(" 六 "),  NULL, NULL);
            coord.X =36;
            coord.Y =6;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf, "稱號:推箱仙人", strlen( "稱號:推箱識途"),  NULL, NULL);
            coord.X =12;
            coord.Y =19;
            SetConsoleCursorPosition( hOutBuf, coord );
            WriteConsole(hOutBuf,"推箱仙人,天地變色,眾生膜拜!            ", strlen( "推箱識途,好的開始,向前向前!            "),  NULL, NULL);
            break;
        }
        textc=false;
    }
}

地圖檔案,只貼一關,做測試用:

//mapfile.cpp

int map1[14][16]=

{

{0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,1,1,0,0,0,0,0,0,0},//0空白

{0,0,1,0,0,0,1,0,0,0,0,0,0,0},//1

{0,0,1,0,4,0,1,0,1,1,1,0,0,0},//3目標

{0,0,1,0,4,5,1,0,1,3,1,0,0,0},//4箱子

{0,0,1,1,1,4,1,1,1,3,1,0,0,0},//5角色

{0,0,0,1,1,0,0,0,0,3,1,0,0,0},

{0,0,0,1,0,0,0,1,0,0,1,0,0,0},

{0,0,0,1,0,0,0,1,1,1,1,0,0,0},

{0,0,0,1,1,1,1,1,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0,0,0,0,0,0,0}

};

更多關卡參見完整專案資源,

完整專案程式碼資源參見以下連結:

有很奇怪的問題請教高人,

在CodeBlocks中編繹時,為什麼release能通過,而debug卻不能通過?

無意中發現的,找不到原因,好糾結!

程式有小bug,跳關後,有時程式會失靈,請高人指教!!