天天看點

VS2015貪吃蛇代碼分析(10-1)點我下載下傳源代碼1 歡迎界面的實作

點我下載下傳源代碼

打開貪吃蛇程式,第一個界面是歡迎界面,如圖1所示。

VS2015貪吃蛇代碼分析(10-1)點我下載下傳源代碼1 歡迎界面的實作

圖1 歡迎界面

按下任意鍵後,進入遊戲按鍵介紹界面,如圖2所示。

VS2015貪吃蛇代碼分析(10-1)點我下載下傳源代碼1 歡迎界面的實作

圖2 按鍵控制界面

按下任意鍵後進入遊戲界面,可以通過按鍵對貪吃蛇進行控制,如圖3所示。

VS2015貪吃蛇代碼分析(10-1)點我下載下傳源代碼1 歡迎界面的實作

圖3 遊戲界面

1 歡迎界面的實作

從圖1中可以看出,歡迎界面實際上就是通過輸出函數printf()輸出歡迎資訊。隻是在輸出資訊時,需要設定顯示的位置。可以通過控制光标的位置來設定顯示資訊的位置。

1.1 MySetCursorPosition()函數

通過自定義函數MySetCursorPostion()函數來設定光标的位置。

bool MySetConsoleCursorPosition(int x, int y)

{

return true;

}
           

其中,參數x和y分别表示要設定光标位置的橫坐标和縱坐标。如果成功設定,則傳回值是true,否則為false。

1.1.1 擷取控制台輸出視窗的句柄

要想設定光标在控制台輸出視窗的位置,首先要擷取該視窗的句柄。可以通過GetStdHandle()函數擷取控制台輸出視窗的句柄。該函數的格式為

HANDLE WINAPI GetStdHandle(DWORD nStdHandle );
           

GetStdHandle()函數的作用是擷取指定的标準裝置(包括輸入裝置、輸出裝置或者顯示錯誤的裝置)的句柄。該函數的參數指定了要擷取句柄的标準裝置,傳回值是指定标準裝置的句柄。

擷取控制台輸出視窗句柄的代碼如下所示。

HANDLE handle_console = GetStdHandle(STD_OUTPUT_HANDLE);

if( INVALID_HANDLE_VALUE == handle_console)

{

return false;

}
           

其中,GetStdHandle()函數的參數STD_OUTPUT_HANDLE指定了要擷取的标準裝置是控制台輸出視窗的句柄。如果函數執行成功,則變量handle_console儲存了擷取到的視窗句柄,否則,handle_console的值是INVALID_HANDLE_VALUE。

1.1.2 設定控制台視窗中光标位置

(1)SetConsoleCursorPosition()函數格式

可以通過API函數SetConsoleCursorPosition()來設定控制台視窗中光标位置。該函數的格式為

BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD  dwCursorPosition );
           

其中,參數hConsoleOutput是控制台輸出視窗的句柄,dwCursorPostion是要設定光标的位置。如果成功的設定了光标的位置,則SetConsoleCursorPosition()傳回值是非零,否則為零。

(2)COORD結構

需要注意的是,SetConsoleCursorPosition()函數的第二個參數dwCursorPostion的類型是COORD結構,該結構定義了控制台螢幕緩沖區中的字元單元(character cell)的坐标,定義如下所示。

typedef struct _COORD

{

SHORT X;

SHORT Y;

} COORD, *PCOORD;
           

其中,x和y分表表示橫坐标和縱坐标。該坐标的原點(0,0)位于控制台螢幕的左上角。

(3)相關代碼

通過SetConsoleCursorPosition()設定光标位置的代碼如下所示。

COORD coord;

coord.X = x;

coord.Y = y;

if(SetConsoleCursorPosition(handle_console, coord))

{

return true;

}

else

{

return false;

}
           

其中,x和y是自定義函數MySetCursorPosition()函數的參數;handle_console是在“1.1.1擷取控制台輸出視窗的句柄”中擷取到的控制台輸出視窗的句柄。如果設定光标位置成功,則傳回true,否則為false。