Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71015
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 87
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-06 22:00
文章分类

全部博文(7)

文章存档

2019年(4)

2018年(1)

2014年(2)

我的朋友

分类: C/C++

2018-08-30 21:18:31

支持win和linux
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #ifdef    WIN32
  4. #include<conio.h>
  5. #include<windows.h>
  6. #else
  7. #include<termios.h>
  8. #include<unistd.h>
  9. #include<fcntl.h>
  10. #endif
  11. #define    W    80
  12. #define    H    30
  13. #define    L    (H*W)
  14. #define    A    10
  15. #ifdef    WIN32
  16. #define    T    200
  17. #else
  18. #define    T    (200*1000)
  19. #endif
  20. char x[W][H]={0};
  21. int dx=0,dy=-1;
  22. struct q{
  23.     int x,y;
  24. };
  25. struct snake{
  26.     struct q q[L];
  27.     int l,r;
  28. }snake;
  29. #ifndef    WIN32
  30. int kbhit(){
  31.     struct termios oldt,newt;
  32.     int c;
  33.     int oldf;
  34.     tcgetattr(STDIN_FILENO,&oldt);
  35.     newt=oldt;
  36.     newt.c_lflag&=~(ICANON|ECHO);
  37.     tcsetattr(STDIN_FILENO,TCSANOW,&newt);
  38.     oldf=fcntl(STDIN_FILENO,F_GETFL,0);
  39.     fcntl(STDIN_FILENO,F_SETFL,oldf|O_NONBLOCK);
  40.     c=getchar();
  41.     tcsetattr(STDIN_FILENO,TCSANOW,&oldt);
  42.     fcntl(STDIN_FILENO,F_SETFL,oldf);
  43.     if(c!=EOF){
  44.         ungetc(c,stdin);
  45.         return 1;
  46.     }
  47.     return 0;
  48. }
  49. #endif
  50. void init(){
  51. #ifdef    WIN32
  52.     char a[100];
  53.     sprintf(a,"mode con cols=%d lines=%d",W,H);
  54.     system(a);
  55.     CONSOLE_CURSOR_INFO cci;
  56.     GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
  57.     cci.bVisible=0;
  58.     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
  59. #else
  60.     char a[100];
  61.     sprintf(a,"resize -s %d %d",H,W);
  62.     system(a);
  63.     printf("\033[2J");
  64.     printf("\033[?25l");
  65.     system("stty -echo");
  66. #endif
  67. }
  68. void quit(){
  69. #ifndef    WIN32
  70.     printf("\033[%d;%dH",0,0);
  71.     printf("\033[2J");
  72.     printf("\033[?25h");
  73.     system("stty echo");
  74. #endif
  75. }
  76. void print(int x,int y,char a[]){
  77. #ifdef    WIN32
  78.     COORD coord;
  79.     coord.X=x;
  80.     coord.Y=y;
  81.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
  82. #else
  83.     printf("\033[%d;%dH",y,x);
  84. #endif
  85.     printf(a);
  86. }
  87. void clr(){
  88.     while(kbhit()){
  89. #ifdef    WIN32
  90.         getch();
  91. #else
  92.         getchar();
  93. #endif
  94.     }
  95. }
  96. void control(){
  97.     char c;
  98.     if(!kbhit()){
  99.         return;
  100.     }
  101. #ifdef    WIN32
  102.     c=getch();
  103.     if(c!=-32){
  104.         clr();
  105.         return;
  106.     }
  107.     c=getch();
  108.     if(c!=72&&c!=80&&c!=75&&c!=77){
  109.         clr();
  110.         return;
  111.     }
  112. #else
  113.     c=getchar();
  114.     if(c!=27){
  115.         clr();
  116.         return;
  117.     }
  118.     c=getchar();
  119.     if(c!=91){
  120.         clr();
  121.         return;
  122.     }
  123.     c=getchar();
  124.     if(c!=65&&c!=66&&c!=68&&c!=67){
  125.         clr();
  126.         return;
  127.     }
  128. #endif
  129.     switch(c){
  130. #ifdef    WIN32
  131.         case 72:
  132. #else
  133.         case 65:
  134. #endif
  135.             if(dx==0&&dy==1){
  136.                 break;
  137.             }
  138.             dx=0;
  139.             dy=-1;
  140.             break;
  141. #ifdef    WIN32
  142.         case 80:
  143. #else
  144.         case 66:
  145. #endif
  146.             if(dx==0&&dy==-1){
  147.                 break;
  148.             }
  149.             dx=0;
  150.             dy=1;
  151.             break;
  152. #ifdef    WIN32
  153.         case 75:
  154. #else
  155.         case 68:
  156. #endif
  157.             if(dx==1&&dy==0){
  158.                 break;
  159.             }
  160.             dx=-1;
  161.             dy=0;
  162.             break;
  163. #ifdef    WIN32
  164.         case 77:
  165. #else
  166.         case 67:
  167. #endif
  168.             if(dx==-1&&dy==0){
  169.                 break;
  170.             }
  171.             dx=1;
  172.             dy=0;
  173.             break;
  174.     }
  175.     clr();
  176. }
  177. void food(){
  178.     int i,j;
  179.     while(1){
  180.         i=rand()%W;
  181.         j=rand()%H;
  182.         if(x[i][j]!=0){
  183.             continue;
  184.         }
  185.         x[i][j]=-1;
  186.         print(i,j,"0");
  187.         break;
  188.     }
  189. }
  190. void run(){
  191.     int i;
  192.     int ax,ay;
  193.     snake.l=snake.r=0;
  194.     snake.q[snake.r].x=rand()%W;
  195.     snake.q[snake.r].y=rand()%H;
  196.     x[snake.q[snake.r].x][snake.q[snake.r].y]=1;
  197.     print(snake.q[snake.r].x,snake.q[snake.r].y,"1");
  198.     snake.r=(snake.r+1)%L;
  199.     for(i=0;i<A;i++)
  200.     {
  201.         food();
  202.     }
  203.     while(1){
  204.         control();
  205.         ax=snake.q[snake.r-1].x+dx;
  206.         ay=snake.q[snake.r-1].y+dy;
  207.         if(ax<0||ay<0||ax>W-1||ay>H-1||x[ax][ay]==1){
  208.             print(0,0,"WA");
  209.             getchar();
  210.             quit();
  211.             return;
  212.         }
  213.         if(x[ax][ay]!=-1){
  214.             x[snake.q[snake.l].x][snake.q[snake.l].y]=0;
  215.             print(snake.q[snake.l].x,snake.q[snake.l].y," ");
  216.             snake.l=(snake.l+1)%L;
  217.         }
  218.         snake.q[snake.r].x=ax;
  219.         snake.q[snake.r].y=ay;
  220.         x[snake.q[snake.r].x][snake.q[snake.r].y]=1;
  221.         print(snake.q[snake.r].x,snake.q[snake.r].y,"1");
  222.         snake.r=(snake.r+1)%L;
  223.         if(snake.r-snake.l>A){
  224.             print(0,0,"AC");
  225.             getchar();
  226.             quit();
  227.             return;
  228.         }
  229. #ifdef    WIN32
  230.         Sleep(T);
  231. #else
  232.         usleep(T);
  233. #endif
  234.     }
  235. }
  236. int main(){
  237.     init();
  238.     run();
  239.     return 0;
  240. }

阅读(2723) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~