久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7098|回復: 2
打印 上一主題 下一主題
收起左側

c++小游戲(貪吃蛇)源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:613800 發表于 2019-9-25 09:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
設計的小游戲,初學者可以加點自己想加的其他功能。

游戲規則
        貪食蛇游戲要求玩家控制方向鍵(或WSAD鍵)來控制小蛇的前進方向,以使蛇吃掉面板上隨即位置上的食物。每次成功吃掉食物后小蛇體長將增加一點,得分增加。當小蛇撞到邊界或者蛇頭與蛇身相撞時,蛇將掛掉,游戲隨之結束。

游戲結構設計
        游戲應當包含初始歡迎界面,游戲界面,游戲結束界面。

        建立一個CGame類,來管理游戲的進度。該類放在Game.h文件中,在該類中可以分別定義NewGame(),PlayGame(),SetGame()和ExitGame()四個函數來控制游戲的各個單元,為了使整個程序看起來更像個游戲,可以采取更加漂亮的界面來展示游戲各部分。


NewGame()函數設定游戲歡迎界面。可以簡單地輸出了一些方塊字符組成的游戲名SNAKE和一句提示“Press any key to start…”。點擊任意鍵后,游戲程序將轉入SetGame()中繼續執行。可以加上一些動態效果,讓提示”Press any keyto start…”不斷跳動。
SetGame()中包括游戲的設置內容。可以選擇Easy,Normal,Hard三個選項。這三個選項將對應小蛇不同的的移動速度,具體來說將體現在PlayGame()函數中每次循環執行速度。設置完成后,游戲程序將轉入PlayGame()繼續執行。
PlayGame()函數主體將是一個死循環,因為可將游戲考慮成一個無窮的循環,循環中迭代的每一步都依次進行:判斷用戶是否輸入、然后根據用戶輸入調整游戲內容(如果沒有輸入則按默認方式繼續執行游戲)、判斷是否符合規則(不符合則跳出循環,轉入ExitGame()退出游戲)、判斷是否需要加分扣分。執行完以上這些步驟后,將進行下一次迭代。當然進行游戲之前,還要執行必要的初始化工作,來顯示大體框架和提示信息。
EitGame()中將顯示游戲得分,并詢問玩家是否再玩一次。這里拼出了一個骷髏頭的圖案,表示Game Over。


        以上為游戲的主體內容,這四個函數設定了游戲的基本結構,剩余部分將繼續考慮細節問題。然后再展示Game.h的細節內容。

建立游戲對象
        先建立一系列類表示游戲對象,其中應包括對游戲對象的處理方式(函數)。分析游戲,可以知道游戲主體是小蛇和食物。

        所有的游戲對象,包括蛇和食物,都是由控制臺上的一系列點組成的。因此需要很多處理點對象的方法。可建立Point.h來定義CPoint對象,來簡化其他對象的處理。

