1. 程式人生 > 其它 >C語言在螢幕的任意位置輸出字元,開發貪吃蛇遊戲的第一步

C語言在螢幕的任意位置輸出字元,開發貪吃蛇遊戲的第一步

初學程式設計的讀者,肯定很想編寫出一個遊戲來秀一下,貪吃蛇就是C語言小遊戲中經典的一個,本教程的目標也是帶著大家做出這款遊戲,你可以猛擊《C語言貪吃蛇遊戲演示和說明》瞭解更多。

編寫遊戲的第一步就是搞定游標定位問題,這樣你的程式就可以隨心所欲、按任意順序、在任意位置輸出了。但是,C語言本身並不支援該功能,我們必須使用 Windows 提供的介面,所以要引入 windows.h 標頭檔案。

因為用到了 Windows 作業系統的功能,所以本節的程式碼不能在 Linux 和 Mac OS 下執行。
所謂 Windows 介面,就是 Windows 這個作業系統本身提供的函式,它們都是以C語言的形式呈現的,只要我們引入了 windows.h 標頭檔案,就可以呼叫這些函式,使用 Windows 提供的強大功能了。
因為涉及到了 Windows 程式設計,所以本節的內容不要求大家深入理解,能按照葫蘆畫瓢就可以,以後如果決定專攻 Windows 程式設計了,再來深入研究也不遲。
游標定位需要使用 windows.h 標頭檔案中的SetConsoleCursorPosition函式,它的使用方式為: SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD  dwCursorPosition);

hConsoleOutput表示控制檯緩衝區控制代碼,可通過GetStdHandle(STD_OUTPUT_HANDLE)來獲得;dwCursorPosition是游標位置,也就是第幾行第幾列,它是 COORD 型別的結構體。

看不懂是吧?嗯,沒關係,我知道大部分讀者都看不懂,所以,照著葫蘆畫瓢吧。

例如,將游標定位到控制檯的第3行第3列:

  • //定義游標位置
  • COORD coord;
  • coord.X = 3; //第3行
  • coord.Y = 3; //第3列
  • //獲取控制檯緩衝區控制代碼,固定寫法
  • HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  • //設定游標位置,固定寫法
  • SetConsoleCursorPosition(ConsoleHandle, coord);

這樣,程式就可以從第3行第3列開始輸出了。

將程式碼補充完整:

  • #include <stdio.h>
  • #include <windows.h>
  • int main(){
  • //定義游標位置
  • COORD coord;
  • coord.X = 3; //第3行
  • coord.Y = 3; //第3列
  • //獲取控制檯緩衝區控制代碼
  • HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  • //設定游標位置
  • SetConsoleCursorPosition(ConsoleHandle, coord);
  • printf("123");
  • return 0;
  • }

執行結果:

注意:視窗的左上角是第 0 行第 0 列,而不是我們通常所認為的第 1 行第 1 列。程式語言中的很多計數都是從 0 開始的,而不是從 1 開始。

搞定了游標重定位,你就可以將輸出順序打亂了,想在哪裡輸出就在哪裡輸出。例如:

  • #include <stdio.h>
  • #include <windows.h>
  • //設定游標位置
  • void setCursorPosition(int x, int y);
  • //設定文字顏色
  • void setColor(int color);
  • int main(){
  • setColor(3);
  • setCursorPosition(3, 3);
  • puts("★");
  • setColor(0XC);
  • setCursorPosition(1, 1);
  • puts("◆");
  • setColor(6);
  • setCursorPosition(6, 6);
  • puts("■");
  • return 0;
  • }
  • //自定義的游標定位函式
  • void setCursorPosition(int x, int y){
  • COORD coord;
  • coord.X = x;
  • coord.Y = y;
  • SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  • }
  • //自定義的文字顏色函式
  • void setColor(int color){
  • SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) ;
  • }

執行結果:

 可以發現,先輸出的字元位置不一定靠前,後輸出的字元位置不一定靠後,它們都可以在任意位置。