網站首頁 編程語言 正文
設計思路
? ? ? ??建議先將代碼復制下來跑一遍再來看思路!!!
? ? ? ? 通俗易懂,請仔細看。
? ? ? ? 值得注意的是我給出的代碼沒有加墻體,如有需要自己添加。
? ? ? ? 也沒有難度設計,同上。
地圖大小(這里設計了墻體,代碼中未實現)
設置一個整形數組map,其大小為1600,對應著地圖的大小為1600,并初始化數組,令數組中的值全為0,0代表空地。
我們通過設定窗口的寬度為80,打印時每個map[i] 所對應的字符占兩格位置即可實現每打印40個map[i]就換行的效果。
這樣地圖的長寬即為40x40.
? ? ? 2.墻體
墻體在地圖的最外圍,意味著當map[i]中的i為地圖邊界時,對應著墻體,使用if語句判斷i的值,符合位于邊界的條件打印墻體即可。
通過地圖的大小我們了解到,當0<=i<=39時,map[i]對應著第一行,也就是地圖的邊界 ,同樣的,地圖左邊界的i滿足i%40==0,右邊界的i滿足(i+1)%40==0,,同理下邊界。將上述符合的條件放入if語句中即可實現打印墻體的功能。
? ? ? ? 3.蛇
蛇是如何移動呢?并且保持一定長度。其實我們只需要一個蛇頭就可以辦到,因為蛇身只是舊蛇頭的位置,所以我們一直只需更新蛇頭坐標就能達到目的,如何保持長度呢?,因為我們更新新的蛇頭,去掉舊的蛇尾是很顯然的事了,在地圖大小中我們提到,map[i] 如果等于0,就是空地,讓蛇尾的值變成0就行了,因為蛇一直在移動,所以當前蛇尾的前一節蛇身會是下一刻的蛇尾,很自然的聯想到了以1為公差的一組數1234,分別對應蛇身的值,如果我們想使蛇連續的動起來,新蛇頭的值為4,在加入新蛇頭前將蛇尾變為0,蛇尾前一節蛇身變為此刻蛇尾對應的值為1,使蛇整體減去1,此時的蛇的值為0123,加入蛇頭4,01234,此刻原蛇尾變為空地,原蛇尾前一截蛇身變為此刻的蛇尾。貪吃蛇的持續移動便完成了。
? ? ? ?4.食物
很自然的,在上面3節map[i]為0,正整數時都有了對應的含義,食物我們便使其 map[i] =-1.因為貪吃蛇游戲中食物的生成要求是隨機的,但我們的c++課程中并沒有提到,便在網上查找到了隨機數生成的函數srand(上面的設定窗口大小也是如此),生成的隨機數i可能超出數組大小,對i取1600的余數即可。食物只能生成在空地上,當map[i]等于0時,令map[i]=-1。新的食物便生成了。容易忽略的一點是,我們并沒有給墻體map[i]的值,也就是所墻體的值在數組中對應的是空地,只不過通過i的位置來判斷是否為墻體,在這里,同樣也要加入墻體的位置到判斷條件,以免食物生成在墻體內。新的食物在舊的食物被吃掉后立即生成。
? ? ? 5.死亡判定
我們通過新蛇頭所對應的值來判斷蛇是否死亡
? ? ? ? (1)map[headx+heady*40]>0, 由3我們可以知道,蛇身所對應的map [i] ?值大于0,新蛇頭所對應的map值大于0也就意味著新蛇頭在蛇身生成,按
照貪吃蛇的規則,游戲結束
? ? ? ?(2)(headx+heady*40)滿足墻體的打印條件時,意味著蛇頭在墻體生成,游戲結束
實現代碼
#include<bits/stdc++.h> #include<windows.h> #include<iostream> #include<conio.h> int main() { int headx = 0, heady = 0, len = 5, map[1600] = { 0 }, i = 0; char c = 'd', cl = 'd',body=3,head=2; /*隨機數生成*/ srand((unsigned)time(0)); system("mode con:cols=80 lines=40"); map[rand() % 1600] = -1; while (true) { if (_kbhit())//判斷鍵盤輸入 { cl =_getch(); if (cl < 97) cl += 32; if (cl == 'a' && c != 'd' || cl == 'd' && c != 'a' ||cl == 'w' && c != 's' || cl == 's' && c != 'w')//判斷輸入方向是否與原方向沖突 c = cl; } /*改變蛇頭坐標*/ if (c == 'a') headx--; if (c == 'd') headx++; if (c == 'w') heady--; if (c == 's') heady++; /*判斷蛇頭是否撞墻*/ if(headx==-1||headx==40||heady==-1||heady==40) break; /*判斷蛇頭是否為空地*/ if (map[heady * 40 + headx]) { if (map[heady * 40+headx] > 0) break; /*吃到食物,蛇身+1,并在空地生成新的食物*/ if (map[heady * 40 + headx] < 0) { len++; for (i = rand() % 1600; map[i] || !(map[i] = -1); i = rand() % 1600); } } /*是空地則蛇身值整體減1,蛇尾由1減為0變成空地*/ else for (i = 0; i < 1600; i++) { if (map[i] > 0) map[i] -= 1; } system("cls"); /*新蛇頭賦值,遍歷map,值大于0為蛇身,等于0為空地,小于0為食物*/ for (map[heady * 40 + headx] = len, i = 0; i < 1600; i++) { if (map[i] == len) { printf("%2d", map[i]); continue; } if (map[i] > 0) printf("%2d", map[i]); if (map[i] == 0) printf("%2d", map[i]); if (map[i] == -1) printf("%2d", map[i]);//打印 } Sleep(100); } }
效果
?如果你仔細閱讀了代碼,將數字替換成你想要的符號(占兩個字符大小如果是一個字符要加一個空格)是很簡單的事情
如果你想要游戲循環進行,也是很容易辦到的。
這只是個demo,你可以根據自己的需要任意的改寫。
原文鏈接:https://blog.csdn.net/qq_62959684/article/details/122018662
相關推薦
- 2023-02-10 docker-compose實現容器任務編排的方法步驟_docker
- 2022-12-05 Python中的內置函數isdigit()_python
- 2022-08-19 redis在windows下啟動# Creating Server TCP listening so
- 2022-03-14 C語言撲克牌游戲示例(c語言紙牌游戲)
- 2023-03-25 在?git?中取消?__pycache__?文件的方法_相關技巧
- 2022-09-14 C語言多媒體框架GStreamer入門和概述_C 語言
- 2022-11-02 解決SecureCRT通過SSH連接Ubuntu時vi命令有多余的m的問題_相關技巧
- 2022-06-02 C語言的模板與泛型編程你了解嗎_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支