c언어 개념만 파다가 게임은 처음 만들어봣음.
이미 완성되있는 코드 본뒤에 짜는데도 막상 혼자 짜볼래면 존나 힘들더라 ㅠㅠ
개념집에 있는거는 간단해서 함수도 많아야 3개고 100줄정도면 해결되는데
게임은 만들려면 신경써야되는게 너무 많아..난 큰그림을 잘 못그리는듯..
인터넷에 있는 코드 분석해보고 스스로 구현한건데 기분 존나좋다...애초에 혼자 짯으면 쾌감 존나 쩔었을듯..그럴리는 없겠지만.
#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 ); //라인 제거.
BOOL key(void); // 키 입력 처 리
typedef struct{
int x;
int y;
}Point;
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 nx,ny;
int brick;
int rot;
int main(void){
int nframe=20;
int nstay=20;
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);
}
if(key())
break;
delay(1000/20)
}
}
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();
}
BOOL key(void){
int ch,trot;
if(kbhit()){
ch=getch();
if(ch==0xE0 ||ch==0){
ch=getch();
switch(ch){
case LEFT:
if(whatthefuck(nx-1,ny,brick,rot)!=FALSE){
printshape(FALSE);
nx--;
printshape(TRUE);
}
break;
case RIGHT:
if(whatthefuck(nx+1,ny,brick,rot)!=FALSE){
printshape(FALSE);
nx++;
printshape(TRUE);
}
break;
case DOWN:
if(whatthefuck(nx,ny+1,brick,rot)!=FALSE){
printshape(FALSE);
ny++;
printshape(TRUE);
}
else
{
printshape(TRUE);
rowfull();
return TRUE;
}
break;
case UP:
if(rot==3)
trot=0;
else
trot=rot+1;
if(whatthefuck(nx,ny,brick,trot)!=FALSE)
{
printshape(FALSE);
rot=trot;
printshape(TRUE);
}
break;
}
}
else{
switch(ch){
case ' ':
while(whatthefuck(nx,ny+1,brick,rot)!=FALSE){
printshape(FALSE);
ny++;
printshape(TRUE);
}
rowfull();
return TRUE;
}
}
}
return FALSE;
}
축하함니다
감사합니다 ㅋㅋ
축하합니다 이제 진짜 후로그래밍에 입문하셨군요!