当前位置:   article > 正文

c++语言实现贪吃蛇_c++贪吃蛇

c++贪吃蛇
  1. 1.完美的贪吃蛇
  2. #include<windows.h>
  3. #include<time.h>
  4. #include<stdlib.h>
  5. #include<conio.h>
  6. #define N 21
  7. #include<iostream>
  8. using namespace std;
  9. void gotoxy(int x,int y)//位置函数
  10. {
  11. COORD pos;
  12. pos.X=2*x;
  13. pos.Y=y;
  14. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
  15. }
  16. void color(int a)//颜色函数
  17. {
  18. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
  19. }
  20. void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
  21. {
  22. int i,j;//初始化围墙
  23. int wall[N+2][N+2]={{0}};
  24. for(i=1;i<=N;i++)
  25. {
  26. for(j=1;j<=N;j++)
  27. wall[i][j]=1;
  28. }
  29. color(11);
  30. for(i=0;i<N+2;i++)
  31. {
  32. for(j=0;j<N+2;j++)
  33. {
  34. if(wall[i][j])
  35. cout<<"■";
  36. else cout<<"□" ;
  37. }
  38. cout<<endl;
  39. }
  40. gotoxy(N+3,1);//显示信息
  41. color(20);
  42. cout<<"按 W S A D 移动方向"<<endl;
  43. gotoxy(N+3,2);
  44. color(20);
  45. cout<<"按任意键暂停"<<endl;
  46. gotoxy(N+3,3);
  47. color(20);
  48. cout<<"得分:"<<endl;
  49. apple[0]=rand()%N+1;//苹果
  50. apple[1]=rand()%N+1;
  51. gotoxy(apple[0],apple[1]);
  52. color(12);
  53. cout<<"●"<<endl;
  54. }
  55. int main()
  56. {
  57. int i,j;
  58. int** snake=NULL;
  59. int apple[2];
  60. int score=0;
  61. int tail[2];
  62. int len=3;
  63. char ch='p';
  64. srand((unsigned)time(NULL));
  65. init(apple);
  66. snake=(int**)realloc(snake,sizeof(int*)*len);
  67. for(i=0;i<len;i++)
  68. snake[i]=(int*)malloc(sizeof(int)*2);
  69. for(i=0;i<len;i++)
  70. {
  71. snake[i][0]=N/2;
  72. snake[i][1]=N/2+i;
  73. gotoxy(snake[i][0],snake[i][1]);
  74. color(14);
  75. cout<<"★"<<endl;
  76. }
  77. while(1)//进入消息循环
  78. {
  79. tail[0]=snake[len-1][0];
  80. tail[1]=snake[len-1][1];
  81. gotoxy(tail[0],tail[1]);
  82. color(11);
  83. cout<<"■"<<endl;
  84. for(i=len-1;i>0;i--)
  85. {
  86. snake[i][0]=snake[i-1][0];
  87. snake[i][1]=snake[i-1][1];
  88. gotoxy(snake[i][0],snake[i][1]);
  89. color(14);
  90. cout<<"★"<<endl;
  91. }
  92. if(kbhit())
  93. {
  94. gotoxy(0,N+2);
  95. ch=getche();
  96. }
  97. switch(ch)
  98. {
  99. case 'w':snake[0][1]--;break;
  100. case 's':snake[0][1]++;break;
  101. case 'a':snake[0][0]--;break;
  102. case 'd':snake[0][0]++;break;
  103. default: break;
  104. }
  105. gotoxy(snake[0][0],snake[0][1]);
  106. color(14);
  107. cout<<"★"<<endl;
  108. Sleep(abs(200-0.5*score));
  109. if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
  110. {
  111. score++;
  112. len++;
  113. snake=(int**)realloc(snake,sizeof(int*)*len);
  114. snake[len-1]=(int*)malloc(sizeof(int)*2);
  115. apple[0]=rand()%N+1;
  116. apple[1]=rand()%N+1;
  117. gotoxy(apple[0],apple[1]);
  118. color(12);
  119. cout<<"●"<<endl;
  120. gotoxy(N+5,3);
  121. color(20);
  122. cout<<score<<endl;
  123. }
  124. if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败
  125. {
  126. gotoxy(N/2,N/2);
  127. color(30);
  128. cout<<"失败!!!"<<endl;
  129. for(i=0;i<len;i++)
  130. free(snake[i]);
  131. Sleep(INFINITE);
  132. exit(0);
  133. }
  134. }
  135. return 0;
  136. }

  1. 2.有缺陷的贪吃蛇
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <conio.h>
  5. #include <time.h>
  6. //游戏窗口
  7. #define FrameX 4 //游戏窗口左上角的X轴坐标
  8. #define FrameY 4 //游戏窗口左上角的Y轴坐标
  9. #define Frame_height 20 //游戏窗口的高度
  10. #define Frame_width 20 //游戏窗口的宽度
  11. //定义全局变量
  12. int i,j;
  13. int a[2]; //用于记住蛇尾坐标,其中a[0]、a[1]分别表示横、竖坐标
  14. //声明蛇的结构体
  15. struct Snake
  16. {
  17. int x[100]; //蛇的横坐标,其中x[0]表示蛇尾的横坐标,x[N-1]表示蛇头的横坐标
  18. int y[100]; //蛇的竖坐标,其中y[0]表示蛇尾的竖坐标,y[N-1]表示蛇头的竖坐标
  19. int count; //蛇吃食物的个数
  20. int length; //蛇的长度
  21. int speed; //蛇的速度
  22. };
  23. //声明食物的结构体
  24. struct Food
  25. {
  26. int x; //食物的横坐标
  27. int y; //食物的竖坐标
  28. };
  29. /******光标移到指定位置**************************************************************/
  30. void gotoxy(HANDLE hOut, int x, int y)
  31. {
  32. COORD pos;
  33. pos.X = x; //横坐标
  34. pos.Y = y; //纵坐标
  35. SetConsoleCursorPosition(hOut, pos);
  36. }
  37. /******设置文本为绿色*****************************************************************/
  38. void Set_TextColor_Green (void)
  39. {
  40. HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
  41. SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
  42. }
  43. /******制作游戏窗口******************************************************************/
  44. void make_frame()
  45. {
  46. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量
  47. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); //打印选择菜单
  48. printf("Esc 退出游戏");
  49. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
  50. printf("长按方向键:加速");
  51. gotoxy(hOut,FrameX,FrameY); //打印框角
  52. printf("╔");
  53. gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
  54. printf("╗");
  55. gotoxy(hOut,FrameX,FrameY+Frame_height);
  56. printf("╚");
  57. gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
  58. printf("╝");
  59. for(i=2;i<2*Frame_width-2;i+=2)
  60. {
  61. gotoxy(hOut,FrameX+i,FrameY);
  62. printf("═"); //打印上横框
  63. }
  64. for(i=2;i<2*Frame_width-2;i+=2)
  65. {
  66. gotoxy(hOut,FrameX+i,FrameY+Frame_height);
  67. printf("═"); //打印下横框
  68. }
  69. for(i=1;i<Frame_height;i++)
  70. {
  71. gotoxy(hOut,FrameX,FrameY+i);
  72. printf("║"); //打印左竖框
  73. }
  74. for(i=1;i<Frame_height;i++)
  75. {
  76. gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
  77. printf("║"); //打印右竖框
  78. }
  79. gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称
  80. Set_TextColor_Green (); //设置蛇为绿色
  81. printf("贪吃蛇游戏");
  82. }
  83. /******结束菜单*******************************************************************/
  84. void over_game()
  85. {
  86. system("cls");
  87. printf("\n\n\n\n\n\n\n\n\t\t\t\t游戏结束\n\n\n");
  88. Sleep(2000);
  89. getch();
  90. }
  91. /******菜单信息***************************************************************/
  92. print_information(HANDLE hOut,struct Snake *snake,struct Food *food)
  93. {
  94. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
  95. printf("level : %d",snake->count/5+1); //打印游戏等级
  96. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
  97. printf("score : %d",10*snake->count); //打印游戏得分
  98. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
  99. printf("eat food : %d",snake->count); //打印产生食物个数
  100. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);
  101. printf("speed : %dms",snake->speed); //打印游戏速度
  102. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9);
  103. printf("foodX : %d",food->x); //打印食物的横坐标
  104. gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11);
  105. printf("foodY : %d",food->y); //打印食物的竖坐标
  106. }
  107. /******初始化蛇**********************************************************************/
  108. void init_snake(struct Snake *snake)
  109. {
  110. snake->x[0]=FrameX+2; //初始化蛇的横坐标
  111. snake->y[0]=FrameY+Frame_height/2; //初始化蛇的竖坐标
  112. snake->speed=300; //初始化蛇的速度为300ms
  113. snake->length=3; //初始化蛇的长度为3节
  114. snake->count=0; //初始化蛇吃的个数为0
  115. for(i=1;i<snake->length;i++)
  116. {/* 依次得到蛇身、蛇头的坐标 */
  117. snake->x[i]=snake->x[i-1]+2;
  118. snake->y[i]=snake->y[i-1];
  119. }
  120. }
  121. /******移动蛇*************************************************************************/
  122. void move_snake(HANDLE hOut,struct Snake *snake)
  123. {
  124. gotoxy(hOut,snake->x[0],snake->y[0]);
  125. printf(" "); /* 清除蛇尾*/
  126. for(i=1;i<snake->length;i++)
  127. {/* 后一节的坐标依次取代前一节的坐标 */
  128. snake->x[i-1]=snake->x[i];
  129. snake->y[i-1]=snake->y[i];
  130. }
  131. }
  132. /******打印蛇*************************************************************************/
  133. void print_snake(HANDLE hOut,struct Snake *snake)
  134. {
  135. for(i=0;i<snake->length;i++)
  136. {
  137. gotoxy(hOut,snake->x[i],snake->y[i]);
  138. if(i==0)
  139. {
  140. printf("○"); //打印蛇尾
  141. }
  142. else if(i==snake->length-1)
  143. {
  144. printf("¤"); //打印蛇头
  145. }
  146. else
  147. {
  148. printf("⊙"); //打印蛇身
  149. }
  150. }
  151. }
  152. /******随机产生食物*******************************************************************/
  153. void get_food(HANDLE hOut,struct Snake *snake,struct Food *food)
  154. {
  155. srand((unsigned)time(NULL)); //初始化随机数
  156. while(1)
  157. {/* 产生食物的条件:1.在游戏窗口内 2.不在蛇的身上 */
  158. food->x = rand() % (Frame_width-1);
  159. food->y = rand() % Frame_height;
  160. if( food->x==0 || food->y==0 )
  161. {
  162. continue;
  163. }
  164. food->x = 2*food->x + FrameX; //得到食物的横坐标
  165. food->y+=FrameY; //得到食物的竖坐标
  166. for(i=0;i<snake->length;i++)
  167. {/* 判断食物是否在蛇的身上,如果在蛇身上,则重新产生;否则,打印蛇身 */
  168. if( food->x==snake->x[i] && food->y==snake->y[i] )
  169. {
  170. break;
  171. }
  172. }
  173. if(i==snake->length)
  174. {
  175. gotoxy(hOut,food->x,food->y);
  176. printf("⊙");
  177. break;
  178. }
  179. }
  180. }
  181. /******吃食物***************************************************************************/
  182. void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food)
  183. {
  184. if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y )
  185. {/* 如果蛇头位置与食物位置相同,吃食物 */
  186. snake->length++; //吃一个食物,蛇身增长一节
  187. for(i=snake->length-1;i>=1;i--)
  188. {/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */
  189. snake->x[i]=snake->x[i-1];
  190. snake->y[i]=snake->y[i-1];
  191. }
  192. snake->x[0]=a[0]; //得到蛇尾移动前的横坐标
  193. snake->y[0]=a[1]; //得到蛇尾移动前的竖坐标
  194. get_food(hOut,snake,food); //重新产生食物
  195. snake->count++; //食物的个数增1
  196. if( snake->count%5==0 )
  197. {/* 当蛇吃Up_level个食物时,速度加快Up_speed毫秒并且升一级 */
  198. snake->speed-=50;
  199. }
  200. }
  201. }
  202. /******穿墙**********************************************************************************/
  203. void through_wall(HANDLE hOut,struct Snake *snake,char ch)
  204. {
  205. if( ch==72 && snake->y[snake->length-1]==FrameY)
  206. {
  207. snake->y[snake->length-1] = FrameY+Frame_height-1; //如果蛇在上框且向上移动,穿墙
  208. }
  209. if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height )
  210. {
  211. snake->y[snake->length-1] = FrameY+1; //如果蛇在下框且向下移动,穿墙
  212. }
  213. if( ch==75 && snake->x[snake->length-1]==FrameX )
  214. {
  215. snake->x[snake->length-1] = FrameX+2*Frame_width-4; //如果蛇在左框且向左移动,穿墙
  216. }
  217. if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 )
  218. {
  219. snake->x[snake->length-1] = FrameX+2; //如果蛇在右框且向右移动,穿墙
  220. }
  221. }
  222. /******判断蛇是否死**************************************************************************/
  223. int if_die(struct Snake *snake)
  224. {/* 当蛇头碰到自身时,蛇死 ,返回值为0 */
  225. for(i=0;i<snake->length-1;i++)
  226. {
  227. if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] )
  228. {
  229. return 0;
  230. }
  231. }
  232. return 1;
  233. }
  234. /******开始游戏*******************************************************************************/
  235. void start_game()
  236. {
  237. unsigned char ch=77; //定义用于接收键盘输入的字符变量
  238. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量
  239. struct Snake s,*snake=&s; //定义蛇的结构体指针并指向蛇的结构体
  240. struct Food f,*food=&f; //定义食物的结构体指针并指向食物的结构体
  241. make_frame(); //制作游戏窗口
  242. init_snake(snake); //初始化蛇
  243. get_food(hOut,snake,food); //随机产生食物
  244. while(1)
  245. {
  246. print_information(hOut,snake,food); //打印菜单信息
  247. a[0]=snake->x[0]; //记住蛇尾的横坐标
  248. a[1]=snake->y[0]; //记住蛇尾的竖坐标
  249. j=0;
  250. if(kbhit())
  251. {/* 判断是否按下键盘,如果按下,ch接收键盘输入 */
  252. ch=getch();
  253. if(kbhit())
  254. {/* 如果长按键盘,则加速 */
  255. Sleep(20);
  256. j=1;
  257. }
  258. }
  259. switch(ch)
  260. {
  261. case 72:
  262. {/* 向上移动 */
  263. move_snake(hOut,snake); //移动蛇
  264. snake->y[snake->length-1]-=1; //蛇头的竖坐标向上移,即减1
  265. break;
  266. }
  267. case 80:
  268. {/* 向下移动 */
  269. move_snake(hOut,snake); //移动蛇
  270. snake->y[snake->length-1]+=1; //蛇头的竖坐标向下移,即加1
  271. break;
  272. }
  273. case 75:
  274. {/* 向左移动 */
  275. move_snake(hOut,snake); //移动蛇
  276. snake->x[snake->length-1]-=2; //蛇头的横坐标向左移,即减2
  277. break;
  278. }
  279. case 77:
  280. {/* 向右移动 */
  281. move_snake(hOut,snake); //移动蛇
  282. snake->x[snake->length-1]+=2; //蛇头的横坐标向右移,即加2
  283. break;
  284. }
  285. }
  286. through_wall(hOut,snake,ch); //穿墙
  287. eat_food(hOut,snake,food); //吃食物
  288. print_snake(hOut,snake); //打印蛇
  289. if( if_die(snake)==0 || ch==27 || snake->speed==50 )
  290. {/* 游戏结束条件:1.蛇碰到自身 2.按Esc键 3.速度为50ms */
  291. gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1);
  292. printf("Game Over");
  293. Sleep(2000);
  294. break;
  295. }
  296. if(j==0)
  297. {
  298. Sleep(snake->speed); //延迟时间
  299. }
  300. else
  301. {
  302. Sleep(1000);
  303. }
  304. }
  305. }
  306. int main()
  307. {
  308. system("color 0D"); //设置文本为粉红色
  309. start_game(); //开始游戏
  310. over_game();
  311. return 0; //结束游戏
  312. }

  1. 3.贪吃蛇的简单移动
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #define BEG_X 2
  6. #define BEG_Y 1
  7. #define WID 20
  8. #define HEI 20
  9. HANDLE hout;
  10. typedef enum {UP, DOWN, LEFT, RIGHT} DIR;
  11. typedef struct Snake_body
  12. {
  13. COORD pos;//蛇身的位置
  14. struct Snake_body *next;//下一个蛇身
  15. struct Snake_body *prev;//前一个蛇身
  16. }SNAKE, *PSNAKE;
  17. PSNAKE head = NULL;//蛇头
  18. PSNAKE tail = NULL;//蛇尾
  19. //画游戏边框的函数
  20. void DrawBorder()
  21. {
  22. int i, j;
  23. COORD pos = {BEG_X, BEG_Y};
  24. for(i = 0; i < HEI; ++i)
  25. {
  26. SetConsoleCursorPosition(hout, pos);
  27. for(j = 0; j < WID; ++j)
  28. {
  29. if(i == 0)//第一行
  30. {
  31. if(j == 0)
  32. printf("┏");
  33. else if(j == WID - 1)
  34. printf("┓");
  35. else
  36. printf("━");
  37. }
  38. else if(i == HEI - 1)//最后一行
  39. {
  40. if(j == 0)
  41. printf("┗");
  42. else if(j == WID - 1)
  43. printf("┛");
  44. else
  45. printf("━");
  46. }
  47. else if(j == 0 || j == WID - 1)//第一列或最后一列
  48. printf("┃");
  49. else
  50. printf(" ");
  51. }
  52. ++pos.Y;
  53. }
  54. }
  55. //添加蛇身的函数
  56. void AddBody(COORD pos)
  57. {
  58. PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));
  59. pnew->pos = pos;
  60. if(!head)
  61. {
  62. head = tail = pnew;
  63. }
  64. else
  65. {
  66. pnew->next = head;//新创建蛇身的next指向原先的蛇头
  67. head->prev = pnew;//原先的蛇头的prev指向新创建的蛇身
  68. head = pnew;//把新创建的蛇身作为新的蛇头
  69. }
  70. SetConsoleCursorPosition(hout, head->pos);
  71. printf("◎");
  72. }
  73. //蛇身移动的函数
  74. void MoveBody(DIR dir)
  75. {
  76. PSNAKE ptmp;
  77. COORD pos = head->pos;
  78. switch(dir)
  79. {
  80. case UP:
  81. if(head->pos.Y > BEG_Y + 1)
  82. --pos.Y;
  83. else
  84. return;
  85. break;
  86. case DOWN:
  87. if(head->pos.Y < BEG_Y + HEI - 2)
  88. ++pos.Y;
  89. else
  90. return;
  91. break;
  92. case LEFT:
  93. if(head->pos.X > BEG_X + 2)
  94. pos.X -= 2;
  95. else
  96. return;
  97. break;
  98. case RIGHT:
  99. if(head->pos.X < BEG_X + (WID - 2) * 2)
  100. pos.X += 2;
  101. else
  102. return;
  103. break;
  104. }
  105. AddBody(pos);//添加了一个新的蛇头
  106. ptmp = tail;//保存当前的蛇尾
  107. tail = tail->prev;
  108. if(tail)
  109. tail->next = NULL;
  110. SetConsoleCursorPosition(hout, ptmp->pos);
  111. printf(" ");
  112. free(ptmp);
  113. }
  114. int main()
  115. {
  116. int ctrl;
  117. DIR dir = RIGHT;//初始蛇的方向是向右的
  118. COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};
  119. system("color 0E");
  120. system("mode con cols=90 lines=30");
  121. hout = GetStdHandle(STD_OUTPUT_HANDLE);
  122. printf(" ------------贪吃蛇的移动------------");
  123. DrawBorder();
  124. //自定义几个蛇的身体
  125. AddBody(pos);
  126. pos.X += 2;
  127. AddBody(pos);
  128. pos.X += 2;
  129. AddBody(pos);
  130. pos.X += 2;
  131. AddBody(pos);
  132. pos.X += 2;
  133. AddBody(pos);
  134. pos.X += 2;
  135. AddBody(pos);
  136. pos.X += 2;
  137. AddBody(pos);
  138. //控制蛇的移动
  139. while(ctrl = getch())
  140. {
  141. switch(ctrl)
  142. {
  143. case 'w':
  144. if(dir == DOWN)
  145. continue;
  146. dir = UP;
  147. break;
  148. case 's':
  149. if(dir == UP)
  150. continue;
  151. dir = DOWN;
  152. break;
  153. case 'a':
  154. if(dir == RIGHT)
  155. continue;
  156. dir = LEFT;
  157. break;
  158. case 'd':
  159. if(dir == LEFT)
  160. continue;
  161. dir = RIGHT;
  162. break;
  163. case 'q':
  164. return 0;
  165. }
  166. MoveBody(dir);
  167. }
  168. return 0;
  169. }
  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<windows.h>
  4. #include<stdlib.h>
  5. #define U 1
  6. #define D 2
  7. #define L 3
  8. #define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右
  9. typedef struct SNAKE { //蛇身的一个节点
  10. int x;
  11. int y;
  12. struct SNAKE *next;
  13. } snake;
  14. //全局变量//
  15. int score=0,add=10;//总得分与每次吃食物得分。
  16. int status,sleeptime=200;//每次运行的时间间隔
  17. snake *head, *food;//蛇头指针,食物指针
  18. snake *q;//遍历蛇的时候用到的指针
  19. int endgamestatus=0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。
  20. //声明全部函数//
  21. void Pos();
  22. void creatMap();
  23. void initsnake();
  24. int biteself();
  25. void createfood();
  26. void cantcrosswall();
  27. void snakemove();
  28. void pause();
  29. void gamecircle();
  30. void welcometogame();
  31. void endgame();
  32. void gamestart();
  33. void Pos(int x,int y) { //设置光标位置
  34. COORD pos;
  35. HANDLE hOutput;
  36. pos.X=x;
  37. pos.Y=y;
  38. hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  39. SetConsoleCursorPosition(hOutput,pos);
  40. }
  41. void creatMap() { //创建地图
  42. int i;
  43. for(i=0; i<58; i+=2) { //打印上下边框
  44. Pos(i,0);
  45. printf("■");
  46. Pos(i,26);
  47. printf("■");
  48. }
  49. for(i=1; i<26; i++) { //打印左右边框
  50. Pos(0,i);
  51. printf("■");
  52. Pos(56,i);
  53. printf("■");
  54. }
  55. }
  56. void initsnake() { //初始化蛇身
  57. snake *tail;
  58. int i;
  59. tail=(snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//
  60. tail->x=24;
  61. tail->y=5;
  62. tail->next=NULL;
  63. for(i=1; i<=4; i++) {
  64. head=(snake*)malloc(sizeof(snake));
  65. head->next=tail;
  66. head->x=24+2*i;
  67. head->y=5;
  68. tail=head;
  69. }
  70. while(tail!=NULL) { //从头到为,输出蛇身
  71. Pos(tail->x,tail->y);
  72. printf("■");
  73. tail=tail->next;
  74. }
  75. }
  76. int biteself() { //判断是否咬到了自己
  77. snake *self;
  78. self=head->next;
  79. while(self!=NULL) {
  80. if(self->x==head->x && self->y==head->y) {
  81. return 1;
  82. }
  83. self=self->next;
  84. }
  85. return 0;
  86. }
  87. void createfood() { //随机出现食物
  88. snake *food_1;
  89. srand((unsigned)time(NULL));
  90. food_1=(snake*)malloc(sizeof(snake));
  91. while((food_1->x%2)!=0) { //保证其为偶数,使得食物能与蛇头对其
  92. food_1->x=rand()%52+2;
  93. }
  94. food_1->y=rand()%24+1;
  95. q=head;
  96. while(q->next==NULL) {
  97. if(q->x==food_1->x && q->y==food_1->y) { //判断蛇身是否与食物重合
  98. free(food_1);
  99. createfood();
  100. }
  101. q=q->next;
  102. }
  103. Pos(food_1->x,food_1->y);
  104. food=food_1;
  105. printf("■");
  106. }
  107. void cantcrosswall() { //不能穿墙
  108. if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) {
  109. endgamestatus=1;
  110. endgame();
  111. }
  112. }
  113. void snakemove() { //蛇前进,上U,下D,左L,右R
  114. snake * nexthead;
  115. cantcrosswall();
  116. nexthead=(snake*)malloc(sizeof(snake));
  117. if(status==U) {
  118. nexthead->x=head->x;
  119. nexthead->y=head->y-1;
  120. if(nexthead->x==food->x && nexthead->y==food->y) { //如果下一个有食物//
  121. nexthead->next=head;
  122. head=nexthead;
  123. q=head;
  124. while(q!=NULL) {
  125. Pos(q->x,q->y);
  126. printf("■");
  127. q=q->next;
  128. }
  129. score=score+add;
  130. createfood();
  131. } else { //如果没有食物//
  132. nexthead->next=head;
  133. head=nexthead;
  134. q=head;
  135. while(q->next->next!=NULL) {
  136. Pos(q->x,q->y);
  137. printf("■");
  138. q=q->next;
  139. }
  140. Pos(q->next->x,q->next->y);
  141. printf(" ");
  142. free(q->next);
  143. q->next=NULL;
  144. }
  145. }
  146. if(status==D) {
  147. nexthead->x=head->x;
  148. nexthead->y=head->y+1;
  149. if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
  150. nexthead->next=head;
  151. head=nexthead;
  152. q=head;
  153. while(q!=NULL) {
  154. Pos(q->x,q->y);
  155. printf("■");
  156. q=q->next;
  157. }
  158. score=score+add;
  159. createfood();
  160. } else { //没有食物
  161. nexthead->next=head;
  162. head=nexthead;
  163. q=head;
  164. while(q->next->next!=NULL) {
  165. Pos(q->x,q->y);
  166. printf("■");
  167. q=q->next;
  168. }
  169. Pos(q->next->x,q->next->y);
  170. printf(" ");
  171. free(q->next);
  172. q->next=NULL;
  173. }
  174. }
  175. if(status==L) {
  176. nexthead->x=head->x-2;
  177. nexthead->y=head->y;
  178. if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
  179. nexthead->next=head;
  180. head=nexthead;
  181. q=head;
  182. while(q!=NULL) {
  183. Pos(q->x,q->y);
  184. printf("■");
  185. q=q->next;
  186. }
  187. score=score+add;
  188. createfood();
  189. } else { //没有食物
  190. nexthead->next=head;
  191. head=nexthead;
  192. q=head;
  193. while(q->next->next!=NULL) {
  194. Pos(q->x,q->y);
  195. printf("■");
  196. q=q->next;
  197. }
  198. Pos(q->next->x,q->next->y);
  199. printf(" ");
  200. free(q->next);
  201. q->next=NULL;
  202. }
  203. }
  204. if(status==R) {
  205. nexthead->x=head->x+2;
  206. nexthead->y=head->y;
  207. if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
  208. nexthead->next=head;
  209. head=nexthead;
  210. q=head;
  211. while(q!=NULL) {
  212. Pos(q->x,q->y);
  213. printf("■");
  214. q=q->next;
  215. }
  216. score=score+add;
  217. createfood();
  218. } else { //没有食物
  219. nexthead->next=head;
  220. head=nexthead;
  221. q=head;
  222. while(q->next->next!=NULL) {
  223. Pos(q->x,q->y);
  224. printf("■");
  225. q=q->next;
  226. }
  227. Pos(q->next->x,q->next->y);
  228. printf(" ");
  229. free(q->next);
  230. q->next=NULL;
  231. }
  232. }
  233. if(biteself()==1) { //判断是否会咬到自己
  234. endgamestatus=2;
  235. endgame();
  236. }
  237. }
  238. void pause() { //暂停
  239. while(1) {
  240. Sleep(300);
  241. if(GetAsyncKeyState(VK_SPACE)) {
  242. break;
  243. }
  244. }
  245. }
  246. void gamecircle() { //控制游戏
  247. Pos(64,15);
  248. printf("不能穿墙,不能咬到自己\n");
  249. Pos(64,16);
  250. printf("用↑.↓.←.→分别控制蛇的移动.");
  251. Pos(64,17);
  252. printf("F1 为加速,F2 为减速\n");
  253. Pos(64,18);
  254. printf("ESC :退出游戏.space:暂停游戏.");
  255. Pos(64,20);
  256. printf("C语言研究中心 www.clang.cc");
  257. status=R;
  258. while(1) {
  259. Pos(64,10);
  260. printf("得分:%d ",score);
  261. Pos(64,11);
  262. printf("每个食物得分:%d分",add);
  263. if(GetAsyncKeyState(VK_UP) && status!=D) {
  264. status=U;
  265. } else if(GetAsyncKeyState(VK_DOWN) && status!=U) {
  266. status=D;
  267. } else if(GetAsyncKeyState(VK_LEFT)&& status!=R) {
  268. status=L;
  269. } else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) {
  270. status=R;
  271. } else if(GetAsyncKeyState(VK_SPACE)) {
  272. pause();
  273. } else if(GetAsyncKeyState(VK_ESCAPE)) {
  274. endgamestatus=3;
  275. break;
  276. } else if(GetAsyncKeyState(VK_F1)) {
  277. if(sleeptime>=50) {
  278. sleeptime=sleeptime-30;
  279. add=add+2;
  280. if(sleeptime==320) {
  281. add=2;//防止减到1之后再加回来有错
  282. }
  283. }
  284. } else if(GetAsyncKeyState(VK_F2)) {
  285. if(sleeptime<350) {
  286. sleeptime=sleeptime+30;
  287. add=add-2;
  288. if(sleeptime==350) {
  289. add=1; //保证最低分为1
  290. }
  291. }
  292. }
  293. Sleep(sleeptime);
  294. snakemove();
  295. }
  296. }
  297. void welcometogame() { //开始界面
  298. Pos(40,12);
  299. system("title C语言研究中心 www.clang.cc");
  300. printf("欢迎来到贪食蛇游戏!");
  301. Pos(40,25);
  302. printf(" C语言研究中心 www.clang.cc.\n");
  303. system("pause");
  304. system("cls");
  305. Pos(25,12);
  306. printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n");
  307. Pos(25,13);
  308. printf("加速将能得到更高的分数。\n");
  309. system("pause");
  310. system("cls");
  311. }
  312. void endgame() { //结束游戏
  313. system("cls");
  314. Pos(24,12);
  315. if(endgamestatus==1) {
  316. printf("对不起,您撞到墙了。游戏结束.");
  317. } else if(endgamestatus==2) {
  318. printf("对不起,您咬到自己了。游戏结束.");
  319. } else if(endgamestatus==3) {
  320. printf("您的已经结束了游戏。");
  321. }
  322. Pos(24,13);
  323. printf("您的得分是%d\n",score);
  324. exit(0);
  325. }
  326. void gamestart() { //游戏初始化
  327. system("mode con cols=100 lines=30");
  328. welcometogame();
  329. creatMap();
  330. initsnake();
  331. createfood();
  332. }
  333. int main() {
  334. gamestart();
  335. gamecircle();
  336. endgame();
  337. return 0;
  338. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/396504
推荐阅读
相关标签
  

闽ICP备14008679号