# include & ltstdio.h & gt
# include & ltconio.h & gt
# include & ltstdlib.h & gt
# include & ltwindows.h & gt
# include & lttime.h & gt
# include & lttime.h & gt
#define zlx 10?//증분 좌표(X)는 게임 상자가 한쪽으로 움직이지 않도록 합니다.
#Define zly 3? //증분 좌표(Y)는 게임 상자가 한쪽으로 움직이지 않도록 합니다.
#DEFINE W 26?//게임 상자의 너비
#DEFINE H 24?//게임 상자의 높이
INT JIEM[22][22]={0}, WJ = 10;? //인터페이스 배열, 기본 위치(초기값 10)
int speed = 4, density = 30, score = 0, deaths = 0; //적의 속도, 적 밀도, 플레이어 성능, 사망자 수입니다.
int m = 0, n = 0; ? // m, n은 적 항공기를 제어하는 변수입니다.
void gtxy (int x, int y)? // 커서 위치를 제어하는 함수
{좌표 위치;
포지션. x = x? 위치. y = y?
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE), pos);
}
void? Colour (int? a)? // 색을 설정하는 함수 (a는 1-15여야 함)
{ SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE), a); }
void yinc(int x=1, int y=0)? // 커서를 숨기는 함수
{Console_Cursor_Info?gb={x, y }; // y를 0으로 설정하여 숨깁니다.
SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE), & ampGB);
}
void csh()? //초기화 함수
{ int I;
colour(7);
gtxy(zlx, zly); printf("╭"); ?gtxy(zlx+W-2, zly); printf("☢"); ? // 상자의 왼쪽 상단과 오른쪽 상단 모서리
gtxy(zlx, zly+H-1); printf("═"); gtxy(zlx+W-2, zly+H-1); printf("⇦"); // 두 프레임의 모서리를 낮춤
for(I = 2; i & ltw-2; i+=2) {gtxy(zlx+i, zly); ?printf("═"); }? //프린트 위쪽 가로 프레임
for(I = 2; I& ltw-2; i+=2) {gtxy(zlx+i, zly+H-1); printf("═"); } ? //하단 수평 프레임 인쇄
for(I = 1; I& lth-1; i++) { gtxy(zlx, zly+I); ?printf("║"); }//좌단 수직 프레임 인쇄
for(I = 1; I& lth-1; i++) { gtxy(zlx+W-2, zly +I); printf("║"); }? //우측 세로 박스 인쇄
colour(14); gtxy(19, 2); Printf("적기 파괴"); colour(10);
gtxy(37, 5); printf(" setting:Esc");
gtxy( 37, 7); Printf("Launch:↑");
gtxy(37, 9); printf(" Control:←→");
gtxy(37, 11); Printf("Score:%d", score);
gtxy(37, 13); Printf("Death:%d. ", death);
yinc(1, 0);
}
void qcjm()? //클리어 인터페이스 함수
{int i, j;
for(I = 0; I & lth-2; i++)
for(j = 0; j & ltw-4; j++){gtxy(zlx+2+j, zly+1+I); printf(" "); }
}
void feiji()? //항공기 이동 함수
{int i, j;
for(I = 21; I& gt=0;I-)? // 아래에서 위로 적기가 배열에서 곧장 빠져나가는 것을 방지합니다.
for(j = 0; j & lt22;j++)
{ if(I = = 21 & amp; & ampjiem[i][j]==3)?jiem[I][j]= 0; ? // 선을 넘지 않도록 맨 아래 줄에 0을 할당합니다.
?if(jiem[i][j]==3)?jiem[i][j]= 0, jiem[I+1][j]= 3;
}
if(jiem[20][wj]= = 3 & amp; & ampjiem[21][wj]= = = 1)death++;
}
p>void purpledan()? //아이템 심볼 이동 함수
{ int i, j;
for(I = 0; I & lt22;i++)
for(j = 0; j & lt22;j++)
{ if(I = = 0 & amp; & ampjiem[I][j] = = = 2)jiem[I][j] = 0; p>
if(jiem[i][j]==2) {?if(jiem[I-1][j]= = 3)score+= 100, printf(" \ 7 ");?
?jiem[i][j]= 0, jiem[I-1][j]= 2; }
}
}
}
Cancel print(?) ? //출력 인터페이스 함수
{int i, j;
qcjm();
for(I = 0; I & lt22;i++)
for(j = 0; j & lt22;j++)
{ gtxy(12+j, 4+I);
if(jiem[I][. j] = = 3){ Color(13); printf("□");}
if(jiem[I][j] = = 2){ Color(10); printf(" . ");}
if(jiem[I][j] = = 1){ Color(10); printf("■");}
}
gtxy(37, 11); Colour(10); Printf("Score:%d", score);
gtxy(37, 13); Printf ("Death:%d", death);
}
void setup()? //게임 설정 함수
{ qcjm();
gtxy(12, 4); Printf("적 속도 선택:");
gtxy(12, 5); printf("?1. 빠른 2. 중간 3. 느린>; >);
switch(getche())
? {case' 1 ':speed= 2; break;
case "2":speed= 4; break;
case "3":speed= 5; break;
default:gtxy(12, 6); printf("? Incorrect! 기본값");
?}
gtxy(12, 7); printf("적 밀도 선택:");
gtxy(12, 8); printf("?1. large 2. medium 3. small >; >);
Switch(getche())
{example "1. ":Density = 20; break;
Instance "2":Density = 30; ? break;
사례 "3":밀도= 40; break;
? Default:gtxy(12, 9); printf("? Incorrect! Default");
}
for(int I = 0; I & lt22;i++)
for(int j = 0; j & lt22;j++)jiem[I][j] = 0;
jiem[21][wj = 10]= 1; jiem[0][. 5] = 3;
gtxy(12, 10); printf("? 저장하려면 아무 키나 누르세요... ");
getch();
qcjm();
}
Empty run()? // 게임 실행 함수
{ jiem[21][wj]= 1; ? // 1의 값은 우리 머신을 나타냅니다(2는 총알입니다).
jiem[0][5] = 3; // 값 3은 적 머신을 나타냅니다.
SetConsoleTitle("파괴 적 머신"); ? //창 제목을 설정
while(1)
{?if (kbhit())? // 키를 눌러 내 기계가 왼쪽이나 오른쪽으로 이동하거나 발사 또는 설정하도록 제어합니다.
? { int key
if ((key = getch())= = 224)key = getch();
스위치 (키)?
{Case 75:if(wj & gt; 0) jiem[21][wj] = 0, jiem[21][-wj] = 1; break;
? Case 77:if (wj & lt20)?jiem[21][wj]= 0, jiem[21][++++wj]= 1; ? Break;
? Case 72:jiem[20][wj]= 2; break;
Case 27:set();
}
}
If (++n % density==0)? // 적 항공기의 속도를 제어합니다.
{ n = 0; srand((부호없는) time (null));
?jiem[0][rand()% 20+1]= 3;
}
?if(++m % speed = = 0){ feiji(); m = 0;} ? // 적 기체의 이동 속도를 제어합니다(총알 기준)
? zidan();
print();
sleep(120); ? // 120밀리초 지연
}
}
int main()
{ csh();
?run();
? return 0;
}
쉽게 코딩해야 하는 초보자는 다음과 같은 자체 컴파일 함수를 모을 수 있습니다:
SetConsoleTitle("Tetris"); ? // 창 왼쪽 상단의 제목 표시줄에 "Tetris"라는 단어를 표시하도록 설정합니다.
srand((부호 없는) time (empty)); ? //난수 생성기를 초기화합니다
n=rand(?) % 20;? //0-19 사이의 난수 생성, 예: rand(?) 5는 0에서 4 사이의 숫자를 생성합니다.
SetConsoleTitle(?) 의 함수는 다음과 같이 동시에 사용하는 것입니다.
Sleep(300); ? // 300밀리초 지연(즉, 300밀리초 후에도 프로그램이 계속 실행됨)
System("cls"); ? // 화면을 지웁니다(창에 있는 모든 것을 지우고 커서를 (0, 0)에 놓습니다)
두 함수 모두
void gtxy (int x, int y)? // 커서 위치를 제어하는 함수
{coordinate position;
position. x = x?
position. y = y?
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE), pos);
}
< /p>
EmptyColour(int a)? //색상을 설정하는 함수
{ SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE), a); }
void yinc (int x, int y)? //커서의 기능을 숨깁니다
{Console_Cursor_Info?gb={ x, y }; ? //gb는 커서를 나타냅니다.
SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE), ? & ampGB);
}
void kou(int w, int h)? // 창 크기를 설정하는 함수
{Handle ?.HL = GetStdHandle(STD _ OUTPUT _ HANDLE); ?
Coordinates?size = { w, h }; ?
SetConsoleScreenBufferSize( hl, size); ?
Small_RECT?rc={ 0, 0, w, h }; ?
setconsolewindoinfo(hl, 1, & ampRC); ?
}
마지막 함수에서 매개변수 w는 넓고 매개변수 h는 높습니다. 다섯 줄 중 첫 번째 줄은 핸들 변수 hl을 정의하고 값을 할당합니다.
두 번째 줄은 좌표 구조 변수의 크기를 정의하며, 이 값에 따라 버퍼의 크기가 결정됩니다. 세 번째 줄은
size 값을 사용하여 버퍼의 크기를 설정합니다. 네 번째 줄은 현재 창이 표시되는 위치를 결정하는 변수 rc를 정의합니다.
크기(버퍼의 크기를 초과해서는 안 됨)를 정의합니다. 처음 두 0은 버퍼의 왼쪽 상단 모서리에서 0 열과 0 행 위치에서 시작하고, 마지막 두 0은 0 열과 0 행 위치에서 시작합니다.
매개변수는 w와 h보다 작을 수 있습니다(예:?rc={0, 0, w-10, h-5 }). 마지막 줄은 가운데에 있는 창 값을 rc로 설정합니다.
이 매개변수는 "1"이거나 "true"로 작성해야 유효합니다.
이 매개변수는 "1"이거나 "true"로 작성해야 유효합니다.