테트리스를 만들고 있는데 도형 방향을 바꾸거나 좌우로 움직여도 블럭이 계속 아래로 내려가야 하는데 방향을 바꾸거나 움직이는 동안에는 블럭이 아래로 안내려가요

이걸 고치고 싶은데 마음처럼 되질 않네요

어떻게 고치면 좋을까요

주석은 쓰다가 말았어요..




#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<memory.h>

//도형의 모양 저장
char form[7][4][8] =
{
 {{1,0,1,1,1,2,1,3},{0,1,1,1,2,1,3,1},{1,0,1,1,1,2,1,3},{0,1,1,1,2,1,3,1}},
 {{1,1,2,1,1,2,2,2},{1,1,2,1,1,2,2,2},{1,1,2,1,1,2,2,2},{1,1,2,1,1,2,2,2}},
 {{2,1,0,2,1,2,1,1},{1,0,1,1,2,1,2,2},{2,1,0,2,1,2,1,1},{1,0,1,1,2,1,2,2}},
 {{0,1,1,1,1,2,2,2},{2,0,2,1,1,1,1,2},{0,1,1,1,1,2,2,2},{2,0,2,1,1,1,1,2}},
 {{1,0,1,1,1,2,2,2},{0,1,1,1,2,1,0,2},{1,0,2,0,2,1,2,2},{2,1,2,2,1,2,0,2}},
 {{2,0,2,1,2,2,1,2},{0,1,0,2,1,2,2,2},{1,0,2,0,1,1,1,2},{0,1,1,1,2,1,2,2}},
 {{0,1,1,1,2,1,1,2},{2,0,2,1,2,2,1,1},{1,1,1,2,0,2,2,2},{1,0,1,1,1,2,2,1}},
};
char formb[7][4][8] =
{
 {{1,0,1,1,1,0,1,1},{0,1,1,1,0,1,1,1},{1,0,1,1,1,0,1,1},{0,1,1,1,0,1,1,1}},
 {{1,1,2,1,1,2,2,2},{1,1,2,1,1,2,2,2},{1,1,2,1,1,2,2,2},{1,1,2,1,1,2,2,2}},
 {{2,1,0,2,1,2,1,1},{1,0,1,1,2,1,2,2},{2,1,0,2,1,2,1,1},{1,0,1,1,2,1,2,2}},
 {{0,1,1,1,1,2,2,2},{2,0,2,1,1,1,1,2},{0,1,1,1,1,2,2,2},{2,0,2,1,1,1,1,2}},
 {{1,0,1,1,1,2,2,2},{0,1,1,1,2,1,0,2},{1,0,2,0,2,1,2,2},{2,1,2,2,1,2,0,2}},
 {{2,0,2,1,2,2,1,2},{0,1,0,2,1,2,2,2},{1,0,2,0,1,1,1,2},{0,1,1,1,2,1,2,2}},
 {{0,1,1,1,2,1,1,2},{2,0,2,1,2,2,1,1},{1,1,1,2,0,2,2,2},{1,0,1,1,1,2,2,1}},
};
//테트리스 보드판 배열
int tetris[21][12];


//점수 저장
int num = 0;

//블록의 종류를 나타내는 변수
int form_kind;
int form_kind_next;

//블록의 회전 형태를 나타내는 변수
int rotate_kind;

//화면 상에서의 좌표
int screen_x, screen_y;
void CursorOff()
{
 CONSOLE_CURSOR_INFO Information;
 Information.dwSize=1;
 Information.bVisible=FALSE;
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&Information);
}
void CurrentXY(int x, int y)
{
 COORD Location;
 Location.X=x;
 Location.Y=y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Location);
}
void Initial()
{
 int i,j;
 for(i=0;i<21;i++)
 {
  CurrentXY(30,i);
  printf("▣");
  CurrentXY(52,i);
  printf("▣");
 }
 for(j=0;j<12;j++)
 {
  CurrentXY((30)+j*2,20);
  printf("▣");
 }
 CurrentXY(30,20);
 printf("▣");
 CurrentXY(52,20);
 printf("▣");
 for(i=0;i<21;i++)
 {
  for(j=0;j<12;j++)
  {
   if(i==20||j==0||j==11)
    tetris[i][j]=3;
   else
    tetris[i][j]=0;
  }
 }
 
}

