수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

테트리스 소스코드 분석하다 질문드려요

가을

2023.04.01

질문 제목 : 테트리스 소스코드 분석하다 질문드려요질문 요약 :arrX=(arrX/2))-2;
arrY=arrY-BOARD_Y; 이 부분이 뜻하는 바를 모르겠어요
또 moveblock()함수에서 n=n*4를 한이유도요.질문 내용 :커서 옆으로2칸 위로 1칸을 1개의 블록으로 만든 테트리스 코드 입니다.
http://yk209.tistory.com/entry/c언어-테트리스-게임-소스
여기서 구해왔고요 해석을 해보는데 설명이없어서 해석해보기 힘드네요
코드는 이거구
여기서 검색하셔서 보면 detect 함수에서
arrX=pos.X+move1
arrY=pos.Y+move2
이부분이 시작인데요 요거 자체는 이해가 갑니다.
move1,2는 방향키를 인자로 받는데요
방향키가 입력된 만큼 좌표변경을 한 값을 arrX,Y에 저장하라는 겁니다.
근데 arrX=(arrX/2))-2;
arrY=arrY-BOARD_Y;
이건 대체 뭘뜻하는지 모르겠네요.
왜 arrX를 2로 나누며 또 arrY는 -BOARD_Y를 하는 이유,왜 4와 2로 BOARD_X, Y를 지정해 놨는지도 모르겠습니다.

한가지만 더 질문하자면
moveBlock()함수에서
n=n*4는 왜 한거죠?
rand()함수로 n을 0~6까지만 뽑으면 블록모양 7개중 1개를 뽑았으니 그걸로 끝 아닙니까??
왜 4를 곱했는지 이해할수가 없군요.
이렇게 2가지가 궁금합니다.
#include stdio.h
#include windows.h
#include stdlib.h
#include time.h
#include conio.h #define BOARD_HEIGHT 20 // ┃개수
#define BOARD_WIDTH 10 // ━개수
#define BOARD_X 4 //보드열x좌표
#define BOARD_Y 2 //보드행y좌표 #define CBLOCK_X 13
#define CBLOCK_Y 2
#define DELAY 100//지연
#define RAND 4//난수 #define LEFT 75
#define RIGHT 77
#define UP 72
#define DOWN 80
#define SPACE 32 int static score=0; //게임점수
int static level=1; //게임레벨
int static speed=180;
int curX,curY; //콘솔커서
int board[BOARD_HEIGHT+1][BOARD_WIDTH+2]={0,};
int block[][4][4]={
/*■
■■■
{
{0,0,0,0},
{1,0,0,0},
{1,1,1,0},
{0,0,0,0}},
{
{0,0,1,0},
{0,0,1,0},
{0,1,1,0},
{0,0,0,0}},
{
{1,1,1,0},
{0,0,1,0},
{0,0,0,0},
{0,0,0,0}},
{
{1,1,0,0},
{1,0,0,0},
{1,0,0,0},
{0,0,0,0}},
/* 두번째블록
■
■■■ */
{
{0, 0, 0, 0},
{0, 0, 1, 0},
{1, 1, 1, 0},
{0, 0, 0, 0} },
{
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 0},
{0, 0, 0, 0} },
{
{1, 1, 1, 0},
{1, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0} },
{
{1, 0, 0, 0},
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0} }, /* 세번째블록
■
■■■ */
{
{0, 0, 0, 0},
{0, 1, 0, 0},
{1, 1, 1, 0},
{0, 0, 0, 0} },
{
{0, 0, 0, 0},
{0, 1, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0} },
{
{0, 0, 0, 0},
{0, 0, 0, 0},
{1, 1, 1, 0},
{0, 1, 0, 0} },
{
{0, 0, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 1, 0, 0} }, /* 네번째블록 ■■■■ */
{
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0} },
{
{0, 0, 0, 0},
{0, 0, 0, 0},
{1, 1, 1, 1},
{0, 0, 0, 0} },
{
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0} },
{
{0, 0, 0, 0},
{0, 0, 0, 0},
{1, 1, 1, 1},
{0, 0, 0, 0} }, /* 다섯번째블록 ■■
■■ */
{
{1, 1, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0} },
{
{1, 1, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0} },
{
{1, 1, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0} },
{
{1, 1, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0} },

