시작하면 10초정도 버티다가 뒤짐 ㅠㅠ 나보다 못하는듯
#include <Turboc.h>
#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 ); //라인 제거.
int bscore(void); // 현재 블록 총 가치 평가.
int bdown(void);
//BOOL key(void); // 키 입력 처 리
typedef struct{
int x;
int y;
}Point;
typedef struct{
int nx;
int ny;
int rot;
int score;
}Test;
Test scorearr[40];
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 bwall[BW+2][BH+2]; // 자리 점수 부여.
int nx,ny;
int brick;
int rot;
int main(void){
int nframe=20;
int nstay=20;
int r;
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);
}
printshape(FALSE);
r=bdown();
nx=scorearr[r].nx;
ny=scorearr[r].ny;
rot=scorearr[r].rot;
rowfull();
delay(1000/20);
break;
}
}
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();
}
int bscore(void){
int x,y;
int score=0;
for(x=1;x<BW+1;x++)
{
for(y=1;y<BH+1;y++)
{
score+=(bwall[x][y]==BRICK)?y:0;
}
}
return score;
}
int bdown(void){
int x,y,i,k=0;
int a;
int arr[40];
int num=0;
int yy,xx;
int minx,maxx;
for(a=0;a<40;a++)
{
scorearr[a].nx=0;
scorearr[a].ny=0;
scorearr[a].rot=0;
scorearr[a].score=0;
}
for(x=0;x<BW+2;x++)
{
for(y=0;y<BH+2;y++)
{
bwall[x][y]=awall[x][y];
}
}
for(a=0;a<4;a++){
yy=ny;
xx=nx;
while(whatthefuck(xx-1,yy,brick,a)!=FALSE)
xx--;
minx=xx;
xx=nx;
while(whatthefuck(xx+1,yy,brick,a)!=FALSE)
xx++;
maxx=xx;
for(k=minx;k<=maxx;k++)
{
while(whatthefuck(k,yy+1,brick,a)!=FALSE)
yy++;
for(i=0;i<4;i++)
{
bwall[k+shape[brick][a][i].x][yy+shape[brick][a][i].y]=BRICK;
}
scorearr[num].nx=k;
scorearr[num].ny=yy;
scorearr[num].rot=a;
scorearr[num].score=bscore();
num++;
for(i=0;i<4;i++)
bwall[k+shape[brick][a][i].x][yy+shape[brick][a][i].y]=awall[k+shape[brick][a][i].x][yy+shape[brick][a][i].y];
}
}
for(a=0,k=0;a<num-1;a++)
{
if(scorearr[k].score<=scorearr[a+1].score)
k=a+1;
}
return k;
}
댓글 0