#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
struct data {//데이타
int xPos; //블럭의 x좌표
int yPos; //블럭의 y좌표
int blockType;// 0. 재설정 값, 1. 1자 블럭, 2.왼쪽계단블럭, 3.오른쪽 계단블럭, 4.왼쪽L자블럭, 5.오른쪽L자블럭, 6. 2x2블럭
int arr[23][12]; // 메인 무대 *위에 두칸은 비워두며, 아래 한칸은 1로 채움
int previewBlocks[3]; //미리보기 블럭 3종
int score; // 점수
int direction;// 0:위쪽 1.왼쪽 2.아랫쪽 3.오른쪽
}d;
void setGame(){// 기본값 설정
srand(time(NULL));// 무작위 시드 생성
d.xPos = 5;//x값 설정
d.yPos = 4;//y값 설정
d.blockType = 0; //재설정 값으로 지정
for(int i = 0; i < 23; i++){//arr의 배열값 지정
for(int j = 0; j < 12; j++){
if(i == 22) d.arr[i][j] = 1;
else if( j == 0 || j == 11) d.arr[i][j] = 1;
}
}
for(int i = 0; i < 3; i++){ //미리보기 블럭 무작위 초기화
d.previewBlocks[i] = rand() % 6;
}
d.score = 0; // 점수 초기화
d.direction = 0; //방향 초기화
}
void showRender(){ //화면 출력
for(int i = 1; i < 23; i++){
for(int j = 0; j < 12; j++){
if(i == 1 || i == 22) printf("▒");//가장자리 생성1
else if(j == 0 || j == 11) printf("▒");//가장자리 생성2
else{
switch(d.arr[i][j]){
case 0:
printf(" ");//빈 공간
break;
case 1:// 표시 블럭 공간
printf("■");
break;
case 2:// 임시 블럭 공간
printf("▣");
break;
}
}
}
printf("\n");
}
}
void makeBlock(){ //재설정 값일 시, blockType 초기화
if(d.blockType == 0){
d.blockType = (rand() % 6) + 1;
}
}
void bType_line(){ // 1자 블럭
int * x = &d.xPos;
int * y = &d.yPos;
switch(d.direction){
case 0: //위쪽
case 2: //아랫쪽
d.arr[*y-2][*x] = 2;
d.arr[*y-1][*x] = 2;
d.arr[*y][*x] = 2;
d.arr[*y+1][*x] = 2;
break;
case 1: //왼쪽
case 3: //오른쪽
d.arr[*y][*x-2] = 2;
d.arr[*y][*x-1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
break;
}
}
void bType_leftStair(){ // 왼쪽 계단 블럭
int * x = &d.xPos;
int * y = &d.yPos;
switch(d.direction){
case 0: //위쪽
case 2: //아랫쪽
d.arr[*y-1][*x] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
d.arr[*y+1][*x+1] = 2;
break;
case 1: //왼쪽
case 3: //오른쪽
d.arr[*y-1][*x] = 2;
d.arr[*y-1][*x+1] = 2;
d.arr[*y][*x-1] = 2;
d.arr[*y][*x] = 2;
break;
}
}
void bType_rightStair(){ // 오른쪽 계단 블럭
int * x = &d.xPos;
int * y = &d.yPos;
switch(d.direction){
case 0: //위쪽
case 2: //아랫쪽
d.arr[*y-1][*x+1] = 2;
d.arr[*y][*x+1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y+1][*x] = 2;
break;
case 1: //왼쪽
case 3: //아랫쪽
d.arr[*y-1][*x-1] = 2;
d.arr[*y-1][*x] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
break;
}
}
void bType_leftL(){ // 왼쪽 L자 블럭
int * x = &d.xPos;
int * y = &d.yPos;
switch(d.direction){
case 0: //위쪽
d.arr[*y-1][*x] = 2;
d.arr[*y][*x] = 2;
d.arr[*y+1][*x] = 2;
d.arr[*y+1][*x+1] = 2;
break;
case 1: //왼쪽
d.arr[*y-1][*x+1] = 2;
d.arr[*y][*x-1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
break;
case 2: //아랫쪽
d.arr[*y-1][*x-1] = 2;
d.arr[*y-1][*x] = 2;
d.arr[*y][*x] = 2;
d.arr[*y+1][*x] = 2;
break;
case 3: //오른쪽
d.arr[*y-1][*x-1] = 2;
d.arr[*y][*x-1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
break;
}
}
void bType_rightL(){ //오른쪽 L자 블럭
int * x = &d.xPos;
int * y = &d.yPos;
switch(d.direction){
case 0: //위쪽
d.arr[*y-1][*x] = 2;
d.arr[*y][*x] = 2;
d.arr[*y+1][*x-1] = 2;
d.arr[*y+1][*x] = 2;
break;
case 1: //왼쪽
d.arr[*y][*x-1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
d.arr[*y+1][*x+1] = 2;
break;
case 2: //아랫쪽
d.arr[*y-1][*x] = 2;
d.arr[*y-1][*x+1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y+1][*x] = 2;
break;
case 3: //오른쪽
d.arr[*y-1][*x-1] = 2;
d.arr[*y][*x-1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
break;
}
}
void bType_2x2(){ // 2x2 블럭
int * x = &d.xPos;
int * y = &d.yPos;
switch(d.direction){
case 0: //위쪽
case 1: //왼쪽
case 2: //아랫쪽
case 3: //오른쪽
d.arr[*y-1][*x] = 2;
d.arr[*y-1][*x+1] = 2;
d.arr[*y][*x] = 2;
d.arr[*y][*x+1] = 2;
break;
}
}
void setBlock(){ //배열에 블럭값 할당
for(int i = 0; i < 23; i++){//기존 임시 블럭 값 초기화
for(int j = 0; j < 12; j++){
if (d.arr[d.yPos-2+i][d.xPos-2+j] == 2)
d.arr[d.yPos-2+i][d.xPos-2+j] = 0;
}
}
for(int i = 0; i < 22; i++){
for(int j = 1; j < 11; j++){
switch(d.blockType){
case 1: // 1자 블럭
bType_line();
break;
case 2: // 왼쪽 계단 블럭
bType_leftStair();
break;
case 3: // 오른쪽 계단 블럭
bType_rightStair();
break;
case 4: // 왼쪽 L자 블럭
bType_leftL();
break;
case 5: // 오른쪽 L자 블럭
bType_rightL();
break;
case 6: // 2x2 블럭
bType_2x2();
break;
}
}
}
}
void input(){
if(224 == getch()){
switch(getch()){
case 72: //위쪽
break;
case 75: //왼쪽
d.xPos--;
break;
case 77: //오른쪽
d.xPos++;
break;
case 80: //아랫쪽
d.direction++;
if(d.direction > 3) d.direction = 0;
break;
}
}
}
int main(){
setGame();
d.blockType = 5;
while(1){
if(kbhit()) input();
makeBlock();
setBlock();
showRender();
printf("%d",d.direction);
_sleep(100);
system("cls");
}
}
c로 테트리스를 제작 중이었는데, 블럭들이 회전하는 부분을 구현하던 도중 회전이 안되길래 봤더니, 원래는 direction 값이 0부터 3까지 증가하고 direction이 3 초과시 0으로 다시 변해야하는데 direction 값이 계속 0과 1로 반복되더군요. 이러한 문제가 생긴 원인에 대해 답변 부탁드립니다.