Hisworld.tistory.com
The hisWorld
(140)
hisworld_new
(0)
hisOld
(138)
Android
(7)
Computer Vision
(18)
JAVA
(4)
C/C++
(26)
열혈강의 C
(32)
TCP/IP socket
(12)
WinAPI
(16)
System Programming
(0)
etc
(23)
Plan
(0)
hisWorld
(0)
hiStory
(0)
hiStudy
(0)
hiSnap
(0)
홈
태그
미디어로그
위치로그
방명록
Windows Live Messenger
winapi
Join C
대학생 공모전
The Turing test page
훈스닷넷
C/C++ Reference
WIKI
/
/
블로그 내 검색
Tetris 콘솔 Code 분석
URUZ-7
2009. 1. 25. 08:35
2009. 1. 25. 08:35
//std.h #include "Turboc.h" //Key값 #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 #define ESC 27 //Bard X,Y,Width,Height #define BX 5 #define BY 1 #define BW 20 #define BH 20 //함수 선언 void DrawScreen(); void DrawBoard(); void PrintBrick(BOOL Show); int GetAround(int x,int y,int b,int r); void TestFull(); BOOL ProcessKey(); BOOL MoveDown(); //좌표 구조체 struct Point { int x,y; }; //블럭의 모양 구조체 배열 Point Shape[][4][4]={ //[7][4][4] { {0,0,1,0,2,0,-1,0}, {0,0,0,1,0,-1,0,-2}, {0,0,1,0,2,0,-1,0}, {0,0,0,1,0,-1,0,-2} }, { {0,0,1,0,0,1,1,1}, {0,0,1,0,0,1,1,1}, {0,0,1,0,0,1,1,1}, {0,0,1,0,0,1,1,1} }, { {0,0,-1,0,0,-1,1,-1}, {0,0,0,1,-1,0,-1,-1}, {0,0,-1,0,0,-1,1,-1}, {0,0,0,1,-1,0,-1,-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,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,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,0,1}, {0,0,0,-1,0,1,1,0}, {0,0,-1,0,1,0,0,-1}, {0,0,-1,0,0,-1,0,1} }, //[블럭타입][회전][블럭인덱스] //{초기블럭}, {90도 회전}, {90도 회전}, {90도 회전} }; //블럭의 타입 char *arTile[]={". ","■","□"}; //변수 선언 enum { EMPTY, BRICK, WALL }; //빈상태,블럭,벽 int board[BW+2][BH+2]; //Board Size정의 int nx,ny; //좌표 계산을 위한 x,y int brick,rot; //블럭수,회전
//Tetris.cpp #include "std.h" /*=========================== 이름:Main() ----------------------------- 기능:프로그램 실행 시작 ============================*/ void main() { int nFrame, nStay; //Frame(속도),Stay(타이머) int x,y; setcursortype(NOCURSOR);//Cursor Mode를 변경 randomize(); //난수발생 초기화,Turboc.h clrscr(); //테두리 셋팅 for(x=0;x<BW+2;x++) //가로 사이즈 { for(y=0;y<BH+2;y++)//세로 사이즈 { board[x][y] = (y==0 || y==BH+1 || x==0 || x==BW+1) ? WALL:EMPTY; //맨아래 || 맨위 || 왼쪽끝 || 오른쪽끝 ? 벽 : 빈공간 } } DrawScreen(); //화면을 그림 nFrame=20; //프레임 셋팅 for(;1;) //1단계 실행 { brick=random(sizeof(Shape)/sizeof(Shape[0])); //불럭모양 배열에서 램덤 추출 nx=BW/2; //x좌표,보드 가운데 ny=3; //y좌표 rot=0; //회전 안함 PrintBrick(TRUE); //블럭출력(TRUE) if(GetAround(nx,ny,brick,rot) != EMPTY) //블럭 주변 검사 break; nStay=nFrame; for(;2;) //2단계 실행 { if(--nStay == 0) //타이머 설정 종료 { nStay=nFrame; //타이머 재설정 if(MoveDown()) //바닥으로 내리기 break; } if(ProcessKey()) //일반키 break; delay(1000/20); //화면 재생률 지연 } } //게임종료(Loop문 종료) clrscr(); //화면 클리어 gotoxy(30,12);puts("G A M E O V E R"); //30.12에 문자열 출력 setcursortype(NORMALCURSOR); //커서 복구 } /*=========================== 이름:DrawScreen() ----------------------------- 기능:전체 화면을 그려주는 함수 ============================*/ void DrawScreen() { int x,y; for(x=0;x<BW+2;x++) //+2는 벽계산 { for(y=0;y<BH+2;y++) { gotoxy(BX+x*2,BY+y); //좌표 재설정 puts(arTile[board[x][y]]); //블럭타입에 따라 표시 } } //각각의 x,y좌표에 문자열 출력 gotoxy(50,3);puts("Tetris Ver 1.0"); gotoxy(50,5);puts("좌우:이동, 위:회전, 아래:내림"); gotoxy(50,6);puts("공백:전부 내림"); } /*=========================== 이름:DrawBoard() ----------------------------- 기능:게임 진행구역 그리는 함수 ============================*/ void DrawBoard() { int x,y; for(x=1;x<=BW;x++) { for(y=1;y<=BH;y++) { gotoxy(BX+x*2,BY+y); puts(arTile[board[x][y]]); } } } /*=========================== 이름:ProcessKey() ----------------------------- 기능:Key입력 처리 함수 ============================*/ BOOL ProcessKey() { int ch,trot; if(kbhit()) { ch=getch(); if(ch == 0xE0 || ch == 0) { ch=getch(); switch(ch) { case LEFT://왼쪽이 비어 있을 때 if(GetAround(nx-1,ny,brick,rot) == EMPTY) { PrintBrick(FALSE); //현 블럭 없앰 nx--; //x좌표 이동 PrintBrick(TRUE); //다시 나타냄 } break; case RIGHT://오른쪽이 비어 있을 때 if(GetAround(nx+1,ny,brick,rot) == EMPTY) { PrintBrick(FALSE); nx++; PrintBrick(TRUE); } break; case UP://회전 3회시 원위치 trot=(rot == 3 ? 0:rot+1); if(GetAround(nx,ny,brick,trot) == EMPTY) { PrintBrick(FALSE); rot=trot; PrintBrick(TRUE); } break; case DOWN://내리기 기능 if(MoveDown())//함수 호출 { return TRUE; } break; } } else { switch(ch) { case ' '://SpaceBar기능 while(!MoveDown()) { ; } return TRUE; } } } return FALSE; } /*=========================== 이름:PrintBrick() ----------------------------- 기능:불럭을 그려주는 함수 ============================*/ void PrintBrick(BOOL Show) { int i; for(i=0;i<4;i++) { //현재위치+블럭좌표+이동값을 계산한 결과 x,y좌표 이동 gotoxy(BX+(Shape[brick][rot][i].x+nx)*2,BY+Shape[brick][rot][i].y+ny); puts(arTile[Show ? BRICK:EMPTY]); //show가 TRUE면 블럭을 아니면 빈공간 } } /*=========================== 이름:GetAround() ----------------------------- 기능:주변을 검사 ============================*/ int GetAround(int x,int y,int b,int r) { int i,k=EMPTY; //k=max(EMPTY,보드[b블럭,r회전,i의 x,y좌표] //0부터 4까지 조사. 즉 하나의 블럭 주변을 검사한다. for(i=0;i<4;i++) { k=max(k,board[x+Shape[b][r][i].x][y+Shape[b][r][i].y]); } return k; } /*=========================== 이름:MoveDown() ----------------------------- 기능:블럭을 내리는 기능 함수 ============================*/ BOOL MoveDown() { if(GetAround(nx,ny+1,brick,rot) != EMPTY)//주위에 블럭이 있을 경우 { TestFull(); //블럭라인 검사 후 종료 return TRUE; } PrintBrick(FALSE);//숨김 ny++; //ny(화면상 좌표) 증가 PrintBrick(TRUE);//보임 return FALSE; } /*=========================== 이름:TestFull() ----------------------------- 기능:블럭 라인 검사 함수 ============================*/ void TestFull() { int i,x,y,ty; for(i=0;i<4;i++) {//MoveDown에서 호출된 상태의 블럭을 기록 board[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(board[x][y] != BRICK)//블럭이 아니면 땡! break; } if(x == BW+1)//한줄이 다 블럭일 경우(for문 특성) {//블럭라인 복사 for(ty=y;ty>1;ty--)//맨위 라인부터 { for(x=1;x<BW+1;x++) { board[x][ty]=board[x][ty-1]; } } DrawBoard();//게임 진행구역 다시 그려줌 delay(200);//지연 } } }
공유하기
게시글 관리
구독하기
Hisworld.tistory.com
+ Recent posts
Powered by
Tistory
, Designed by
wallel
Rss Feed
and
Twitter
,
Facebook
,
Youtube
,
Google+
티스토리툴바