#include <stdio.h>
#include <Turboc.h>
#define UP 72 // 모형바꿀떄
#define DOWN 80 // 모형 빠르게 내려오게하기
#define LEFT 75 // 모형 왼쪽으로 이동
#define RIGHT 77 // 모형 오른쪽으로 이동
#define ESC 27 // 테트리스 중단
#define SPACE 32 // 모형 맨밑으로 즉시이동
typedef struct point
{
int x;
int y;
}point;
point shape[4][4]={{0,0,0,-1,2,0,-2,0},{0,0,0,1,2,0,-2,0},{0,0,2,0,0,-1,0,1},{0,0,-2,0,0,-1,0,1}}; // 조각1 예시
char *bw[3]={" ","□ ","■"};
BOOL arr[12][22];// 테트리스 테두리안 false로 모두 초기화
BOOL o[12][22]; //땅바닥에 쳐박혀잇는 상자들은 arr[][]=1 + o[]=1 내려오고잇는중인 상자는 arr[][]=1 o[]=0
void allscreen(); // 겉테두리+전체 스크린 출력
void erase(); //한줄이 채워지면 지우기
main()
{
int veloc=15; // 내려갈때 속도
int velocc=15; //내려갈떄 속도에 대한 카운터
int r;
int a;
int k=0;
randomize();
clrscr();
gotoxy(20,20);
puts("any key put!");
getch();
clrscr();
allscreen();
while(1)
{
r=random(1);
while(1){
switch(r)
{ case 0:
gotoxy(11,2);
for(a=0;a<4;a++)
{ arr[5+(shape[0][a].x-1)/2][1+shape[0][a].y+k]=TRUE;
allscreen();
}
break;
}
if(--veloc==0)
{ veloc=velocc;
for(a=0;a<4;a++){
arr[5+(shape[0][a].x-1)/2][1+shape[0][a].y+k]=FALSE;
arr[5+(shape[0][a].x-1)/2][1+shape[0][a].y+k+1]=TRUE;
}
k++;
allscreen();
}
delay(1000/1000);
}
}
}
void allscreen() //arr[a][b]==(좌표지점)((a*2)+1,b+1),좌표지점(a,b)=arr[(a-1)/2][b-1].
{ //좌표지점 (1,1)=arr[0][0],(3,2)=arr[1][1]
int a;
int b;
for(a=0;a<12;a++)
{ for(b=0;b<22;b++)
{
if((a==0)||(b==0)||(a==11)||(b==21)) //테두리 □로 만들어준다
{
gotoxy((a*2)+1,b+1);
puts(bw[1]);
o[a][b]=FALSE;
}
else if(arr[a][b]==FALSE) //테두리 외에 테두리안에서 a.b가 비어잇다면,
{
gotoxy((a*2)+1,b+1);
puts(bw[0]); // " "로 만든다
o[a][b]=FALSE;
}
else if(arr[a][b]==TRUE) //테두리 내에 a.b가 차잇다면,
{
gotoxy((a*2)+1,b+1);
puts(bw[2]); //"■"로 만들어준다.
}
}
}
} // allscreen()함수 종료문
void erase()
{
int a,b,c,sum;
for(b=1;b<21;b++)
{
sum=0;
for(a=1;a<11;a++)
{
sum=arr[a][b]+sum;
}
if(sum==10)
{
for(a=1;a<11;a++)
{
arr[a][b]=FALSE;
o[a][b]=FALSE;
}
for(c=b-1;c>1;c--)
{ for(a=1;a<11;a++)
{
if((arr[a][c]==TRUE)&&(o[a][c]==TRUE))
{ arr[a][c]=FALSE;
o[a][c]=FALSE;
arr[a][c+1]=TRUE;
o[a][c+1]=TRUE;
}
}
}
}
}
}
미련하게 계속 화면전체를 출력시키게 해서 그런거야?
그런거같은데. 모든 블록에 대한 그림을 매 루프문마다 도는거 아님? delay(1000/1000)은 왜넣은거야 delay(1) 인데 이거 딜레이 ms 단위 아니냐? 그럼 ms 마다 모든 데이터를 다시 처음부터 다그려줘야하는건데 오버헤드가 심하지않을까?
설사 이게 렉이나 잘돌아간다고해도 충분히 문제가 있을수도있음. 프로젝트 진행하다가 버그가 하나도없거나 문제가없는건 맹근놈이 똑똑한게 아니라 나중에 몰아서 터짐 그럼 존나빡쳐여
ㄴ 그렇구나..그럼 함수를 좀더 나눠서 짜볼게요! 답변 감사합니당
ㄴㄴ 함수를 나누는게 단순히 문제가아니라 만약 allscreen함수에서 모든 데이터를 지우고 다시 그려주는거 만든거아님? gotoxy가 draw에관련된 함수 맞지않음? drawing 에 관련된 함수면 오버해드 엄청크다. 그러지말고 canvas같은 속성중에 이전 상태값그대로 저장하고 새롭게 draw할수 있는 옵션이있다 그거걸어주고 이전배열 현재배열 비교해서 변경된 것만 다시그리도록해야됨 단순히 함수를 몇개 나눈다고 근본적인 해결책이 아닐듯 해
무조건 canvas에 draw를 하는 객체는 오버헤드가 엄청커서 네가 알고리즘적으로 draw함수콜을 줄여야함
화면 좌표에 관련된 정보를 담고잇는 배열을 전과 후로 비교해서 다른부분만 draw 해주는식으로 하는건가요?
ㅇㅇㅇ 그게 가장확실한 방법이야 해보고 성능개선됬는지 안됫는지 궁금하니 알려줘
ㄴ 렉이 엄청 줄엇어요 ㅋㅋ
그래 잘했당 ㅋㅋ 그렇게 오버헤드 작은 연산하나하나 없에가면 그게 니실력이됨