點我下載下傳源代碼
打開貪吃蛇程式,第一個界面是歡迎界面,如圖1所示。
圖1 歡迎界面
按下任意鍵後,進入遊戲按鍵介紹界面,如圖2所示。
圖2 按鍵控制界面
按下任意鍵後進入遊戲界面,可以通過按鍵對貪吃蛇進行控制,如圖3所示。
圖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。