[TOC]html
貪吃蛇起源於西方,來自於蛇騙夏娃和亞當偷吃禁果的神話。人們爲了說明蛇的一個「貪」字,開發出了貪吃蛇遊戲。本公開課使用C語言開發一個貪吃蛇遊戲。windows
貪吃蛇最初爲人們所知的是諾基亞手機附帶的一個小遊戲,它伴隨着諾基亞手機走向世界。如今的貪吃蛇出現了許多衍生版本,並被移植到各類平臺上。函數
經過本公開課的學習,你們能夠學到:學習
Visual Studio 2017開發環境測試
C語言中的三大結構和函數字體
C語言中動態內存申請和釋放spa
C語言中文件基本操做設計
C語言中的簡單單向鏈表3d
控制終端基本設置和監聽按鍵調試
C語言簡單遊戲開發流程
C語言簡單遊戲開發調試技巧
貪吃蛇的遊戲規則也很簡單,具體爲:蛇出如今封閉的空間中,同時在地圖上會隨機出現食物,玩家經過鍵盤上的上下左右方向鍵來控制蛇的前進方向。蛇頭撞到食物,則食物消失,表示被蛇吃掉了,蛇身增長一節,增長玩家的得分。接着又隨機出現一個食物,等待蛇來吃。若是蛇在前進的過程當中撞到牆或者咬到蛇身或者玩家按下ESC鍵,則遊戲退出。
項目演示
歡迎界面以下
SetConsoleTextAttribute函數介紹
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes); 功能:設置控制檯文本屬性(顏色),能夠設置前景色FOREGROUND(文本顏色)和背景色BACKGROUND
參考示例:
HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 獲取標註輸出句柄 */ SetConsoleTextAttribute(hOut, FOREGROUND_BLUE); /* 設置控制檯顏色,前景色爲藍色*/ SetConsoleTextAttribute(hOut, BACKGROUND_RED); /* 背景色爲紅色 */
SetConsoleCursorPosition函數介紹
BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD dwCursorPosition); 功能:設置控制檯光標座標
SetConsoleCursorPosition官方文檔介紹
參考示例:
COORD pos = {x, y};/* x是橫座標 y是縱座標 */ HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 獲取標註輸出句柄 */ SetConsoleCursorPosition(hOut,pos); /* 設置控制檯光標座標(設備句柄, 光標座標) */
//設置終端字體顏色 int setColor(int c) { //GetStdHandle: 獲取指定的標準設備的句柄 //STD_OUTPUT_HANDLE 標準輸出句柄 //c 顏色值 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); return 0; }
十進制顏色對照表
//設置光標的座標 int gotoXY(int x, int y) { COORD c; //設置橫座標 c.X = x; //設置縱座標 c.Y = y; //設置光標的位置 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); return 0; }
參考代碼:
//繪製字符畫 --蛇 int printSnake(void) { //清屏 system("cls"); gotoXY(35, 1); setColor(6); printf("/^\\/^\\"); //蛇眼睛 gotoXY(34, 2); printf("|__| O|"); //蛇眼睛 gotoXY(33, 2); setColor(2); printf("_"); gotoXY(25, 3); setColor(12); printf("\\/"); //蛇信 gotoXY(31, 3); setColor(2); printf("/"); gotoXY(37, 3); setColor(6); printf(" \\_/"); //蛇眼睛 gotoXY(41, 3); setColor(10); printf(" \\"); gotoXY(26, 4); setColor(12); printf("\\____"); //舌頭 gotoXY(32, 4); printf("_________/"); gotoXY(31, 4); setColor(2); printf("|"); gotoXY(43, 4); setColor(10); printf("\\"); gotoXY(32, 5); setColor(2); printf("\\_______"); //蛇嘴 gotoXY(44, 5); setColor(10); printf("\\"); gotoXY(39, 6); printf("| | \\"); //下面都是畫蛇身 gotoXY(38, 7); printf("/ / \\"); gotoXY(37, 8); printf("/ / \\ \\"); gotoXY(35, 9); printf("/ / \\ \\"); gotoXY(34, 10); printf("/ / \\ \\"); gotoXY(33, 11); printf("/ / _----_ \\ \\"); gotoXY(32, 12); printf("/ / _-~ ~-_ | |"); gotoXY(31, 13); printf("( ( _-~ _--_ ~-_ _/ |"); gotoXY(32, 14); printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /"); gotoXY(33, 15); printf("~-_ _-~ ~-_ _-~"); gotoXY(35, 16); printf("~--______-~ ~-___-~"); return 0; }
測試代碼以下:
int main() { //設置控制檯的寬高 system("mode con cols=100 lines=30"); printSnake(); system("pause"); return 0; }
測試效果以下:
界面設計分析
參考代碼:
//歡迎界面 int welcomGame(void) { int i; int j; int n = 0; //繪製字符畫蛇 printSnake(); //輸出文字 setColor(11); gotoXY(45, 18); printf("貪吃蛇遊戲"); setColor(14); //邊框範圍20--26行 27--74列 for (i = 20; i <= 26; i++) { for (j = 27; j <= 74; j++) { gotoXY(j, i); if (i == 20 || i == 26) { printf("-"); } else if (j == 27 || j == 74) { printf("|"); } } } setColor(12); gotoXY(35, 22); printf("1. 開始遊戲"); gotoXY(55, 22); printf("2. 遊戲說明"); gotoXY(35, 24); printf("3. 退出遊戲"); gotoXY(27, 27); printf("請選擇[1 2 3]: "); scanf("%d", &n); //清空換行符 getchar(); return n; }
主函數參考代碼以下:
int main() { int choice; //設置控制檯的寬高 system("mode con cols=100 lines=30"); while (1) { choice = welcomGame(); switch (choice) { //開始遊戲 case 1: printf("開始遊戲"); break; //遊戲說明 case 2: printf("遊戲說明"); break; //退出遊戲 case 3: break; default: setColor(12); gotoXY(45, 28); printf("請作出有效選擇[1~3]"); //輸入任意鍵 getchar(); } } system("pause"); return 0; }
遊戲說明模塊以下:
遊戲幫助界面參考代碼
//遊戲幫助界面 int aboutGame(void) { int i = 0; int j = 0; //清屏 system("cls"); setColor(13); gotoXY(44, 3); printf("遊戲說明"); setColor(2); //畫出邊框 //6~22行 20~75列 for (i = 6; i <= 22; i++) { for (j = 20; j <= 75; j++) { gotoXY(j, i); //畫上下邊框 if (i == 6 || i == 22) { printf("="); } else if (j == 20 || j == 75) { printf("||"); } } } setColor(3); gotoXY(30, 8); printf("★ 1.不能撞到牆壁,不能咬到本身"); setColor(5); gotoXY(30, 11); printf("★ 2.F1加速前進,F2減速前進"); setColor(11); gotoXY(30, 14); printf("★ 3.使用空格暫停遊戲和繼續遊戲"); setColor(13); gotoXY(30, 17); printf("★ 4.使用方向鍵控制前進的方向"); setColor(14); gotoXY(30, 20); printf("★ 5.按下ESC鍵退出遊戲"); setColor(12); gotoXY(22, 24); printf("按下回車鍵返回主界面..."); getchar(); return 0; }
主函數代碼修改以下:
int main() { int choice; //設置控制檯的寬高 system("mode con cols=100 lines=30"); while (1) { choice = welcomGame(); switch (choice) { //開始遊戲 case 1: printf("開始遊戲"); break; //遊戲說明 case 2: aboutGame(); break; //退出遊戲 case 3: break; default: setColor(12); gotoXY(45, 28); printf("請作出有效選擇[1~3]"); //輸入任意鍵 getchar(); } } system("pause"); return 0; }
在主菜單中, 當用戶選擇3的時候,直接退出遊戲
在主函數case 3中添加以下代碼:
//退出遊戲 case 3: exit(0); break;
大學生C/C++開發交流羣
原文出處:https://www.cnblogs.com/szitcast/p/11081773.html