找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C貪吃蛇程序代碼與運行界面展示

[復制鏈接]
跳轉到指定樓層
樓主
ID:229504 發(fā)表于 2017-8-26 22:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

全部資料下載地址:
貪吃蛇代碼.docx (15.12 KB, 下載次數(shù): 14)

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <conio.h>
  4. #include <time.h>
  5. //游戲窗口
  6. #define FrameX 4   //游戲窗口左上角的X軸坐標
  7. #define FrameY 4   //游戲窗口左上角的Y軸坐標
  8. #define Frame_height  20 //游戲窗口的高度
  9. #define Frame_width   20 //游戲窗口的寬度
  10. //定義全局變量
  11. int i,j;
  12. int a[2];     //用于記住蛇尾坐標,其中a[0]、a[1]分別表示橫、豎坐標
  13. //聲明蛇的結構體
  14. struct Snake
  15. {
  16. int x[100];    //蛇的橫坐標,其中x[0]表示蛇尾的橫坐標,x[N-1]表示蛇頭的橫坐標
  17. int y[100];    //蛇的豎坐標,其中y[0]表示蛇尾的豎坐標,y[N-1]表示蛇頭的豎坐標
  18. int count;    //蛇吃食物的個數(shù)
  19. int length;    //蛇的長度
  20. int speed;    //蛇的速度
  21. };
  22. //聲明食物的結構體
  23. struct Food
  24. {
  25. int x;     //食物的橫坐標
  26. int y;     //食物的豎坐標
  27. };


  28. /******光標移到指定位置**************************************************************/
  29. void gotoxy(HANDLE hOut, int x, int y)
  30. {
  31. COORD pos;
  32. pos.X = x;  //橫坐標
  33. pos.Y = y;  //縱坐標
  34. SetConsoleCursorPosition(hOut, pos);
  35. }
  36. /******設置文本為綠色*****************************************************************/
  37. void Set_TextColor_Green (void)
  38. {
  39. HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);

  40. SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
  41. }
  42. /******制作游戲窗口******************************************************************/
  43. void make_frame()
  44. {
  45. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //定義顯示器句柄變量
  46. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);  //打印選擇菜單
  47. printf("Esc 退出游戲");
  48. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
  49. printf("長按方向鍵:加速");
  50. gotoxy(hOut,FrameX,FrameY);       //打印框角
  51. printf("╔");
  52. gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
  53. printf("╗");
  54. gotoxy(hOut,FrameX,FrameY+Frame_height);
  55. printf("╚");
  56. gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
  57. printf("╝");
  58. for(i=2;i<2*Frame_width-2;i+=2)
  59. {
  60.   gotoxy(hOut,FrameX+i,FrameY);
  61.   printf("═");         //打印上橫框
  62. }
  63. for(i=2;i<2*Frame_width-2;i+=2)
  64. {
  65.   gotoxy(hOut,FrameX+i,FrameY+Frame_height);
  66.   printf("═");         //打印下橫框
  67. }
  68. for(i=1;i<Frame_height;i++)
  69. {
  70.   gotoxy(hOut,FrameX,FrameY+i);
  71.   printf("║");         //打印左豎框
  72. }
  73. for(i=1;i<Frame_height;i++)
  74. {
  75.   gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
  76.   printf("║");         //打印右豎框
  77. }
  78. gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);   //打印游戲名稱
  79. Set_TextColor_Green ();        //設置蛇為綠色
  80. printf("貪吃蛇游戲");
  81. }
  82. /******結束菜單*******************************************************************/
  83. void over_game()
  84. {
  85. system("cls");
  86. printf("\n\n\n\n\n\n\n\n\t\t\t\t游戲結束\n\n\n");
  87. Sleep(2000);
  88. getch();
  89. }
  90. /******菜單信息***************************************************************/
  91. void print_information(HANDLE hOut,struct Snake *snake,struct Food *food)
  92. {
  93. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
  94. printf("level : %d",snake->count/5+1);    //打印游戲等級
  95. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
  96. printf("score : %d",10*snake->count);    //打印游戲得分
  97. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
  98. printf("eat food : %d",snake->count);    //打印產(chǎn)生食物個數(shù)
  99. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);
  100. printf("speed : %dms",snake->speed);    //打印游戲速度
  101. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9);
  102. printf("foodX : %d",food->x);      //打印食物的橫坐標
  103. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11);
  104. printf("foodY : %d",food->y);      //打印食物的豎坐標
  105. }
  106. /******初始化蛇**********************************************************************/
  107. void init_snake(struct Snake *snake)
  108. {
  109. snake->x[0]=FrameX+2;     //初始化蛇的橫坐標
  110. snake->y[0]=FrameY+Frame_height/2;  //初始化蛇的豎坐標
  111. snake->speed=300;      //初始化蛇的速度為300ms
  112. snake->length=3;      //初始化蛇的長度為3節(jié)
  113. snake->count=0;       //初始化蛇吃的個數(shù)為0
  114. for(i=1;i<snake->length;i++)
  115. {/* 依次得到蛇身、蛇頭的坐標 */
  116.   snake->x[i]=snake->x[i-1]+2;
  117.   snake->y[i]=snake->y[i-1];
  118. }
  119. }
  120. /******移動蛇*************************************************************************/
  121. void move_snake(HANDLE hOut,struct Snake *snake)
  122. {
  123. gotoxy(hOut,snake->x[0],snake->y[0]);
  124. printf("  ");       /* 清除蛇尾*/
  125. for(i=1;i<snake->length;i++)
  126. {/* 后一節(jié)的坐標依次取代前一節(jié)的坐標 */
  127.   snake->x[i-1]=snake->x[i];
  128.   snake->y[i-1]=snake->y[i];
  129. }
  130. }
  131. /******打印蛇*************************************************************************/
  132. void print_snake(HANDLE hOut,struct Snake *snake)
  133. {
  134. for(i=0;i<snake->length;i++)
  135. {
  136.   gotoxy(hOut,snake->x[i],snake->y[i]);
  137.   if(i==0)
  138.   {
  139.    printf("○");       //打印蛇尾
  140.   }
  141.   else if(i==snake->length-1)
  142.   {
  143.    printf("¤");       //打印蛇頭
  144.   }
  145.   else
  146.   {
  147.    printf("⊙");       //打印蛇身
  148.   }
  149. }
  150. }
  151. /******隨機產(chǎn)生食物*******************************************************************/
  152. void get_food(HANDLE hOut,struct Snake *snake,struct Food *food)
  153. {
  154. srand((unsigned)time(NULL));       //初始化隨機數(shù)
  155. while(1)
  156. {/* 產(chǎn)生食物的條件:1.在游戲窗口內 2.不在蛇的身上 */
  157.   food->x = rand() % (Frame_width-1);
  158.   food->y = rand() % Frame_height;
  159.   if( food->x==0 || food->y==0 )
  160.   {
  161.    continue;
  162.   }
  163.   food->x = 2*food->x + FrameX;      //得到食物的橫坐標
  164.   food->y+=FrameY;         //得到食物的豎坐標
  165.   for(i=0;i<snake->length;i++)
  166.   {/* 判斷食物是否在蛇的身上,如果在蛇身上,則重新產(chǎn)生;否則,打印蛇身 */
  167.    if( food->x==snake->x[i] && food->y==snake->y[i] )
  168.    {
  169.     break;
  170.    }
  171.   }
  172.   if(i==snake->length)
  173.   {
  174.    gotoxy(hOut,food->x,food->y);
  175.    printf("⊙");
  176.    break;
  177.   }
  178. }
  179. }
  180. /******吃食物***************************************************************************/
  181. void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food)
  182. {
  183. if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y )
  184. {/* 如果蛇頭位置與食物位置相同,吃食物 */
  185.   snake->length++;      //吃一個食物,蛇身增長一節(jié)
  186.   for(i=snake->length-1;i>=1;i--)
  187.   {/* 蛇后節(jié)坐標依次賦值給蛇前一節(jié)的坐標,依次得到蛇身及蛇頭的坐標 */
  188.    snake->x[i]=snake->x[i-1];
  189.    snake->y[i]=snake->y[i-1];
  190.   }
  191.   snake->x[0]=a[0];      //得到蛇尾移動前的橫坐標
  192.   snake->y[0]=a[1];      //得到蛇尾移動前的豎坐標  
  193.   get_food(hOut,snake,food);    //重新產(chǎn)生食物
  194.   snake->count++;       //食物的個數(shù)增1
  195.   if( snake->count%5==0 )
  196.   {/* 當蛇吃Up_level個食物時,速度加快Up_speed毫秒并且升一級 */
  197.    snake->speed-=50;
  198.   }
  199. }
  200. }
  201. /******穿墻**********************************************************************************/
  202. void through_wall(HANDLE hOut,struct Snake *snake,char ch)
  203. {
  204. if( ch==72 && snake->y[snake->length-1]==FrameY)
  205. {
  206.   snake->y[snake->length-1] = FrameY+Frame_height-1; //如果蛇在上框且向上移動,穿墻
  207. }
  208. if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height )
  209. {
  210.   snake->y[snake->length-1] = FrameY+1;    //如果蛇在下框且向下移動,穿墻
  211. }
  212. if( ch==75 && snake->x[snake->length-1]==FrameX )
  213. {
  214.   snake->x[snake->length-1] = FrameX+2*Frame_width-4; //如果蛇在左框且向左移動,穿墻
  215. }
  216. if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 )
  217. {
  218.   snake->x[snake->length-1] = FrameX+2;    //如果蛇在右框且向右移動,穿墻
  219. }
  220. }
  221. /******判斷蛇是否死**************************************************************************/
  222. int if_die(struct Snake *snake)
  223. {/* 當蛇頭碰到自身時,蛇死 ,返回值為0 */
  224. for(i=0;i<snake->length-1;i++)
  225. {
  226.   if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] )
  227.   {
  228.    return 0;
  229.   }
  230. }
  231. return 1;
  232. }
  233. /******開始游戲*******************************************************************************/
  234. void start_game()
  235. {
  236. unsigned char ch=77;        //定義用于接收鍵盤輸入的字符變量
  237. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定義顯示器句柄變量
  238. struct Snake s,*snake=&s;      //定義蛇的結構體指針并指向蛇的結構體
  239. struct Food f,*food=&f;       //定義食物的結構體指針并指向食物的結構體

  240. make_frame();         //制作游戲窗口
  241. init_snake(snake);        //初始化蛇
  242. get_food(hOut,snake,food);      //隨機產(chǎn)生食物
  243. while(1)
  244. {
  245.   print_information(hOut,snake,food);   //打印菜單信息
  246.   a[0]=snake->x[0];       //記住蛇尾的橫坐標
  247.   a[1]=snake->y[0];       //記住蛇尾的豎坐標
  248.   j=0;
  249.   if(kbhit())
  250.   {/* 判斷是否按下鍵盤,如果按下,ch接收鍵盤輸入 */
  251.    ch=getch();
  252.    if(kbhit())
  253.    {/* 如果長按鍵盤,則加速 */
  254.     Sleep(20);
  255.     j=1;
  256.    }
  257.   }
  258.   switch(ch)
  259.   {
  260.    case 72:
  261.     {/* 向上移動 */
  262.      move_snake(hOut,snake);   //移動蛇
  263.      snake->y[snake->length-1]-=1; //蛇頭的豎坐標向上移,即減1
  264.      break;
  265.     }
  266.    case 80:
  267.     {/* 向下移動 */
  268.      move_snake(hOut,snake);   //移動蛇
  269.      snake->y[snake->length-1]+=1; //蛇頭的豎坐標向下移,即加1
  270.      break;
  271.     }
  272.    case 75:
  273.     {/* 向左移動 */
  274.      move_snake(hOut,snake);   //移動蛇
  275.      snake->x[snake->length-1]-=2; //蛇頭的橫坐標向左移,即減2
  276.      break;
  277.     }   
  278.    case 77:
  279.     {/* 向右移動 */
  280.      move_snake(hOut,snake);   //移動蛇
  281.      snake->x[snake->length-1]+=2; //蛇頭的橫坐標向右移,即加2
  282.      break;
  283.     }
  284.   }
  285.   through_wall(hOut,snake,ch);    //穿墻   
  286.   eat_food(hOut,snake,food);     //吃食物
  287.   print_snake(hOut,snake);     //打印蛇
  288.   if( if_die(snake)==0 || ch==27 || snake->speed==50 )
  289.   {/* 游戲結束條件:1.蛇碰到自身 2.按Esc鍵 3.速度為50ms */
  290.    gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1);
  291.    printf("Game Over");
  292.    Sleep(2000);
  293.    break;
  294.   }
  295.   if(j==0)
  296.   {
  297.    Sleep(snake->speed);      //延遲時間
  298.   }
  299.   else
  300.   {
  301.    Sleep(10);
  302.   }
  303. }
  304. }
  305. void main()
  306. {
  307. system("color 0D");  //設置文本為粉紅色
  308. start_game();   //開始游戲
  309. over_game();   //結束游戲
  310. }
復制代碼



評分

參與人數(shù) 1黑幣 +7 收起 理由
這貨不是小武啊 + 7 淡定

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表