/* 여섯번째블록
■■
■■ */
{
{0, 0, 0, 0},
{0, 1, 1, 0},
{1, 1, 0, 0},
{0, 0, 0, 0} },
{
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 0, 0} },
{
{0, 0, 0, 0},
{0, 1, 1, 0},
{1, 1, 0, 0},
{0, 0, 0, 0} },
{
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 0, 0} }, /* 일곱번째블록 ■■
■■ */
{
{0, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 0, 0} },
{
{0, 0, 1, 0},
{0, 1, 1, 0},
{0, 1, 0, 0},
{0, 0, 0, 0} },
{
{0, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 0, 0} },
{
{0, 0, 1, 0},
{0, 1, 1, 0},
{0, 1, 0, 0},
{0, 0, 0, 0} }, };
void removeCursor(void)
{
CONSOLE_CURSOR_INFO curInfo;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
curInfo.bVisible=0;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
} void setCursor(int x, int y)
{
COORD pos={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
COORD getCursor(void)
{
COORD cur;
CONSOLE_SCREEN_BUFFER_INFO curInfo; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&curInfo);
cur.X=curInfo.dwCursorPosition.X;
cur.Y=curInfo.dwCursorPosition.Y;
return cur;
}
//void showBlock(int rotation); void showBoard(void)
{
int x,y;

//중앙보드라인
for(x=1; x=BOARD_WIDTH+1; x++)
{
board[BOARD_HEIGHT][x]=1; //board 배열중앙1인식
setCursor((BOARD_X)+x*2, BOARD_Y+BOARD_HEIGHT); //콘솔좌표
printf(━);
}
//왼쪽보드라인
for(y=0; yBOARD_HEIGHT+1; y++)
{
board[y][0]=1; //board 배열왼쪽1인식
setCursor(BOARD_X, BOARD_Y+y);
if(y==BOARD_HEIGHT)
printf(┗);
else
printf(┃);
}
//오른쪽보드라인
for(y=0; yBOARD_HEIGHT+1; y++)
{
board[y][BOARD_WIDTH+1]=1; //board 배열오른쪽1인식
setCursor(BOARD_X+(BOARD_WIDTH+2)*2, BOARD_Y+y);
if(y==BOARD_HEIGHT)
printf(┛);
else
printf(┃);
}

//모서리값값변경
board[20][0]=1;
board[20][11]=1;

//보드판숫자보기
//setCursor(6,2);
//for(y=0/for(y=0; y=BOARD_HEIGHT; y++){
//for(x=0; x=BOARD_WIDTH+1; x++){
//setCursor(4+(x*2),2+y);
//printf(%d ,board[y][x]);
//}
//printf(\n);
//}

puts( );
} void initial(int x,int y)
{
curX=x;
curY=y;
setCursor(x,y);
} //removeBlock함수작동전벽인or 아닌지확인
int detect(int rotation,int move1,int move2)
{
int x,y;
int arrX,arrY; //배열좌표저장
COORD pos=getCursor(); arrX=pos.X+move1;
arrY=pos.Y+move2;

arrX=(arrX/2)-2;
arrY=arrY-BOARD_Y;
for(y=0; y4; y++)
{
for(x=0; x4; x++)
{
if( (block[rotation][y][x]==1) && board[arrY+y][arrX+x]==1)
return 1; //보드와벽돌겹침
}
}
return 0; //겹치지않음 } //벽돌생성
void showBlock(int rotation)
{
int x,y;
COORD cursor=getCursor();
int prove;
//int n=(rotation-1)%4;
prove=detect(rotation,0,0);
if(prove==0)
{
//콘솔창위치설정배열값에서1은■출력은출력없음
for(y=0; y4; y++)
{
for(x=0; x4; x++)
{
setCursor(cursor.X + (x*2), cursor.Y+ y);
if(block[rotation][y][x]==1)
printf(■);
}
}
setCursor(cursor.X, cursor.Y);
}
}
void removeBlock(int rotation,int move1,int move2)
{
int pr;
int x,y;

COORD cursor=getCursor(); pr=detect(rotation,move1,move2);

if(pr==0)
{
for(y=0; y4; y++)
{
for(x=0; x4; x++)
{
setCursor(cursor.X+ (x*2), cursor.Y+y);
if(block[rotation][y][x]==1)
printf( );
}
}
setCursor(cursor.X+move1, cursor.Y+move2);
}
}

//블록보드판에서1인식
void boardConginition(int n,int move1, int move2)
{
int x1,y1;
COORD pos=getCursor();

int arrX = pos.X + move1; //콘솔좌표열
int arrY = pos.Y + move2; //콘솔좌표행
int x,y; /*커서위치정보배열위치정보변경
arrX=arrX/2-2; //콘솔좌표배열열변환값
arrY=arrY-2; //콘솔좌표배열행변환값 //보드판에서블록이동시1인식
for(y=0; y4; y++)
{
for(x=0; x4; x++)
{
if(block[n][y][x]==1)
{
board[arrY+y][arrX+x] =1;
 sp;}
}
}
return ; } /*배열블록옮김
void array_down(int column)
{
int y,x;

/*board배열값행다운
for(y=column; y=0; y--)
{
for(x=1; x=10; x++)
{
 sp;board[y][x]=board[y-1][x];
}
}
/*board배열0행에0삽입
for(x=1; x=10; x++)
board[0][x]=0; /*board배열1값전체출력*/
for(y=1; y=19; y++)
{
for(x=1; x=10; x++)
{
setCursor((BOARD_X)+x*2+1, y+BOARD_Y);
if(board[y][x]==1)
printf(■);
else
printf( );
}
}

}
//레벨스코어출력
void scoreLevel(void)
{ setCursor(40,3);
printf(★레벨게임클리어★);
setCursor(40,5);
printf(레벨\n,level);
setCursor(40,7);
printf(점수\n,score);
}
//레벨스코어계산
void countScore(void)
{
score+=10;
if(score%30==0)
{
level+=1;
speed-=30;
}
scoreLevel();
}
/* 1~10까지행의열전체가1로되면블록사라짐
사라지면array_down함수실행*/
void control(void)
{
int i;
int x,y;
int z=0;

//19행부터시작해서1행까지반복
for(y=19; y=1; y--)
{
//행기준으로4번반복
for(z=0; z4; z++)
{
i=0;
//1열부터10열까지증가
for(x=1; x11; x++)
{
//행기준
if(board[y][x]==1)
{
i++;
//1이10개면행블록삭제
if(i==10)
{
&;for(x=1; x11; x++)
{
setCursor((x+2)*2,y+2);
printf( );
}
//행기준으로블록내리기
countScore();
array_down(y);
} }
}
}
}
} int gameOver(int rotation)
{
if(detect(rotation,0,0))
return 5; //게임끝
else
return 0;
} int gameWin(void)
{
if(level==10)
return 1; //게임승
else
return 0;
} void moveBlock(void)
{

int n;
int kb;
int prove;
int winOver;//게임결과
srand(time(NULL));
int c=2;

/*게임시작끝
while(1)
{

initial(CBLOCK_X,CBLOCK_Y); //블록생성위치좌표

// n=(rand()%RAND)*4;//난수생성
//n=rand()%RAND;
n=rand()%7;//블록모양결정
n = n * 4;
// n = 6; if(gameWin())
{
setCursor(35,20);
printf(GAME WIN);
getchar();
exit(1);
}
if(gameOver(n))
break

/*블록한개위밑이동
while(1)
{
int ww=0;
int var;
int k=0;
int tmp;
/*블록아래로이동

while(!_kbhit())
{
//블록쇼
showBlock(n);
//딜레이타임
Sleep(DELAY+speed);
//아래이동시1있느지확인
if(detect(n,0,1)==1)
{
ww=1;
boardConginition(n,0,0);//보드벽돌배열1추가
control();
break
}
removeBlock(n,0,1); //board배열+1행
}
/*detect함수에서배열값1발견시중지
if(ww==1)
break

kb=_getch();
/*방향키
&nB: 1switch(kb)
{
case LEFT:
removeBlock(n,-2,0);
showBlock(n);
break
case RIGHT:
removeBlock(n,2,0);
showBlock(n);
 sp;break
case UP:

// 첫수를구한다
k = n / 4;
k *= 4;

// 다음수가끝수이하인가
if((n+1) = (k+3))
{
k = n + 1;
} prove=detect(k,0,0);
if(prove==0)
{
removeBlock(n,0,0);
n = k;
showBlock(n);
break
}
break
case DOWN:
removeBlock(n,0,2);
//showBlock(n);
break
case SPACE:
while(1)
{
removeBlock(n,0,1);
if(detect(n,0,1)==1 )
{
showBlock(n);
boardConginition(n,0,0);
break
}

}

}
&nbnbsp;
}

}

setCursor(35,20);
printf(GAME OVER);
} int main()
{
removeCursor(); //커서깜박이제거 setCursor(2,1); //보드표시시작위치설정
showBoard(); //보드출력
scoreLevel();
&nbsbsp;
moveBlock(); //보드출력움직임

getchar(); }

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 다솜

    n=n*4;가 왜 필요한지를 알려면 그 줄을 잠시 주석처리를 하고 실행시커 보면 그 줄이 왜 필요한지를 알 수 있습니다. 다른 사람이 작성한 코드를 분석하는 방법입니다.

번호 제 목 글쓴이 날짜
2699895 무한루프에 빠집니다.!! 해결좀부탁드려요 (10) 선아 2025-06-30
2699842 질문을 너무 많이 하네여.....죄송.... (2) 해님꽃 2025-06-29
2699816 오류 질문입니다.. (1) 해비치 2025-06-29
2699763 질문입니다 ! 꼭 좀 도와주세요ㅠㅠ (2) 미라 2025-06-28
2699555 c언어 다항식을 입력을 했는데 왜 출력이 안될까요? 피스케스 2025-06-27
2699528 C언어 포인터연산 질문입니다. (3) 안녕나야 2025-06-26
2699476 끌어올림;;달력 짜봤는데요 이 소스 줄일 수 있나요? - 스샷첨부 (2) 클라우드 2025-06-26
2699444 [좀 급함] system("explorer [주소] ") 문에 변수를 사용할 수 있나요? 알 2025-06-26
2699415 파일//read//와 배열 아란 2025-06-25
2699386 구조체 안에 일부분만 char 배열에 복사하려면 어떻게 해야하나요? (1) 미즈 2025-06-25
2699361 연결리스트 정렬하는 부분에 대해서 질문 드립니다 아이처럼 2025-06-25
2699304 [기초]아직 안주무시는분 계신가요..?포인터배열? 좀 도와주세요. 놀리기 2025-06-24
2699272 printf() 함수이용해서 프로그램 만들기 질문요! (5) 다가 2025-06-24
2699221 PUSH와 POP코드를 더 간단하게 어떻게 해야할까요? 파라미 2025-06-24
2699192 설치오류가 자꾸 나요 한번봐주세여~ (1) 소녀틳향기 2025-06-23
2699161 for loop안에 있는 if문 (9) Orange 2025-06-23
2699105 링크더리스트 이전 링크값 출력함수. 꼬꼬마 2025-06-23
2699078 정수를 한자리씩 배열에 담는 법은 어떻게 하나요.. (4) 귀염포텐 2025-06-22
2699024 C언어 공부하려는데 도와주세요!!! (2) 달님 2025-06-22
2698994 날짜 계산하는 C 코드 짜고 있는데 꽉 막혀서 질문드립니다.. (6) 별 2025-06-22
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com