大家好,又見面了,我是你們的朋友全棧
int main(){ Init();//初始化while (!die){ ProcessKey();//處理按鍵Move();//移動蛇Judge();//碰撞檢測Draw();//畫圖Sleep(snack.timeperstep);//延時}while (_getch() != 27);//游戲結束后按esc退出}
void Init(){ SetConsoleTitleW(L"貪吃蛇");system("MODE CON: COLS=64 LINES=32");snack.body.push_back(new COORD{ 15,15});snack.body.push_back(new COORD{ 14,15 });GenerateFood();}
這里有坑,方向鍵會產生兩個鍵碼,所以要用兩次getch。方向鍵會先產生-32鍵碼,然后產生72 75 77 80這四個鍵碼中的一個
void ProcessKey(){ Direction before = snack.heading;snack.timeperstep = 1000 / snack.body.size();char ch1, ch2;while (_kbhit()){ ch1 = _getch();switch (ch1){ case VK_ESCAPE:if (_getch() == 27)exit(0);break;case -32:switch (ch2 = _getch()){ case 72://upif (Direction::down != before)snack.heading = Direction::up;break;case 80://downif (Direction::up != before)snack.heading = Direction::down;break;case 75://leftif (Direction::right != before)snack.heading = Direction::left;break;case 77://rightif (Direction::left != before)snack.heading = Direction::right;}break;case VK_SPACE:snack.timeperstep = snack.timeperstep = 300 / snack.body.size();;}}}
這里只是把頭往前移動了一格
void Move(){ COORD* head = snack.body.front();switch (snack.heading){ case Direction::up:snack.body.push_front(new COORD{ head->X,head->Y - 1 });break;case Direction::down:snack.body.push_front(new COORD{ head->X,head->Y + 1 });break;case Direction::left:snack.body.push_front(new COORD{ head->X - 1,head->Y });break;case Direction::right:snack.body.push_front(new COORD{ head->X + 1,head->Y });break;}}
判斷頭有沒有和食物、墻、身體重疊。這里的坑就是判斷身體的時候,一定要掐頭去尾來判斷
void Judge(){ COORD* head = snack.body.front();if (food.X == head->X && food.Y == head->Y)GenerateFood();else if (head->X < 0 || head->Y < 0 || head->X == 30 || head->Y == 30)die = true;else{ delete snack.body.back();snack.body.pop_back();for (list<COORD*>::iterator i = ++snack.body.begin(); i != snack.body.end(); i++){ if ((*i)->X == head->X && (*i)->Y == head->Y)die = true;}}}
用緩沖,先把要輸出到屏幕的東西寫道緩沖區,解決屏閃。大致順序是先畫墻,再畫食物,再畫蛇,如果蛇死了就再畫一個lost
void Draw(){ HANDLE houtbuf = CreateConsoleScreenBuffer(GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);CONSOLE_CURSOR_INFO cci{ 25,0 };SetConsoleCursorInfo(houtbuf, &cci);DWORD NumberOfCharsWritten;COORD coord;coord.Y = 0;for (coord.X = 0; coord.X < 64; coord.X += 2){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.Y = 31;for (coord.X = 0; coord.X < 64; coord.X += 2){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.X = 0;for (coord.Y = 0; coord.Y < 32; coord.Y++){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.X = 62;for (coord.Y = 0; coord.Y < 32; coord.Y++){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.Y = food.Y + 1;coord.X = (food.X + 1) * 2;FillConsoleOutputAttribute(houtbuf, FOREGROUND_BLUE, 2, coord, &NumberOfCharsWritten);WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);for (COORD* node : snack.body){ coord.X = (1 + node->X) * 2;coord.Y = 1 + node->Y;FillConsoleOutputAttribute(houtbuf, FOREGROUND_GREEN, 2, coord, &NumberOfCharsWritten);WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}if (die){ coord.Y = 16;coord.X = 28;FillConsoleOutputAttribute(houtbuf, FOREGROUND_RED, 8, coord, &NumberOfCharsWritten);WriteConsoleOutputCharacterW(houtbuf, L"##LOST##", 8, coord, &NumberOfCharsWritten);die = true;}SetConsoleActiveScreenBuffer(houtbuf);}
用來生成一個和蛇身不重疊的食物
void GenerateFood(){ unfished:food.X = rand() % 30;food.Y = rand() % 30;for (COORD* node : snack.body){ if (node->X == food.X && node->Y == food.Y)goto unfished;}}
#include <Windows.h>#include <iostream>#include <cstdlib>#include <conio.h>#include <list>using namespace std;enum Direction { up, down, left, right };struct { list<COORD*> body;Direction heading = Direction::right;int timeperstep;}snack;COORD food;bool die;void ProcessKey(){ Direction before = snack.heading;snack.timeperstep = 1000 / snack.body.size();char ch1, ch2;while (_kbhit()){ ch1 = _getch();switch (ch1){ case VK_ESCAPE:if (_getch() == 27)exit(0);break;case -32:switch (ch2 = _getch()){ case 72://upif (Direction::down != before)snack.heading = Direction::up;break;case 80://downif (Direction::up != before)snack.heading = Direction::down;break;case 75://leftif (Direction::right != before)snack.heading = Direction::left;break;case 77://rightif (Direction::left != before)snack.heading = Direction::right;}break;case VK_SPACE:snack.timeperstep = snack.timeperstep = 300 / snack.body.size();;}}}void Draw(){ HANDLE houtbuf = CreateConsoleScreenBuffer(GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);CONSOLE_CURSOR_INFO cci{ 25,0 };SetConsoleCursorInfo(houtbuf, &cci);DWORD NumberOfCharsWritten;COORD coord;coord.Y = 0;for (coord.X = 0; coord.X < 64; coord.X += 2){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.Y = 31;for (coord.X = 0; coord.X < 64; coord.X += 2){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.X = 0;for (coord.Y = 0; coord.Y < 32; coord.Y++){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.X = 62;for (coord.Y = 0; coord.Y < 32; coord.Y++){ WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}coord.Y = food.Y + 1;coord.X = (food.X + 1) * 2;FillConsoleOutputAttribute(houtbuf, FOREGROUND_BLUE, 2, coord, &NumberOfCharsWritten);WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);for (COORD* node : snack.body){ coord.X = (1 + node->X) * 2;coord.Y = 1 + node->Y;FillConsoleOutputAttribute(houtbuf, FOREGROUND_GREEN, 2, coord, &NumberOfCharsWritten);WriteConsoleOutputCharacterW(houtbuf, L"■", 1, coord, &NumberOfCharsWritten);}if (die){ coord.Y = 16;coord.X = 28;FillConsoleOutputAttribute(houtbuf, FOREGROUND_RED, 8, coord, &NumberOfCharsWritten);WriteConsoleOutputCharacterW(houtbuf, L"##LOST##", 8, coord, &NumberOfCharsWritten);die = true;}SetConsoleActiveScreenBuffer(houtbuf);}void GenerateFood(){ unfished:food.X = rand() % 30;food.Y = rand() % 30;for (COORD* node : snack.body){ if (node->X == food.X && node->Y == food.Y)goto unfished;}}void Init(){ SetConsoleTitleW(L"貪吃蛇");system("MODE CON: COLS=64 LINES=32");snack.body.push_back(new COORD{ 15,15});snack.body.push_back(new COORD{ 14,15 });GenerateFood();}void Move(){ COORD* head = snack.body.front();switch (snack.heading){ case Direction::up:snack.body.push_front(new COORD{ head->X,head->Y - 1 });break;case Direction::down:snack.body.push_front(new COORD{ head->X,head->Y + 1 });break;case Direction::left:snack.body.push_front(new COORD{ head->X - 1,head->Y });break;case Direction::right:snack.body.push_front(new COORD{ head->X + 1,head->Y });break;}}void Judge(){ COORD* head = snack.body.front();if (food.X == head->X && food.Y == head->Y)GenerateFood();else if (head->X < 0 || head->Y < 0 || head->X == 30 || head->Y == 30)die = true;else{ delete snack.body.back();snack.body.pop_back();for (list<COORD*>::iterator i = ++snack.body.begin(); i != snack.body.end(); i++){ if ((*i)->X == head->X && (*i)->Y == head->Y)die = true;}}}int main(){ Init();while (!die){ ProcessKey();Move();Judge();Draw();Sleep(snack.timeperstep);}while (_getch() != 27);}
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
197145.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
edge瀏覽器進不去知網什么原因?因為用戶輸入了錯誤的賬號和密碼,會導致用戶無法 我登錄不了知網。用戶可以在登錄界面點擊忘記密碼,根據提示輸入新密碼,這樣用戶就可以修改知網賬號的密碼了。microsoft edge怎么打不開?你能解決的問題。;不要使用邊緣瀏覽器:1.右鍵單擊 "這臺電腦 "。在菜單欄中,單擊屬性。edge無法正常啟動?首先,注意清理瀏覽器 s緩存,并盡可能刪除緩存中的圖片和視頻,...
epson630k打印機與win10不兼容?懷疑是打印機服務關閉了點擊Win10系統開始菜單,選擇彈出菜單的控制面板在控制面板里點擊管理工具點擊管理工具窗口的服務在服務對話框里通過按下字母P,快速找到打印機服務,即名為Print Spooler的打印機服務。選中打印機服務后,在左邊可以選擇停止,或者重啟服務?;蛘唠p擊Print Spooler打印機服務,在彈出Print Spooler屬性對話框里...
QQ郵箱怎么在回復里面發自定義圖片或附件?1、填寫好好收件人和郵件主題。2、接下來我們再點直接添加附件。3、附件上傳最終后我們就是可以點擊你的郵箱了。qq游戲怎么設置照片秀?1、首先,不使用自己的的帳號登錄游戲大廳,然后點擊游戲大廳中的“設置里”。QQ郵箱怎么發送圖片文件?幫忙解決郵箱怎莫正在發送圖片文件的步驟追加:1.首先,我們要登錄自己的,登陸賬號完成之后,我們這個可以點擊主界面中信封的圖標。...