代碼如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <conio.h>
  5. #include <windows.h>
  6. #define W 32
  7. #define H 22
  8. const int SIZE_SK = 30*20;
  9. HANDLE hOut;
  10. COORD pos= {0, 0};
  11. CONSOLE_CURSOR_INFO cur_info = {1, 0};
  12. struct snake {
  13. short x, y; //節點坐標
  14. short md; //節點運動方向
  15. short num; //節點內容
  16. int col; //節點顏色
  17. } snake[30*20];
  18. const short dx[4] = {-1, 1, 0, 0}; //方向
  19. const short dy[4] = {0, 0, -1, 1}; //方向
  20. short gamemap[W][H];
  21. short head, tail, score=0;


  22. void initmap(int tm);
  23. void createFood(void);
  24. int getkeys(void);
  25. int move(int idx);
  26. void pntSnake(int i);
  27. void drawEdge(void);
  28. void gameinfo(char *s, int n);


  29. int main(void)
  30. {
  31. int tm = 150; //刷新間隔150毫秒
  32. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  33. SetConsoleCursorInfo(hOut, &cur_info); //隱藏光標
  34. system("COLOR 2f");
  35. initmap(tm);
  36. return 0;
  37. }
  38. void initmap(int tm)
  39. {
  40. short x, y, i, j;
  41. int index, tmp, ret_m;

  42. while (1){
  43. head=0;
  44. tail=-1;
  45. score=0;
  46. //初始化蛇節點隨機顏色
  47. srand(time(0));
  48. for (i=0; i<SIZE_SK; i++)
  49. snake[i].col = rand()%8+8 | 0x20;
  50. //初始化地圖數組
  51. for (i=0; i<W; i++)
  52. for (j=0; j<H; j++)
  53. gamemap[i][j] = 0;
  54. system("cls");
  55. //繪制邊界
  56. drawEdge();
  57. //打印蛇頭
  58. srand(time(0));
  59. do {
  60. x = rand()%(W-2) + 1;
  61. y = rand()%(H-2) + 1;
  62. } while (gamemap[x][y] != 0); //只在空白處生成
  63. snake[head].x = x;
  64. snake[head].y = y;
  65. gamemap[x][y] = snake[head].num = 1;
  66. pos.X = x*2;
  67. pos.Y = y;
  68. SetConsoleCursorPosition(hOut, pos);
  69. printf("█");
  70. //打印食物
  71. createFood();
  72. while ((index=getkeys()) == 4)
  73. Sleep(500);
  74. //循環開始
  75. while (1){
  76. ret_m = move(index);
  77. if (ret_m == 1){
  78. pos.X = 0; pos.Y = H;
  79. SetConsoleCursorPosition(hOut, pos);
  80. printf("哎呀,掛了哦 ^_^");
  81. break;
  82. }
  83. else if (ret_m == 2){
  84. pos.X = 0; pos.Y = H;
  85. SetConsoleCursorPosition(hOut, pos);
  86. printf("哎呀,超神了 ^_^");
  87. break;
  88. }
  89. Sleep(tm);
  90. if ((tmp = getkeys()) != 4)
  91. index = tmp;
  92. }
  93. //菜單代碼
  94. puts(" 按w\\s\\a\\d 繼續玩,退出請關閉我");
  95. getch();
  96. }
  97. }
  98. void createFood(void)
  99. {
  100. short x, y;
  101. srand(time(0));
  102. do {
  103. x = rand()%(W-2) + 1;
  104. y = rand()%(H-2) + 1;
  105. } while (gamemap[x][y] != 0);
  106. gamemap[x][y] = 2;
  107. pos.X = x*2; pos.Y = y;
  108. SetConsoleCursorPosition(hOut, pos);
  109. SetConsoleTextAttribute(hOut, 0x2f);
  110. printf("⊙");
  111. }
  112. int getkeys(void) //獲取方向鍵
  113. {
  114. char ch;
  115. while(kbhit()){
  116. ch = getch();
  117. if(ch == 'w')
  118. return 2;
  119. if(ch == 's')
  120. return 3;
  121. if(ch == 'a')
  122. return 0;
  123. if(ch == 'd')
  124. return 1;
  125. while (kbhit());
  126. }
  127. return 4;
  128. }
  129. int move(int idx)
  130. {
  131. int newx, newy, pt_tail, i;

  132. newx = snake[head].x + dx[idx];
  133. newy = snake[head].y + dy[idx];
  134. switch (gamemap[newx][newy]){
  135. case 0:
  136. if ((head = ++head%SIZE_SK) != tail){ //不相等即蛇節點隊列未滿
  137. snake[head].x = newx;
  138. snake[head].y = newy;
  139. snake[head].num = 1;
  140. gamemap[newx][newy] = 1;
  141. tail = ++tail%SIZE_SK;
  142. snake[tail].num = 0; //清除尾部,打印空字符
  143. gamemap[snake[tail].x][snake[tail].y] = 0;
  144. snake[head].md = idx; //存儲移動方向
  145. pt_tail = tail - 1;
  146. }
  147. else
  148. return 2; //回合結束標記2代表蛇填滿空間
  149. break;
  150. case 2:
  151. if ((head = ++head%SIZE_SK) != tail){ //不相等即蛇節點隊列未滿
  152. snake[head].x = newx; //head+1后存儲新坐標為蛇頭
  153. snake[head].y = newy;
  154. snake[head].num = 1;
  155. gamemap[newx][newy] = 1;
  156. snake[head].md = idx; //存儲移動方向
  157. pt_tail = tail = tail%SIZE_SK;
  158. score++;
  159. createFood();
  160. }
  161. break;
  162. case 3:
  163. return 1; //遇到墻壁
  164. case 1:
  165. return 1; //遇到自身
  166. default: ;
  167. }
  168. //打印蛇
  169. if (pt_tail == -1)
  170. pt_tail++;
  171. if (pt_tail < head){ //尾巴在頭部后面(這兩者是數組索引)
  172. for (i=pt_tail; i<=head; i++){
  173. pntSnake(i); //打印
  174. }
  175. }
  176. else{
  177. for (i=pt_tail; i<SIZE_SK; i++)
  178. pntSnake(i);
  179. for (i=0; i<=head; i++)
  180. pntSnake(i);
  181. }
  182. gameinfo(" 分數", score);
  183. return 0;
  184. }
  185. void pntSnake(int i)
  186. {
  187. //轉換x坐標:內部是連續整數,打印時一個字符占位2,所以要2x
  188. pos.X = snake[i].x * 2;
  189. pos.Y = snake[i].y;
  190. SetConsoleCursorPosition(hOut, pos);
  191. if (snake[i].num == 0){
  192. putchar('\0'); //清除蛇尾
  193. putchar('\0');}
  194. else if (snake[i].num == 1){
  195. //下面函數第二個參數低4位控制前景色,高4位控制背景色,共8位
  196. SetConsoleTextAttribute(hOut, snake[i].col);
  197. printf("█");
  198. }
  199. }
  200. void drawEdge(void)
  201. {
  202. int i;
  203. for (i=0; i<W; i++){
  204. pos.X = i*2; pos.Y = 0;
  205. SetConsoleCursorPosition(hOut, pos);
  206. printf("█");
  207. gamemap[i][pos.Y] = 3;
  208. pos.Y = H-1;
  209. SetConsoleCursorPosition(hOut, pos);
  210. printf("█");
  211. gamemap[i][H-1] = 3;
  212. }
  213. for (i=1; i<H-1; i++){
  214. pos.X = 0; pos.Y = i;
  215. SetConsoleCursorPosition(hOut, pos);
  216. printf("█");
  217. gamemap[pos.X][i] = 3;
  218. pos.X = (W-1)*2;
  219. SetConsoleCursorPosition(hOut, pos);
  220. printf("█");
  221. gamemap[W-1][i] = 3;
  222. }
  223. }
  224. void gameinfo(char *s, int n)
  225. {
  226. pos.X = 0; pos.Y = H;
  227. SetConsoleCursorPosition(hOut, pos);
  228. SetConsoleTextAttribute(hOut, 0x2f);
  229. printf(" 貪吃蛇");
  230. printf(" %s: %d", s, n);
  231. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:833828 發表于 2020-11-8 20:45 | 只看該作者
請問為什么我運行不了呢?(我就直接把代碼復制進去了)
回復

使用道具 舉報

板凳
ID:882731 發表于 2021-2-23 10:09 | 只看該作者
helloSCM 發表于 2020-11-8 20:45
請問為什么我運行不了呢?(我就直接把代碼復制進去了)

這是整個程序實現貪食蛇功能還是要設計界面?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡一区二区三区 | 亚洲a网| 91视频进入 | 日韩视频在线一区 | 免费不卡视频 | 精品久久影院 | 99久久久国产精品 | 欧美日韩国产精品一区 | 国产一级在线观看 | 国产精品久久久亚洲 | 久久亚洲春色中文字幕久久久 | 爱爱视频在线观看 | 性大毛片视频 | 久久国产精品视频观看 | 中文天堂在线一区 | 国产精品爱久久久久久久 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 一级片免费网站 | 欧美日韩不卡合集视频 | 日韩欧美网| 国产中文区二幕区2012 | 日韩精品一区二区三区在线播放 | 一区二区三区播放 | 国产网站在线播放 | 国产剧情一区 | 中文字幕免费中文 | 国产第1页 | 久久综合av | 毛片区| 日韩精品视频一区二区三区 | 亚洲成人免费视频在线观看 | 91av国产在线视频 | 国产精品久久久久久久久免费 | 日韩一区二区三区在线观看 | 99久久免费精品国产免费高清 | 瑞克和莫蒂第五季在线观看 | 久久久xx | 在线成人一区 | 日韩欧美在线视频 | 国产高清在线精品一区二区三区 | 久久久久久久久久久爱 |