본문내용
이렇게 강조하는 것이니 양해바란다.
다음에는 게임오버 부분이다.
나름대로 멋잇게 하려고 화면을 위아래로 동시에 지워보았다. 유치하다고 생각되시면 나름대로 바꾸어보시던(든 ?)지!
void gameover(void)
{
int i;
char again,text[40];
void *buffer;
buffer=(void *)malloc(imagesize(400,0,599,20));
getimage(421,0,620,19,buffer); -> 시꺼먼 부분을 저장
for(i=0;i<=9;i++){
putimage(200,20+i*20,buffer,COPY_PUT); -+- 위아래로 동시에 지워나감
putimage(200,400-i*20,buffer,COPY_PUT); -+
delay(3);
}/* for */
free(buffer); -> 메모리를 해제시킴
sprintf(text,"GAME OVER");
outtextxy(212,220,text);
getch();
cleardevice();
outtextxy(212,220,"REPLAY (y/n) ?"); -> 다시 할 것인가를 묻는다.
while(1){
again=getch();
pokeb(0x0040,0x1a,0x1e); -+- 키보드 버퍼를 비우는 부분
pokeb(0x0040,0x1c,0x1e); -+
if(again=='y' || again =='Y'){
for(i=0;i<=7;i++) -> 다시 한다면 style[i]의 메모리를 해제시켜주고 나서
free(style[i]); 여러가지 초기화 작업을 한 후 다시 게임을 시작한다.
board_draw();
boardinit();
randomize();
bn=random(7)+1;
blockselect();
sec1=sec2=0;
interval=35-3.5*ro;
return;
}/* if */
else
if(again=='n' || again =='N'){ -> 다시 하지 않는다면 화면을 지우고 끝낸다.
cleardevice();
outtextxy(215,220,"THANK YOU !!");
getch();
closegraph();
exit(1);
}/* if */
}/* while */
}/* gameover */
다음은 점수를 가산하는 함수와 라인수를 가산하는 함수이다.
점수는 블록의 번호에 15를 곱한 값으로 했고, 만일 2줄이상을 한꺼번에 없애면 그에 따른 가산점이 있다. 라인수를 가산하는 함수는 한 줄을 없앨때마다 라인수를 1씩 증가시키고 10줄을 없애면 라운드를 하나 증가시키고 테트리스가 떨어지는 속도를 조금씩 증가시킨다.(단, 10라운드 이상부터는 게임의 재미를 위해 속도가 더이상 빨라지지 않도록 했다.)
이 속도는 여러번의 시행착오를 거쳐 찾아낸 값이므로 속도가 맘에 들지 않으면 이부분을 바꾸면 된다.
그럼 살펴보자.
void addscore(void)
{ char text[40];
setcolor(0);
sprintf(text,"%5.0Lf",sc); -> 점수를 출력하기 전에 이전의 글자를 지운다.
outtextxy(45,200,text); (같은 내용을 검은색으로 출력)
setcolor(15);
if(count==4) sc+=2000; -+
else if(count==3) sc+=1000; +- 2줄 이상을 한꺼번에 없앴을 경우엔 보너스 점수를
else if(count==2) sc+=500; -+ 가산하고 아니면 기본 점수만 가산한다.
else sc+=bn*15;
sprintf(text,"%5.0Lf",sc); -> 점수를 출력한다.
outtextxy(45,200,text);
}/* addscore */
void addlines(void)
{ char text[40];
setcolor(0); -+
sprintf(text,"%5d",li); |
outtextxy(45,300,text); |
setcolor(15); +- 라인수를 새로 출력한다.
li+=1; |
sprintf(text,"%5d",li); |
outtextxy(45,300,text); -+
if(li%10==0){ -> 10줄을 없앴을 경우에는 라운드를 증가시킨다.
setcolor(0); -+
sprintf(text,"%d",ro); |
outtextxy(530,60,text); |
setcolor(15); +- 라운드를 새로 출력한다.
ro++; |
sprintf(text,"%d",ro); |
outtextxy(530,60,text); -+
if(ro>=10) interval=2.0; -> 라운드에 따라 테트리스가 떨어지는 속도를
else interval=35-3.5*ro; 증가시킨다.
}/* if */
}/* addlines */
이제 마지막 함수이다.
이 함수는 사용자가 Control-Break키를 누를경우를 처리하기 위해 만든 함수이다.(단, 터보씨 에디터에서 이 프로그램을 실행할 경우 컨트롤-브레이크 키를 누르면 에디터 상태로 돌아오게 되므로 안된다고 난리치지 말것! 실행화일을 만들고 도스상태에서 실행하면 잘 돌아감)
void interrupt ctrl_brk()
{ char end,text[40];
cleardevice();
outtextxy(215,220,"THANK YOU !!"); -> 감사의 말을 출력하고 끝냄
getch();
closegraph();
exit(1);
}/* ctrl_brk */
/* The end of the TETRIS Ver 1.0 */ -+
/* Thanks for playing!! */ +- 필자의 로고
/* 1995.1.31. */ |
/* Made By Park Dong Kook */ -+
이상으로 필자의 테트리스를 모두 분석해 보았다. 도움이 되었는지는 잘 모르겠지만 나름대로 분석해 보면 도움되는 것이 많으리라 확신한다.
그동안 이 글들을 모두 다 읽어주셨다면 감사할 따름이다.
그럼 열심히들 프로그래밍에 전념하셔서 좋은 프로그램들을 많이많이 제작하세요. 그리고 제작하면 좀 귀찮으시더라도 소스에 해설을 달아서 여러사람들에게 공개를 해 주시길 바랍니다. 내가 알고있는 사소한 것이라도 모르는 사람이 있을수 있으니까요.
감사합니다.!!
다음에는 게임오버 부분이다.
나름대로 멋잇게 하려고 화면을 위아래로 동시에 지워보았다. 유치하다고 생각되시면 나름대로 바꾸어보시던(든 ?)지!
void gameover(void)
{
int i;
char again,text[40];
void *buffer;
buffer=(void *)malloc(imagesize(400,0,599,20));
getimage(421,0,620,19,buffer); -> 시꺼먼 부분을 저장
for(i=0;i<=9;i++){
putimage(200,20+i*20,buffer,COPY_PUT); -+- 위아래로 동시에 지워나감
putimage(200,400-i*20,buffer,COPY_PUT); -+
delay(3);
}/* for */
free(buffer); -> 메모리를 해제시킴
sprintf(text,"GAME OVER");
outtextxy(212,220,text);
getch();
cleardevice();
outtextxy(212,220,"REPLAY (y/n) ?"); -> 다시 할 것인가를 묻는다.
while(1){
again=getch();
pokeb(0x0040,0x1a,0x1e); -+- 키보드 버퍼를 비우는 부분
pokeb(0x0040,0x1c,0x1e); -+
if(again=='y' || again =='Y'){
for(i=0;i<=7;i++) -> 다시 한다면 style[i]의 메모리를 해제시켜주고 나서
free(style[i]); 여러가지 초기화 작업을 한 후 다시 게임을 시작한다.
board_draw();
boardinit();
randomize();
bn=random(7)+1;
blockselect();
sec1=sec2=0;
interval=35-3.5*ro;
return;
}/* if */
else
if(again=='n' || again =='N'){ -> 다시 하지 않는다면 화면을 지우고 끝낸다.
cleardevice();
outtextxy(215,220,"THANK YOU !!");
getch();
closegraph();
exit(1);
}/* if */
}/* while */
}/* gameover */
다음은 점수를 가산하는 함수와 라인수를 가산하는 함수이다.
점수는 블록의 번호에 15를 곱한 값으로 했고, 만일 2줄이상을 한꺼번에 없애면 그에 따른 가산점이 있다. 라인수를 가산하는 함수는 한 줄을 없앨때마다 라인수를 1씩 증가시키고 10줄을 없애면 라운드를 하나 증가시키고 테트리스가 떨어지는 속도를 조금씩 증가시킨다.(단, 10라운드 이상부터는 게임의 재미를 위해 속도가 더이상 빨라지지 않도록 했다.)
이 속도는 여러번의 시행착오를 거쳐 찾아낸 값이므로 속도가 맘에 들지 않으면 이부분을 바꾸면 된다.
그럼 살펴보자.
void addscore(void)
{ char text[40];
setcolor(0);
sprintf(text,"%5.0Lf",sc); -> 점수를 출력하기 전에 이전의 글자를 지운다.
outtextxy(45,200,text); (같은 내용을 검은색으로 출력)
setcolor(15);
if(count==4) sc+=2000; -+
else if(count==3) sc+=1000; +- 2줄 이상을 한꺼번에 없앴을 경우엔 보너스 점수를
else if(count==2) sc+=500; -+ 가산하고 아니면 기본 점수만 가산한다.
else sc+=bn*15;
sprintf(text,"%5.0Lf",sc); -> 점수를 출력한다.
outtextxy(45,200,text);
}/* addscore */
void addlines(void)
{ char text[40];
setcolor(0); -+
sprintf(text,"%5d",li); |
outtextxy(45,300,text); |
setcolor(15); +- 라인수를 새로 출력한다.
li+=1; |
sprintf(text,"%5d",li); |
outtextxy(45,300,text); -+
if(li%10==0){ -> 10줄을 없앴을 경우에는 라운드를 증가시킨다.
setcolor(0); -+
sprintf(text,"%d",ro); |
outtextxy(530,60,text); |
setcolor(15); +- 라운드를 새로 출력한다.
ro++; |
sprintf(text,"%d",ro); |
outtextxy(530,60,text); -+
if(ro>=10) interval=2.0; -> 라운드에 따라 테트리스가 떨어지는 속도를
else interval=35-3.5*ro; 증가시킨다.
}/* if */
}/* addlines */
이제 마지막 함수이다.
이 함수는 사용자가 Control-Break키를 누를경우를 처리하기 위해 만든 함수이다.(단, 터보씨 에디터에서 이 프로그램을 실행할 경우 컨트롤-브레이크 키를 누르면 에디터 상태로 돌아오게 되므로 안된다고 난리치지 말것! 실행화일을 만들고 도스상태에서 실행하면 잘 돌아감)
void interrupt ctrl_brk()
{ char end,text[40];
cleardevice();
outtextxy(215,220,"THANK YOU !!"); -> 감사의 말을 출력하고 끝냄
getch();
closegraph();
exit(1);
}/* ctrl_brk */
/* The end of the TETRIS Ver 1.0 */ -+
/* Thanks for playing!! */ +- 필자의 로고
/* 1995.1.31. */ |
/* Made By Park Dong Kook */ -+
이상으로 필자의 테트리스를 모두 분석해 보았다. 도움이 되었는지는 잘 모르겠지만 나름대로 분석해 보면 도움되는 것이 많으리라 확신한다.
그동안 이 글들을 모두 다 읽어주셨다면 감사할 따름이다.
그럼 열심히들 프로그래밍에 전념하셔서 좋은 프로그램들을 많이많이 제작하세요. 그리고 제작하면 좀 귀찮으시더라도 소스에 해설을 달아서 여러사람들에게 공개를 해 주시길 바랍니다. 내가 알고있는 사소한 것이라도 모르는 사람이 있을수 있으니까요.
감사합니다.!!