시작하면 10초정도 버티다가 뒤짐 ㅠㅠ 나보다 못하는듯


#include <Turboc.h>


#define RIGHT 77

#define LEFT 75

#define UP 72

#define DOWN 80

#define ESC 27


#define BW 10  //(Box roW)
#define BH 20  //(Box High)


#define BX 5  // 출력화면에서 테트리스 판이 놓일 위치
#define BY 1

void Lscreen(void); // 게임 외벽+내부 그림. (+내벽 초기화)

void Mscreen(void); // 게임 내부만 그림. (내부 상태 출력)

BOOL whatthefuck(int x,int y,int b,int r); // 충돌 판정 함 수 

void printshape(BOOL z); //모형 출력.

void rowfull(void );  //라인 제거.

int bscore(void);  // 현재 블록 총 가치  평가.
int bdown(void);

//BOOL key(void);   // 키 입력 처 리 

typedef struct{
 
 int x;
 int y;
 
 
}Point;

typedef struct{
 
 int nx;
 int ny;
 int rot;
 int score;
 
 
}Test;

Test scorearr[40];

Point shape[7][4][4]={

 {{0,0,0,-1,0,-2,0,1},{0,0,-1,0,1,0,2,0},{0,0,0,-1,0,-2,0,1},{0,0,-1,0,1,0,2,0}},
 {{0,0,-1,0,1,0,0,-1},{0,0,1,0,0,-1,0,1},{0,0,-1,0,1,0,0,1},{0,0,-1,0,0,-1,0,1}},
 {{0,0,-1,0,-1,-1,0,-1},{0,0,-1,0,-1,-1,0,-1},{0,0,-1,0,-1,-1,0,-1},{0,0,-1,0,-1,-1,0,-1}},
 {{0,0,-1,0,-1,-1,1,0},{0,0,0,-1,1,-1,0,1},{0,0,-1,0,1,0,1,1},{0,0,0,-1,0,1,-1,1}},
 {{0,0,-1,0,1,0,1,-1},{0,0,0,-1,0,1,1,1},{0,0,-1,0,1,0,-1,1},{0,0,0,-1,-1,-1,0,1}},
 {{0,0,-1,-1,0,-1,1,0},{0,0,1,0,1,-1,0,1},{0,0,-1,-1,0,-1,1,0},{0,0,1,0,1,-1,0,1}},
 {{0,0,-1,0,0,-1,1,-1},{0,0,-1,0,-1,-1,0,1},{0,0,-1,0,0,-1,1,-1},{0,0,-1,0,-1,-1,0,1}}
};


 
enum { EMPTY , BRICK , WALL };

char* pic[]={". ","■","□"};

int awall[BW+2][BH+2]; // 테트리스 판
int bwall[BW+2][BH+2]; // 자리 점수 부여.
int nx,ny;    
int brick;
int rot;



int main(void){
 
 int nframe=20;
 int nstay=20;
 int r;
 
 setcursortype(NOCURSOR);
 randomize();
 clrscr();
 
 Lscreen();  //기본 화면 세팅+초기화
 
 //테트리스 시작!!!
 
 for(;1;){
  
    
  
   
   nx=BW/2;     // 모형 생성 위치 이동.
   ny=3;
  
   rot=0;   
   brick=random(7);
  
    printshape(TRUE);
  
  
   if(whatthefuck(nx,ny,brick,rot)!=TRUE) break;  // 생성된 자리에 벽돌 있으면 게임 끝.
  
 
  
   //블록 내리고 처리함.
  
   while(1){
    
     if(--nstay==0)  //쿨타임 끝났다면
     { 
      nstay=nframe; //다시 쿨타임 채우고
      
      if(whatthefuck(nx,ny+1,brick,rot)!=TRUE)   // 하나 내릴려는데 벽돌잇음.
      {
      rowfull();    //  줄 채워졌으면 지움
           
      break;
      
      }
      
      printshape(FALSE);
      ny++;
      printshape(TRUE);
      
    
    }
    
     
    printshape(FALSE);
    r=bdown();
    nx=scorearr[r].nx;
    ny=scorearr[r].ny;
    rot=scorearr[r].rot;
    
    rowfull();
    delay(1000/20);
    break;
   
    
   
     }

    
    
   }
  
  
  
  
   clrscr();
  
  gotoxy(30,12);puts("G A M E  O V E R");

     setcursortype(NORMALCURSOR);
  
 
 
 
 
 return 0;
 
}

