테트리스를 만들고 있는데 도형 방향을 바꾸거나 좌우로 움직여도 블럭이 계속 아래로 내려가야 하는데 방향을 바꾸거나 움직이는 동안에는 블럭이 아래로 안내려가요
이걸 고치고 싶은데 마음처럼 되질 않네요
어떻게 고치면 좋을까요
주석은 쓰다가 말았어요..
#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;
}
while(Select()); 요게 문제
srand depricated 아닌가? - return 0;
그게 문제인건 당연히 인지하고 있는데 그 방법외에 여러가지 해봤는데 다 안되더라구요..
당연히 루프 안에서 아래로 내려가는 코드가 돌 수 있으면 해결돼~
니가 Timing 내부 루프랑 Select 구조에서 내려갈 수 있는 코드를 고립시켜서 그럼.
완전히 논리적인 문제니까 차분히 살펴봐~
답변 감사합니다 말씀하신대로 고쳐볼게요 ㅠㅠ
ㅇㅇ//-----'되' -> '돼' [문법나치]--테스트중입니다
바보야 저기선 되가 맞아
ㅇㅇ//되가->돼가 (되어 = 돼임) [리듬 맞춤법 봇♬]