void PrintForm()
{
 int i;
 for(i=0;i<4;i++)
 {
  CurrentXY(30+(screen_x+form[form_kind][rotate_kind][i*2])*2,screen_y+form[form_kind][rotate_kind][i*2+1]);
  printf("口");
  tetris[screen_y+form[form_kind][rotate_kind][i*2+1]][screen_x+form[form_kind][rotate_kind][i*2]]=1;
 }
}
void PrintNext()
{
 int i;
 for(i=0;i<4;i++)
 {
  CurrentXY(62+form[form_kind][0][i*2]*2,6+form[form_kind][0][i*2+1]);
  printf(" ");
 }
 for(i=0;i<4;i++)
 {
  CurrentXY(62+form[form_kind_next][0][i*2]*2,6+form[form_kind_next][0][i*2+1]);
  printf("口");
}
}
//해당 위치에 이미 도형이나 테두리가 존재하는지 확인
int Check_board(int x, int y)
{
 int i, temp=0;
 for(i=0;i<4;i++)
 {
  //현재 위치에 있는 테트리스 도형 정보 읽어옴
  temp=tetris[y+form[form_kind][rotate_kind][i*2+1]][x+form[form_kind][rotate_kind][i*2]];
  if(temp>1)return TRUE;
}
 return FALSE;
}
void DeleteForm()
{
 int i;
 for(i=0;i<4;i++)
 {
  CurrentXY(30+(screen_x+form[form_kind][rotate_kind][i*2])*2,screen_y+form[form_kind][rotate_kind][i*2+1]);//삭제 위치 지정
  printf(" ");//도형 삭제
  tetris[screen_y+form[form_kind][rotate_kind][i*2+1]][screen_x+form[form_kind][rotate_kind][i*2]]=0;//비어있는 상황인 1을 tetris 배열에 저장
 }
}
void Write_board()
{
 int i;
 for(i=0;i<4;i++)
 {tetris[screen_y+form[form_kind][rotate_kind][i*2+1]][screen_x+form[form_kind][rotate_kind][i*2]]=2;}
}
int Check_line2(int row)
{
 int chk=0;
 int j;
 for(j=1;j<11;j++)
  chk+=tetris[row][j];
 if(chk==20) return TRUE;
 else return FALSE;
}
void Move_data(int row)
{
 int i,j;
 for(i=row-1;i>=0;i--)
  for(j=1;j<11;j++)
   tetris[i+1][j]=tetris[i][j];
}
void Print_data()
{
 int i,j;

 
 for(i=0;i<20;i++)
  for(j=1;j<11;j++)
   if(tetris[i][j]==2)
   {
    CurrentXY(30+j*2,i);
    printf("口");
   }  
   else
   {
    CurrentXY(30+j*2,i);
    printf(" ");
   }
   CurrentXY(62,20);
   printf("점수 : %d",num);

}

void Check_line()
{
 int rst, i;
 int temp=0;
 for(i=screen_y;i<screen_y+4;i++)
 {
  rst=Check_line2(i);
 
 if(rst==TRUE)
  {
   num+=2+(3*temp);
   temp++;
   Move_data(i);
   Print_data();
   i--;
  }
 }
}
int Go_Down()
{
 int chk2;
 chk2=Check_board(screen_x,screen_y+1);
 if(chk2==TRUE)
 {
  //
  Write_board();
  Check_line();
  return TRUE;
 }
 else{
  DeleteForm();
  screen_y++;
  PrintForm();
  return FALSE;
 }
}
int Select()
{
 int chk1, chk2;int prev_rotate,new_rotate;int rtn_value;
 if(GetAsyncKeyState(VK_LEFT))
 {
  chk1=Check_board(screen_x-1,screen_y);
   if(chk1==FALSE)
   {
    DeleteForm();
    screen_x--;
    PrintForm();
    return TRUE;
   }
 }
 if(GetAsyncKeyState(VK_RIGHT))
 {
  chk1=Check_board(screen_x+1,screen_y);
   if(chk1==FALSE)
   {
    DeleteForm();
    screen_x++;
    PrintForm();
    return TRUE;
   }
 }
 if(GetAsyncKeyState(VK_UP))
 {
  prev_rotate=rotate_kind;
  if(rotate_kind==3)
   rotate_kind=0;
  else
  rotate_kind++;
  
  new_rotate=rotate_kind;
  chk1=Check_board(screen_x,screen_y);
  if(chk1==TRUE)
  {
   rotate_kind=prev_rotate;
  }
  else{
   rotate_kind=prev_rotate;
   DeleteForm();
   rotate_kind=new_rotate;
   PrintForm();
   return TRUE;
  }
}
 if(GetAsyncKeyState(VK_DOWN))
 {
  chk1=Check_board(screen_x,screen_y+1);
   if(chk1==FALSE)
   {
    DeleteForm();
    screen_y+=1;
    PrintForm();  
    return TRUE;
   }
 }
 if(GetAsyncKeyState(VK_SPACE))
 {
  while(!Go_Down());
   return FALSE;
 }
 if(GetAsyncKeyState(VK_ESCAPE))
 {
  exit(0);
 }
 rtn_value = Go_Down();
 if(rtn_value==TRUE)
 {
  return FALSE;
 }
 else
 {

 return TRUE;
 }
}