void Lscreen(void){
 
 int x,y;
 
 for(x=0;x<BW+2;x++)
 {
  for(y=0;y<BH+2;y++)
  {
   if(x==0||x==BW+1||y==0||y==BH+1)
    awall[x][y]=WALL;
   else
    awall[x][y]=EMPTY;
   
   gotoxy(BX+2*x,BY+y);
   puts(pic[awall[x][y]]);
  }
  
  
 }
 
 
}

void Mscreen(void){
 
 int x,y;
 
 for(x=1;x<BW+1;x++)
 {
  for(y=1;y<BH+1;y++)
  { 
   gotoxy(BX+2*x,BY+y);
   puts(pic[awall[x][y]]);
   
  }
  
 }
}

BOOL whatthefuck(int x,int y,int b,int r){
 
 int i;
 
 for(i=0;i<4;i++)
 {
  if(awall[x+shape[b][r][i].x][y+shape[b][r][i].y]!=EMPTY)  
  
  return FALSE;
  
  
 }
 
 return TRUE;
 
 
}


void printshape(BOOL z){
 
 int i;
 
 for(i=0;i<4;i++){
  
  gotoxy(BX+(nx+shape[brick][rot][i].x)*2,BY+ny+shape[brick][rot][i].y);
  
  if(z==TRUE)
   puts(pic[BRICK]);
  
  
  else
   puts(pic[EMPTY]);
  
 }
}

void rowfull(void){
 
 int x,y;
 int m,i;
 
 for(i=0;i<4;i++)
 { 
  awall[nx+shape[brick][rot][i].x][ny+shape[brick][rot][i].y]=BRICK;
  
 }
 
 for(y=1;y<BH+1;y++)
 { 
  for(x=1;x<BW+1;x++)
  {
   if(awall[x][y]!=BRICK)
    break;
    
  }
  
  if(x==BW+1)
  { 
   
   for(m=y;m>1;m--)
   { 
    for(x=1;x<BW+1;x++)
    awall[x][m]=awall[x][m-1];
    
   }
  }
  
 }
 
 Mscreen();
 
 
}

int bscore(void){
 
 int x,y;
 
 int score=0;
 
 for(x=1;x<BW+1;x++)
 {
  for(y=1;y<BH+1;y++)
  {
   score+=(bwall[x][y]==BRICK)?y:0;
  }
 }
 
 
 return score;
 
 
}

int bdown(void){
 
 int x,y,i,k=0;
 int a;
 int arr[40];
 int num=0;
 int yy,xx;
 int minx,maxx;
 
 for(a=0;a<40;a++)
 { 
  scorearr[a].nx=0;
  scorearr[a].ny=0;
  scorearr[a].rot=0;
  scorearr[a].score=0;
  
 }
 
 
 for(x=0;x<BW+2;x++)
 {
  for(y=0;y<BH+2;y++)
  {
   
   bwall[x][y]=awall[x][y];
  }
  
 }
 
 
 for(a=0;a<4;a++){
  
   yy=ny;
   xx=nx;
   
   while(whatthefuck(xx-1,yy,brick,a)!=FALSE)
        xx--;
       
      minx=xx;
      xx=nx;
      
   while(whatthefuck(xx+1,yy,brick,a)!=FALSE)
     xx++;
     
     maxx=xx;
     
     for(k=minx;k<=maxx;k++)
     {
          
        while(whatthefuck(k,yy+1,brick,a)!=FALSE)
          yy++;
               
        
     for(i=0;i<4;i++)
     { 
      bwall[k+shape[brick][a][i].x][yy+shape[brick][a][i].y]=BRICK;
     }
     
     scorearr[num].nx=k;
     scorearr[num].ny=yy;
     scorearr[num].rot=a;
     scorearr[num].score=bscore();
     num++;
     
     for(i=0;i<4;i++)
      bwall[k+shape[brick][a][i].x][yy+shape[brick][a][i].y]=awall[k+shape[brick][a][i].x][yy+shape[brick][a][i].y];
    
     
     }
       
      
   
  
  
 }
 
 
 
  for(a=0,k=0;a<num-1;a++)
   { 
   
    if(scorearr[k].score<=scorearr[a+1].score)
      k=a+1;
   }
   
   return k;
 
   
 
 
 
 
 
 
}