편집 기록

편집 기록
  • 프로필 엽토군님의 편집
    날짜2019.06.21

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


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

  • 프로필 탁승훈님의 편집
    날짜2019.06.21

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


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