void Timing()
{
 int timingspeed=200;
 if(10<=num)
 {
  timingspeed=190;
  CurrentXY(9,1);
  printf("CLEARED"); 
 
 }
 if(17<=num)
 {
  timingspeed=180;
  CurrentXY(9,3);
  printf("CLEARED");
 }
 if(28<=num)
 {
  timingspeed=165;
  CurrentXY(9,5);
  printf("CLEARED");
 }
 if(40<=num)
 {
  timingspeed=150;
  CurrentXY(9,7);
  printf("CLEARED");
  memset(form,0,224*sizeof(char));
  memcpy((char*)form,(char*)formb,224*sizeof(char));
 }
 if(70<=num)
 {
  timingspeed=140;
  CurrentXY(9,9);
  printf("CLEARED");

  
 }
 if(100<=num)
 {
  timingspeed=130;
  CurrentXY(9,11);
  printf("CLEARED");
 }
 if(135<=num)
 {
  timingspeed=115;
  CurrentXY(9,13);
  printf("CLEARED");

 }
 if(180<=num)
 {
  timingspeed=100;
  CurrentXY(13,15);
  printf("CLEARED");
  CurrentXY(1,17);
  printf("축하합니다");
  
 }
 DWORD thisTickCount;
 static DWORD lastTickCount=0;
 DWORD delay=timingspeed;

 thisTickCount=GetTickCount();
 while(1)
 {
  if((thisTickCount-lastTickCount)>delay)
  {
   lastTickCount=thisTickCount;
   return;
  }
  thisTickCount=GetTickCount();
 }
}
//시작 화면
int start()
{
 int i;
 int a;
 
 for (int i = 8; i < 18; ++i)
 {
  CurrentXY(26,7); printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");
  CurrentXY(26,i); printf("┃");                              CurrentXY(86,i); printf("┃");
  CurrentXY(26,18);printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
  CurrentXY(52,10);printf("ㅌㅌㄹㅅ");
  CurrentXY(45,14);printf("1 : 시작         2 : 종료");
  CurrentXY(28,17);printf("*게임 도중 esc누르면 종료됩니다.");
 }
 a=getch();
 if(a=='1')
 {
  return TRUE;
 }
 else if(a=='2')
 {
  return 0;
 }
 else if(a!='1')
 {
  start();
 }
}
int main()
{
 int chk, chk2;

 if(start()==FALSE)
 {
  return FALSE;
 }
 system("cls");
 CurrentXY(1,1);
 printf("stage 1");
 CurrentXY(1,3);
 printf("stage 2");
 CurrentXY(1,5);
 printf("stage 3");
 CurrentXY(1,7);
 printf("stage 4");
 CurrentXY(1,9);
 printf("stage 5");
 CurrentXY(1,11);
 printf("stage 6");
 CurrentXY(1,13);
 printf("stage 7");
 CurrentXY(1,15);
 printf("stage FINAL");
  CurrentXY(62,20);
  printf("점수 : 0");
 CursorOff();
 Initial();
 srand((unsigned) time(NULL));
 form_kind_next=rand()%7;
 do{
  screen_x=4;
  screen_y=0;
  form_kind=form_kind_next;
  form_kind_next=rand()%7;
  rotate_kind=0;
  PrintForm();
  PrintNext();
  //0=그릴 수 없다1=그릴 수 있다
  chk=Check_board(screen_x,screen_y);
  chk2=Check_board(screen_x,screen_y+1);
  if(chk==TRUE&&chk2==TRUE)
   break;
  else if(chk==FALSE&&chk2==TRUE)
  {
   Write_board();
   Check_line();

   break;
  }
  do{                   
   Timing();
  }while(Select());
 }while(1);            
 return 0;
}