easyx圖形庫基礎4:貪吃蛇

貪吃蛇

  • 一實現貪吃蛇:
    • 1.繪制網格:
    • 1.繪制蛇:
    • 3.控制蛇的默認移動向右:
    • 4.控制蛇的移動方向:
    • 5.生成食物
    • 6.判斷蛇吃到食物并且長大。
    • 7.判斷游戲結束:
    • 8.重置函數:
  • 二整體代碼:

一實現貪吃蛇:

1.繪制網格:

請添加圖片描述

#define wide 800
#define high 600#define Frame 20//1.繪制邊框
void DrawFrame()
{setlinecolor(BLACK);setlinestyle(PS_SOLID, 1);for (int i = 1; i < wide / Frame; i++){line(Frame * i, 0, Frame * i, 600);}for (int i = 1; i < high / Frame; i++){line(0, Frame * i,800 , Frame * i);}
}

1.繪制蛇:

請添加圖片描述

int main()
{initgraph(wide,high);setbkcolor(RGB(188, 227, 245));cleardevice();//初始化蛇的長度int length = 5;//初始化蛇的坐標:sn snake[5] = { {7,6} ,{6,6}, {5,6},{4,6},{3,6} };while (1){cleardevice();BeginBatchDraw();//1.繪制邊框DrawFrame();//2.繪制蛇DrawSnake(snake,length);FlushBatchDraw();Sleep(40);}EndBatchDraw();getchar();closegraph();return 0;
}
//2.繪制蛇
void DrawSnake(sn* snake,int length)
{setfillcolor(GREEN);for (int i = 0; i < length; i++){//先繪制頭int x1 = snake[i].x;int y1 = snake[i].y;solidrectangle(x1 * Frame, y1 * Frame, (x1 + 1) * Frame, (y1 + 1) * Frame);}
}

3.控制蛇的默認移動向右:

請添加圖片描述

void SnakeMove(sn* snake, int length)
{//默認蛇一開始是一直向右移動的;sn newsnake = { (snake->x)+1,(snake->y)};//2.繪制蛇DrawSnake(snake, length);FlushBatchDraw();//進行蛇的移動;for (int i = length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;
}

4.控制蛇的移動方向:

void SnakeMove(sn* snake, int length,int* vx,int* vy)
{//默認蛇一開始是一直向右移動的;//2.繪制蛇DrawSnake(snake, length);FlushBatchDraw();//進行蛇的移動;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回頭路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇節點變化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;
}

5.生成食物

1.食物不可以生成到畫布的外面;
2.不可以生成在蛇的身體上面;
3.食物是隨機生成的;

//4.生成食物:
void DrawFeeFood(sn* snake, int length, FD* food)
{		int fx = 0;int fy = 0;int flag = 0;while (1){//食物坐標的隨機生成:food->x = rand() % (wide / Frame);food->y= rand() % (high / Frame);//2.不可以生成在蛇的身體上面,遍歷蛇的身體。for (int i = 0; i < length; i++){if (((food->x) == (snake[i].x)) && ((food->y) == (snake[i].y))){flag++;}}if (flag == 0){break;}}
}
//3.控制蛇的移動
void SnakeMove(sn* snake, int length,FD* food,int* vx,int* vy)
{//默認蛇一開始是一直向右移動的;//2.繪制蛇DrawSnake(snake, length);//2.繪制食物:if (food->x == 0 && food->y == 0){DrawFeeFood(snake, length, food);}setfillcolor(YELLOW);solidrectangle((food->x) * Frame, (food->y) * Frame, (food->x+1) * Frame, (food->y+1) * Frame);FlushBatchDraw();//進行蛇的移動;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回頭路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇節點變化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;
}

6.判斷蛇吃到食物并且長大。

請添加圖片描述

//3.控制蛇的移動
void SnakeMove(sn* snake, int* length,FD* food,int* vx,int* vy)
{//默認蛇一開始是一直向右移動的;//2.繪制蛇DrawSnake(snake, *length);//3.繪制食物:if (food->x == 0 && food->y == 0){DrawFeeFood(snake, length, food);}setfillcolor(YELLOW);solidrectangle((food->x) * Frame, (food->y) * Frame, (food->x+1) * Frame, (food->y+1) * Frame);FlushBatchDraw();//進行蛇的移動;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回頭路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇節點變化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = *length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;//判斷蛇是否吃到了食物和生長:Grow(snake, length, food);
}
void Grow(sn* snake, int* length, FD* food)
{//保存一下尾的數值sn end = snake[(*length) - 1];if ((snake[0].x == food->x) && (snake[0].y == food->y)){//重置食物數值food->x = 0;food->y = 0;//添加尾節點;*length = (*length) + 1;snake[*length] = end;}
}

7.判斷游戲結束:

1.蛇頭碰到墻壁:
2.蛇頭碰到蛇身體:

//5.判斷游戲結束
bool Gameover(sn* snake, int* length)
{//1.碰到墻壁if ((snake[0].x >= wide / Frame) || (snake[0].x < 0) || (snake[0].y >= high / Frame) || (snake[0].y < 0)){return true;}else{//2.碰到身體for (int i = 1; i < (*length); i++){if (((snake[0].x)==(snake[i].x))&&((snake[0].y) == (snake[i].y)))return true;}}return false;
}

8.重置函數:

//初始化函數
void initgame(int* length,int* vx,int* vy,sn* snake,FD* food)
{//初始化蛇的長度*length = 5;//初始化蛇的水平初始速度*vx = 1;*vy = 0;//初始化蛇的坐標:snake[0] = { 7,6 };snake[0] = { 6,6 };snake[0] = { 5,6 };snake[0] = { 4,6 };snake[0] = { 3,6 };//初始化食物的坐標;*food = { 0,0 };
}

二整體代碼:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<easyx.h>
#include<math.h>
#include<stdbool.h>
#include<conio.h>
#include<time.h>#define wide 800
#define high 600
#define Frame 20typedef struct snake {int x;int y;
}sn;
typedef struct Food {int x;int y;
}FD;
//1.繪制邊框
void DrawFrame()
{setlinecolor(BLACK);setlinestyle(PS_SOLID, 1);for (int i = 1; i < wide / Frame; i++){line(Frame * i, 0, Frame * i, 600);}for (int i = 1; i < high / Frame; i++){line(0, Frame * i,800 , Frame * i);}
}//2.繪制蛇
void DrawSnake(sn* snake,int length)
{setfillcolor(GREEN);for (int i = 0; i < length; i++){//先繪制頭int x1 = snake[i].x;int y1 = snake[i].y;solidrectangle(x1 * Frame, y1 * Frame, (x1 + 1) * Frame, (y1 + 1) * Frame);}
}//3.生成食物:
void DrawFeeFood(sn* snake, int *length, FD* food)
{		int fx = 0;int fy = 0;int flag = 0;while (1){//食物坐標的隨機生成:food->x = rand() % (wide / Frame);food->y= rand() % (high / Frame);//2.不可以生成在蛇的身體上面,遍歷蛇的身體。for (int i = 0; i < *length; i++){if (((food->x) == (snake[i].x)) && ((food->y) == (snake[i].y))){flag++;}}if (flag == 0){break;}}
}//4判斷蛇吃到食物并且長大。
void Grow(sn* snake, int* length, FD* food)
{//保存一下尾的數值sn end = snake[(*length) - 1];if ((snake[0].x == food->x) && (snake[0].y == food->y)){//重置食物數值food->x = 0;food->y = 0;//添加尾節點;*length = (*length) + 1;snake[*length] = end;}
}//初始化函數
void initgame(int* length,int* vx,int* vy,sn* snake,FD* food)
{//初始化蛇的長度*length = 5;//初始化蛇的水平初始速度*vx = 1;*vy = 0;//初始化蛇的坐標:snake[0] = { 7,6 };snake[0] = { 6,6 };snake[0] = { 5,6 };snake[0] = { 4,6 };snake[0] = { 3,6 };//初始化食物的坐標;*food = { 0,0 };
}
//5.判斷游戲結束
bool Gameover(sn* snake, int* length)
{//1.碰到墻壁if ((snake[0].x >= wide / Frame) || (snake[0].x < 0) || (snake[0].y >= high / Frame) || (snake[0].y < 0)){return true;}else{//2.碰到身體for (int i = 1; i < (*length); i++){if (((snake[0].x)==(snake[i].x))&&((snake[0].y) == (snake[i].y)))return true;}}return false;
}//6.控制蛇的移動
void SnakeMove(sn* snake, int* length,FD* food,int* vx,int* vy)
{//默認蛇一開始是一直向右移動的;//2.繪制蛇DrawSnake(snake, *length);//3.繪制食物:if (food->x == 0 && food->y == 0){DrawFeeFood(snake, length, food);}setfillcolor(YELLOW);solidrectangle((food->x) * Frame, (food->y) * Frame, (food->x+1) * Frame, (food->y+1) * Frame);FlushBatchDraw();//進行蛇的移動;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回頭路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇節點變化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = *length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;//判斷蛇是否吃到了食物和生長:Grow(snake, length, food);//判斷蛇是否碰到了墻壁和自己if (Gameover(snake, length)){initgame(length, vx, vy, snake, food);//Sleep(100);}}int main()
{initgraph(wide,high);setbkcolor(RGB(188, 227, 245));//獲取當前時間作為隨機數種子:srand((unsigned int)time(NULL));cleardevice();//初始化蛇的長度int length = 5;//初始化蛇的水平初始速度int vx = 1;int vy = 0;//初始化蛇的坐標:sn snake[100] = { {7,6} ,{6,6}, {5,6},{4,6},{3,6} };//初始化食物的坐標;FD food = {0,0};while (1){cleardevice();BeginBatchDraw();//1.繪制邊框DrawFrame();//2.控制蛇的移動和節點的變化;SnakeMove(snake, &length,&food,&vx,&vy);Sleep(150);}EndBatchDraw();getchar();closegraph();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41382.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41382.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【golang】結構體及其方法的使用(struct)

函數是獨立的程序實體。我們可以聲明有名字的函數&#xff0c;也可以聲明沒名字的函數&#xff0c;還可以把它們當做普通的值傳來傳去。我們能把具有相同簽名的函數抽象成獨立的函數類型&#xff0c;以作為一組輸入、輸出&#xff08;或者說一類邏輯組件&#xff09;的代表。 …

爬蟲逆向實戰(八)--猿人學第十五題

一、數據接口分析 主頁地址&#xff1a;猿人學第十五題 1、抓包 通過抓包可以發現數據接口是api/match/15 2、判斷是否有加密參數 請求參數是否加密&#xff1f; 查看“載荷”模塊可以發現有一個m加密參數 請求頭是否加密&#xff1f; 無響應是否加密&#xff1f; 無cook…

CSS中的z-index屬性有什么作用?如何控制元素在層疊上下文中的顯示順序?

聚沙成塔每天進步一點點 ? 專欄簡介? z-index 屬性的作用及控制元素層疊順序作用 ? 控制元素層疊順序? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&#xff0…

管理類聯考——邏輯——真題篇——按知識分類——匯總篇——一、形式邏輯——選言——不相容選言——要么

第三節 不相容選言-要么-“要么A要么B”→A和B有且僅有一個 真題(2010-39)-不相容選言-要么-“要么A要么B”→A和B有且僅有一個 39.大小行星懸浮游在太陽系邊緣,極易受附近星體引力作用的影響。據研究人員計算,有時這些力量會將彗星從奧爾特星云拖出。這樣,它們更有可能…

WPF國際化的實現方法(WpfExtensions.Xaml)

https://blog.csdn.net/eyupaopao/article/details/120090431 resx資源文件實現 resx資源文件&#xff0c;實現的過程比第一種復雜&#xff0c;但resx文件本身編輯比較簡單&#xff0c;維護起來比較方便。需要用到的框架&#xff1a;WpfExtensions.Xaml 為每種語言添加.resx資…

Mac思維導圖軟件Xmind for Mac中文激活版

好的思維導圖軟件能幫助用戶更好的發揮創作能力&#xff0c;XMind是一款流行的思維導圖軟件&#xff0c;可以幫助用戶創建各種類型的思維導圖和概念圖。 多樣化的導圖類型&#xff1a;XMind提供了多種類型的導圖&#xff0c;如魚骨圖、樹形圖、機構圖等&#xff0c;可以滿足不同…

UI自動化測試常見的Exception

一. StaleElementReferenceException&#xff1a; - 原因&#xff1a;引用的元素已過期。原因是頁面刷新了&#xff0c;此時當然找不到之前頁面的元素。- 解決方案&#xff1a;不確定什么時候元素就會被刷新。頁面刷新后重新獲取元素的思路不變&#xff0c;這時可以使用python的…

ClickHouse(二十二):Clickhouse SQL DML操作及導入導出數據

進入正文前&#xff0c;感謝寶子們訂閱專題、點贊、評論、收藏&#xff01;關注IT貧道&#xff0c;獲取高質量博客內容&#xff01; &#x1f3e1;個人主頁&#xff1a;含各種IT體系技術&#xff0c;IT貧道_Apache Doris,大數據OLAP體系技術棧,Kerberos安全認證-CSDN博客 &…

GPT-5出世?OpenAI GPT-5商標已注冊

OpenAI的GPT已經成為了業界標桿&#xff0c;升級速度之快讓人瞠目&#xff0c;別人追GPT-3.5的時候GPT-4橫空出世&#xff0c;差距被拉開了&#xff0c;現在GPT-5就要來了。 據商標律師泄露的消息&#xff0c;OpenAI已于7月18日注冊了GPT-5商標。雖然注冊商標并不罕見&#xf…

【【萌新的STM32學習-9】】

萌新的STM32學習-9 我們在使用某個外設&#xff0c;必須線使能該外設時鐘 SYSTEM 文件夾里面的代碼由正點原子提供&#xff0c;是 STM32F1xx 系列的底層核心驅動函數&#xff0c; 可以用在 STM32F1xx 系列的各個型號上面&#xff0c;方便大家快速構建自己的工程。本章&#xf…

基于IMX6ULLmini的linux裸機開發系列二:使用C語言和SDK點亮LED

引入sdk頭文件 sudo chown -R gec /opt 用這條命令給gec賦權限&#xff0c;否則訪問權限不夠&#xff0c;無法讀取&#xff0c;如下圖成功 目的&#xff1a;解決寄存器地址難查難設置 devices/MCIMX6Y2/MCIMX6Y2.h 記錄外設寄存器及其相關操作 devices/MCIMX6Y2/drivers/fsl_…

Windows+VMware+Ubuntu+Anaconda+VMware Tools

Q1&#xff1a;Windows不支持***agent模擬器 A1&#xff1a;在VMware安裝Ubuntu虛擬機 P1: 下載 VMware-workstation-full-15.5.6-16341506.exe 安裝包&#xff08;峰哥電腦軟件&#xff09; P2: 下載Ubuntu鏡像 地址 ubuntu-18.04.6-desktop-amd64.iso P3&#xff1a;搭載鏡…

干翻Dubbo系列第十一篇:Dubbo常見協議與通信效率對比

文章目錄 文章說明 一&#xff1a;協議 1&#xff1a;什么是協議 2&#xff1a;協議和序列化關系 3&#xff1a;協議組成 &#xff08;一&#xff09;&#xff1a;頭信息 &#xff08;二&#xff09;&#xff1a;體信息 4&#xff1a;Dubbo3中常見的協議 5&#xff1a;…

華為在ospf area 0單區域的情況下結合pbr對數據包的來回路徑進行控制

配置思路&#xff1a; 兩邊去的包在R1上用mqc進行下一跳重定向 兩邊回程包在R4上用mqc進行下一跳重定向 最終讓內網 192.168.10.0出去的數據包來回全走上面R-1-2-4 192.168.20.0出去的數據包來回全走 下面R1-3-4 R2和R3就是簡單ospf配置和宣告&#xff0c;其它沒有配置&#…

搭建grafana+loki+promtail日志收集系統

準備工作 下載地址 https://github.com/grafana/loki/releases 安裝包放在服務器目錄&#xff1a;/opt wget https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip wget https://github.com/grafana/loki/releases/download/v2.4.2/promtail-lin…

【備戰csp-j】csp常考題目詳解(3)

三.排列組合 1. 7名學生站成一排&#xff0c;甲、乙必須站在一起有多少不同排法&#xff1f; 答案&#xff1a;1440 解析&#xff1a; 6組人進行全排列&#xff1a;A&#xff08;6,6&#xff09;&#xff1b; 甲和乙的順序有兩種情況&#xff0c;所以結果要再乘2&#xff1b; …

影響力再度提升,Smartbi多次蟬聯Gartner、IDC等權威認可

近期&#xff0c;思邁特軟件捷報頻傳&#xff0c;Smartbi憑借技術創新實力和產品能力&#xff0c;成功入選Gartner中國增強數據分析代表廠商及自助分析代表廠商&#xff0c;同時&#xff0c;連續三年蟬聯“IDC中國FinTech 50”榜單。 Part.1 再次被Gartner提名 Smartbi深度融…

重塑DTC規則:元氣森林的全渠道轉型

元氣森林作為迄今為止用5-6年時間最快達到70億年銷售額的飲料品牌&#xff08;統一、可口可樂、東鵬特飲都花了15年左右&#xff0c;康師傅花了10年&#xff09;。元氣森林于2016年在北京創立&#xff0c;憑借健康產品理念和新潮營銷方式&#xff0c;一款主打“0糖0卡0脂”概念…

激活函數總結(十一):激活函數補充(Absolute、Bipolar、Bipolar Sigmoid)

激活函數總結&#xff08;十一&#xff09;&#xff1a;激活函數補充 1 引言2 激活函數2.1 Absolute激活函數2.2 Bipolar激活函數2.3 Bipolar Sigmoid激活函數 3. 總結 1 引言 在前面的文章中已經介紹了介紹了一系列激活函數 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、…

C++ auto關鍵字

文章目錄 一、auto的推導規則二、auto的限制 C11 中有&#xff1a;auto 類型推導 auto x 5; // OK: x 是 int 類型 auto pi new auto(1); // OK: pi 被推導為 int* const auto *v &x, u 6; // OK: v是const int*類型&#xff0c;u是const int類型 static auto y 0.0;…