C언어 질문입니다.

C언어 질문입니다.

작성일 2013.04.10댓글 1건
    게시물 수정 , 삭제는 로그인 필요

 #include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
int a=0;
int b=0;
int j,k;

void showBlock(int shape,int,int);
void remove(int,int,int);
void setCursor(int x, int y);
int Block[7][4][4][4]=
{
{
{{0,1,1,1},{0,0,0,1},{0,0,0,0},{0,0,0,0}}, //┘
{{0,0,0,1},{0,0,0,1},{0,0,1,1},{0,0,0,0}},
{{0,0,0,0},{0,1,0,0},{0,1,1,1},{0,0,0,0}},
{{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},
},
{
{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},//┴
{{0,1,0,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},
{{0,0,1,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}},
},
{
{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},//─
{{0,0,0,1},{0,0,0,1},{0,0,0,1},{0,0,0,1}},
{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},
{{0,0,0,1},{0,0,0,1},{0,0,0,1},{0,0,0,1}},
},
{
{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}}, //┌┐
{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}}, //└┘
{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
},
{
{{0,1,1,1},{0,1,0,0},{0,0,0,0},{0,0,0,0}}, //└
{{0,0,1,1},{0,0,0,1},{0,0,0,1},{0,0,0,0}},
{{0,0,0,0},{0,0,0,1},{0,1,1,1},{0,0,0,0}},
{{0,1,0,0},{0,1,0,0},{0,1,1,0},{0,0,0,0}},
},
{
{{0,1,1,0},{0,0,1,1},{0,0,0,0},{0,0,0,0}}, //┐
{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}}, //└
{{0,1,1,0},{0,0,1,1},{0,0,0,0},{0,0,0,0}}, 
{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
},
{
{{0,1,1,0},{0,0,1,1},{0,0,0,0},{0,0,0,0}}, //┌
{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}}, //┘
{{0,1,1,0},{0,0,1,1},{0,0,0,0},{0,0,0,0}}, 
{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}}, 
},
};
int main()
{
int x=0,y=0;
srand((unsigned int)time(NULL));
int shape=rand()%7;
setCursor(x,y);
showBlock(shape,x,y);
while(1)
{
int ge=getch();
if(ge==UP)
{
setCursor(x,y);
a++;
remove(shape,x,y);
showBlock(shape,x,y);
}
else if(ge==DOWN)
{
setCursor(x,y-1);
remove(shape,x,y);
y++;
setCursor(x,y);
showBlock(shape,x,y);
}
else if(getch()==RIGHT)
{
//setCursor(x+2,y);
remove(shape,x,y);
x+=2;
showBlock(shape,x,y);
}
else if(getch()==LEFT)
{
//setCursor(x+2,y);
remove(shape,x,y);
x-=2;
showBlock(shape,x,y);
}
}
return 0;
}
void showBlock(int shape,int x, int y)
{
for(j=0;j<4;j++)
{
setCursor(x,y+j);
for(k=0;k<4;k++)
{
if(Block[shape][a%4][j][k]==1)
{
printf("■");
}
else
printf("  ");
}
printf("\n");
}
}

void remove(int shape,int x, int y)
{
for(j=0;j<4;j++)
{
setCursor(x,y+j);
for(k=0;k<4;k++)
{
if(Block[shape][a%4][j][k]==1)
{
printf("  ");
}
}
printf("\n");
}

}
void setCursor(int x, int y) //커서 생성 및 이동 함수 .
{
COORD pos = {x, y};
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

테트리스를 만들려고하는데 소스를 현재 이렇게 짯습니다. 
근데.. 블럭을 이동시킬때마다 이전것을 지우고 이동 하려 하는데 잘 안되네요 ..

제가 생각하기에는 지우는 remove함수가 맞는 것 같은데 잔상이 남네요.. 왜그런지 잘 좀 알려주시면 감사하겠습니다. ㅠ

빨간줄로좀 해주세요 .ㅠㅠ 



profile_image 익명 작성일 -

프로그램을 잘 짜셨는데, 잔상(실제로는 플리커링)이 많이 발생할겁니다.

 

그 이유는

1. 같은 자리에 블랭크를 찍고, 다시 블럭을 찍는다.  

  동일한 위치에   ■ -> □ -> ■  와 같이 블럭이 있다가, 공백이 있다가 다시 블럭이 생기게 된다.

2. SetCusor를 너무 자주 쓰고 있다.

 

해결방법.

1. 테트리스가 들어갈 공간을 배열로 두개 만든다.

2. 하나는 새로 그릴 공간이고, 하나는 현재 그려진 공간이다.

3. 두 공간에 차이가 발생한 경우에만, 그려준다. 

 

이렇게 하시면 최소한의 화면 제어를 하고, 위와 같이 ■ -> □ -> ■  현상이 발생하지 않기 때문에, 좋습니다.  그리고 코딩도 훨씬 간단하게 되고요.

C언어 질문 /몫 나누기 연산자

... 파이썬에서 x=3/2, x=float(x) 하면 1.5라고 소수로 뜨고, 몫연산자는 1로 떳었는데, 왜 C언어에서는 /가 몫 연산자인가요? C언어에서는 나누어서 소수를 나타내는...

c언어 질문있습니다.

c언어 질문있습니다. 1. 정수형 long long과 부동소수점형 long double 둘다 64비트인데 왜 부동소수점형이 훨씬 큰 범위의 숫자를 표현할 수 있는 건가요 2. 9.625를...

c언어 질문

c언어에서 if (a&&b)처럼 if문 조건문 ()안에 &&논리곱 연산자가 들어갈 경우 a&&b중 a가... (C언어 규격에서 저 부분이 어떻게 명시되어 있었는지 기억이 잘 안 나네요.. 표준은...

C언어 함수 기초 질문입니다.

... C언어에서 함수는 특정한 작업을 수행하는 코드 블록이며, 프로그램의 모듈화와 재사용성을 증가시키기 위해 사용됩니다. 이제 각각의 질문에 대해...

c언어 질문

코드 빈칸 포함해서 전체 코드로 알려주세요 전체 코드입니다 <> " " " " & & & & " " 결과입니다

c언어 질문

A,S,M,D,Q 외에 다른 글자를 입력하면 지원되지 않는 연산자라고 떠야되는데 안뜨네요 어떻게 수정해야 되나요? 바로 채택 해드립니다...