当前位置:   article > 正文

贪吃蛇——C语言实现(简版)_c语言贪吃蛇最简单代码50行

c语言贪吃蛇最简单代码50行

目录

导入相关头文件

定义食物结构体

定义蛇结构体

相关函数声明

主函数部分

地图设计

食物设计

按键功能实现

坐标设计

导入相关头文件

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h> //光标设置的API
  4. #include <time.h> //食物的随机性
  5. #include <conio.h> //按键监控
  6. #define Map_Hight 23 //地图高度
  7. #define Map_Width 90 //地图宽度
  8. #define Snake_Max_len 1000 //蛇的最大长度
  9. #define Snake_Begin_Len 3 //蛇的初始长度

定义食物结构体

  1. int score=0;
  2. //食物
  3. struct
  4. {
  5. int x;
  6. int y;
  7. }food;

定义蛇结构体

  1. //蛇
  2. struct
  3. {
  4. int x[Snake_Max_len];
  5. int y[Snake_Max_len];
  6. int len; //蛇的长度
  7. int speed=300; //蛇的移动速度
  8. }snake;

相关函数声明

  1. char key='w';
  2. bool changeflag=0; //she de bian hua biao ji(布尔类型)
  3. //1.地图
  4. void Drawmap();
  5. //2.食物产生
  6. void Creatfood();
  7. //3.按键操作
  8. void keydown();
  9. //4.蛇的状态
  10. bool snakeStatus();
  11. //5.光标移动
  12. void gotoxy(int x,int y);

主函数部分

  1. int main(void)
  2. {
  3. //隐藏光标
  4. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  5. CONSOLE_CURSOR_INFO cci;
  6. GetConsoleCursorInfo(hOut, &cci);
  7. cci.bVisible = FALSE;
  8. SetConsoleCursorInfo(hOut, &cci);
  9. Drawmap();
  10. while(1)
  11. {
  12. Sleep(snake.speed);
  13. Creatfood();
  14. keydown();
  15. if(!snakeStatus())
  16. {
  17. break;
  18. }
  19. }
  20. //system("pause");定住当前屏幕
  21. gotoxy(Map_Width/2,Map_Hight/2);
  22. printf("GameOver!");
  23. system("CLS");
  24. gotoxy(Map_Width/2,Map_Hight/2+1);
  25. printf("你的分数是 %d\n",score);
  26. }

地图设计

  1. void Drawmap()
  2. {
  3. //食物
  4. srand((unsigned int )time(NULL));
  5. do
  6. {
  7. food.x =rand() % (Map_Width-4)+2;
  8. food.y =rand() % (Map_Hight-2)+1;
  9. }while(food.x%2!=0);
  10. gotoxy(food.x, food.y);
  11. printf("◆");
  12. //地图
  13. for(int i=0;i<=Map_Hight;i++)
  14. {
  15. gotoxy(0,i);
  16. printf("■");
  17. gotoxy(Map_Width,i);
  18. printf("■");
  19. }
  20. for(int j=0;j<=Map_Width;j+=2)
  21. {
  22. gotoxy(j,0);
  23. printf("■");
  24. gotoxy(j,Map_Hight);
  25. printf("■");
  26. }
  27. //按键说明
  28. gotoxy(100,4);
  29. printf("按键说明");
  30. gotoxy(100,7);
  31. printf("向上:w W");
  32. gotoxy(100,10);
  33. printf("向下:s S");
  34. gotoxy(100,13);
  35. printf("向左:a A");
  36. gotoxy(100,16);
  37. printf("向右:d D");
  38. //画蛇
  39. snake.len=Snake_Begin_Len;
  40. srand((unsigned)time(NULL));
  41. do
  42. {
  43. snake.x[0]=rand() % (Map_Width/2)+Map_Width/4;
  44. snake.y[0]=rand() % (Map_Hight/2)+Map_Hight/4;
  45. }while (snake.x[0]%2!=0);
  46. gotoxy(snake.x[0],snake.y[0]);
  47. printf("●");
  48. for(int i = 1;i <snake.len ;i++)
  49. {
  50. snake.x[i]=snake.x[0];
  51. snake.y[i]=snake.y[i-1]+1;
  52. gotoxy(snake.x[i] ,snake.y[i]);
  53. printf("●");
  54. }
  55. //积分器
  56. gotoxy(100,22);
  57. printf("当前分数:%d",score);
  58. }

食物设计

  1. void Creatfood()
  2. {
  3. if(snake.x[0] == food.x&&snake.y[0] == food.y)
  4. {
  5. //积分器
  6. score++;
  7. gotoxy(100,22);
  8. printf("当前分数:%d",score);
  9. srand((unsigned)time(NULL));
  10. //产生的食物不能在蛇的身上且食物的坐标要是偶数
  11. while(1)
  12. {
  13. bool flag=true;
  14. food.x=rand() % (Map_Width-4)+2;
  15. food.y=rand() % (Map_Hight-2)+1;
  16. for(int k=0;k<snake.len;k++)
  17. {
  18. if(snake.x[k]==food.x&&snake.y[k]==food.y)
  19. {
  20. flag=false;
  21. break;
  22. }
  23. }
  24. if(flag&&food.x % 2 == 0)
  25. break;
  26. }
  27. gotoxy(food.x,food.y);
  28. printf("◆");
  29. changeflag=true;
  30. }
  31. }

按键功能实现

  1. void keydown()
  2. {
  3. //无按键处理
  4. if(_kbhit())
  5. { //有按键接收
  6. fflush(stdin);
  7. key=_getch();
  8. }
  9. //擦除最后一节
  10. if(!changeflag)
  11. {
  12. gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
  13. printf(" ");
  14. }
  15. else
  16. {
  17. snake.x[snake.len]=snake.x[snake.len-1];
  18. snake.y[snake.len]=snake.y[snake.len-1];
  19. snake.len++;
  20. }
  21. //后面的蛇身
  22. for(int i=snake.len-1;i>0;i--)
  23. {
  24. snake.x[i]=snake.x[i-1];
  25. snake.y[i]=snake.y[i-1];
  26. }
  27. switch(key)
  28. {
  29. case'w':
  30. case'W':
  31. snake.y[0]--;
  32. break;
  33. case'a':
  34. case'A':
  35. snake.x[0]-=2;
  36. break;
  37. case's':
  38. case'S':
  39. snake.y[0]++;
  40. break;
  41. case'd':
  42. case'D':
  43. snake.x[0]+=2;
  44. break;
  45. }
  46. gotoxy(snake.x[0],snake.y[0]);
  47. printf("●");
  48. changeflag=false;
  49. }

坐标设计

  1. bool snakeStatus()
  2. {
  3. //不能撞墙
  4. if(snake.x[0]==0||snake.x[0]==Map_Width||snake.y[0]==0||snake.y[0]==Map_Hight )
  5. return false;
  6. //不能撞自己
  7. for(int k=1;k<=snake.len;k++)
  8. {
  9. if(snake.x[k]==snake.x[0]&&snake.y[k]==snake.y[0])
  10. return false;
  11. }
  12. return true;
  13. }
  14. void gotoxy(int x,int y)
  15. {
  16. HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
  17. COORD coord; //定义光标结构体
  18. coord.X = x;
  19. coord.Y = y;
  20. SetConsoleCursorPosition(handle, coord);//移动光标
  21. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号