Advertisement
Infernale

NCTU LAB 11/12 SNAKE

Dec 11th, 2018
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <ctime>
  3. #include <conio2.h>
  4. #include <cstdlib>
  5.  
  6. #define MAXX 120
  7. #define MAXY 30
  8.  
  9.  
  10. void show (int x, int y, int dir, int len, int sx, int sy){
  11.     for (int i=0; i<len; i++){
  12.         switch (dir){
  13.             case 1:    
  14.                 gotoxy(x,(y-i-1)%MAXY+1); //DOWN
  15.                 break;
  16.             case 2:
  17.                 gotoxy(((x+i+MAXX-1)%MAXX+1),y); //LEFT
  18.                 break;
  19.             case 3:
  20.                 gotoxy(x,(y+i+MAXY-1)%MAXY+1); //UP
  21.                 break;    
  22.             case 4:    
  23.                 gotoxy(((x-i-1)%MAXX+1),y); //RIGHT
  24.                 break;
  25.         }              
  26.         if(i==0){    
  27.             textcolor(YELLOW);    
  28.             textbackground(LIGHTRED);    
  29.             printf("A");    
  30.         }else{
  31.             textbackground(LIGHTBLUE);
  32.             printf(" ");    
  33.         }      
  34.     }
  35.     switch (dir){
  36.         case 1:
  37.             gotoxy(x,y%MAXY-1);
  38.             break;
  39.         case 2:
  40.             gotoxy(x%MAXX+1,y);
  41.             break;
  42.         case 3:
  43.             gotoxy(x,y%MAXY+1);
  44.             break;
  45.         case 4:
  46.             gotoxy(x%MAXX-1,y);
  47.             break;
  48.     }
  49.     textattr((YELLOW<<4) + BLACK);
  50.     gotoxy(sx, sy);
  51.     printf("0");
  52. }
  53. void control(int *dir){
  54.     char key;
  55.     if (kbhit){
  56.         key = getch();
  57.         switch(key){
  58.             case 'w':
  59.                 *dir = 3;
  60.                 break;
  61.             case 'a':
  62.                 *dir = 2;
  63.                 break;
  64.             case 's':
  65.                 *dir = 1;
  66.                 break;
  67.             case 'd':
  68.                 *dir = 4;
  69.                 break;
  70.             case 'p':
  71.                 exit(0);
  72.                 break;
  73.             default:
  74.                 gotoxy(MAXX/2,MAXY/2);
  75.                 printf("USE ONLY LOWERCASE W/A/S/D");
  76.         }
  77.     }
  78. }
  79. void move(int dir, int *x, int *y){
  80.     switch(dir){
  81.         case 1:
  82.             *y+=1;
  83.             if(*y==MAXY+1){
  84.                 *y=0;
  85.             }
  86.             break;
  87.         case 2:
  88.             *x-=1;
  89.             if(*x==0){
  90.                 *x=MAXX
  91.             }
  92.             break;
  93.         case 3:
  94.             *y-=1;
  95.             if(*y==0){
  96.                 *y=MAXY;
  97.             }
  98.             break;
  99.         case 4:
  100.             *x+=1;
  101.             if(*x==MAXX+1){
  102.                 *x=0;
  103.             }
  104.             break;
  105.     }
  106. }
  107. void gen_stone(int *x, int*y, int *flag){
  108.     if(*flag==0){
  109.         *x = rand()%MAXX;
  110.         *y = rand()%MAXY;
  111.         *flag = 1;
  112.     }
  113. }
  114. void eat(int x, int y, int *len, int sx, int sy, int *sflag){
  115.     if(x==sx && y==sy){
  116.         *len+=1;
  117.         *sflag = 0;
  118.     }
  119. }
  120.  
  121. int main(){  
  122.     int x=20, y=20, dir=1, len=1;
  123.     int sx, sy, sflag=0;
  124.    
  125.     srand(time(NULL));
  126.     while(1){
  127.         textbackground(BLACK);
  128.         clrscr();
  129.         gen_stone(&sx, &sy, &sflag);
  130.         control(&dir);
  131.         move(dir, &x, &y);
  132.         eat(x,y,&len,sx,sy,&sflag);
  133.         show (x,y,dir,len,sx,sy);
  134.         _sleep(500);
  135.     }
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement