C언어에서 변수가 0과 1로 반복되는 오류

조회수 600회
#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로 반복되더군요. 이러한 문제가 생긴 원인에 대해 답변 부탁드립니다.

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)