본문 바로가기
C/☞

[49]-A. 마리오 무브

by TR. 2020. 7. 23.

풀이 1)

int move_right(int size, int *x){
    int xx = x[0];
    if(*x != size-1){
        xx += 1;
    }
    return xx;
}
int move_left(int size, int *x){
    int xx = x[0];
    if(*x != 0){
        xx -= 1;
    }
    return xx;
}
int move_up(int size, int *y){
    int yy = *y;
    if(*y != 0){
        yy -= 1;
    }
    return yy;
}
int move_down(int size, int *y){
    int yy = *y;
    if(*y != size-1){
        yy += 1;
    }
    return yy;
}

void main(){

    // 실습예제 : 함수, 2차원 배열 (더블포인터 학습준비)
    // -> 마리오 무브

    // . 2차원 배열 맵 그리기 (10 X 10)
    // . 이동할 방향을 입력받아,
    //   ㄴ 동서남북
    // . 캐릭터를 이동시킨다. 
    // ㄴ 함수실행
    
    srand(time(0));

    int size = 10;
    int map[10][10] = {0};

    // 캐릭터 배치
    int MARIO = 7;
    int x = rand() % 10;
    int y = rand() % 10;

    int run = 1;
    while(run){
        map[y][x] = MARIO;

        // print_map(map, size);
        printf("---- MARIOMOVE ----\n");
        for(int y=0; y<size; y++){
            for(int x=0; x<size; x++){
                if(map[y][x] == MARIO){
                    printf("● ");
                }
                else if(map[y][x] == 0){
                    printf("+ ");
                }
            }
            printf("\n");
        }
        printf("-------------------\n");

        printf("4) left\n6) right\n8) up\n2) down\n>> 방향키: ");
        int dir;
        scanf("%d", &dir);

        if(dir == 6){
            map[y][x] = 0;
            x = move_right(size, &x);
        }
        else if(dir == 4){
            map[y][x] = 0;
            x = move_left(size, &x); 
        }
        else if(dir == 8){
            map[y][x] = 0;
            y = move_up(size, &y); 
        }
        else if(dir == 2){
            map[y][x] = 0;
            y = move_down(size, &y); 
        }



    }


}

 

풀이 2) 더블포인터 : 맵그리기

더보기
// 더블포인터 맵그리기 함수
void print_map(int **pp, int size){
    int p1 = 7;
    printf("---- MARIOMOVE ----\n");
    for(int y=0; y<size; y++){
        for(int x=0; x<size; x++){
            if(pp[y][x] == p1){
                printf("● ");
            }
            else if(pp[y][x] == 0){
                printf("+ ");
            }
        }
        printf("\n");
    }
    printf("-------------------\n");
}

int move_right(int size, int *x){
    int xx = x[0];
    if(*x != size-1){
        xx += 1;
    }
    return xx;
}
int move_left(int size, int *x){
    int xx = x[0];
    if(*x != 0){
        xx -= 1;
    }
    return xx;
}
int move_up(int size, int *y){
    int yy = *y;
    if(*y != 0){
        yy -= 1;
    }
    return yy;
}
int move_down(int size, int *y){
    int yy = *y;
    if(*y != size-1){
        yy += 1;
    }
    return yy;
}

int main(){
    
    srand(time(0));

    int size = 10;
    //int map[10][10] = {0};

    //더블포인터 사용
    int **map = new int*[size]; // int *p = new int[size]; // int **pp = &p;
    for(int i=0; i<size; i++){
        map[i] = new int[size];
        for(int j=0; j<size; j++){
            map[i][j] = 0;
        }
    }
    delete[] map;               // map의 heap메모리를 지워줌, 포인터 map을 삭제하는 것이 아님

    // 캐릭터 배치
    int MARIO = 7;
    int x = rand() % 10;
    int y = rand() % 10;

    int run = 1;
    while(run){
        map[y][x] = MARIO;

        print_map(map, size);

        printf("4) left\n6) right\n8) up\n2) down\n>> 방향키: ");
        int dir;
        scanf("%d", &dir);

        if(dir == 6){
            map[y][x] = 0;
            x = move_right(size, &x);   // 함수의 한계, 포인터의 필요성
        }
        else if(dir == 4){
            map[y][x] = 0;
            x = move_left(size, &x); 
        }
        else if(dir == 8){
            map[y][x] = 0;
            y = move_up(size, &y); 
        }
        else if(dir == 2){
            map[y][x] = 0;
            y = move_down(size, &y); 
        }



    }


    return 0;
}

'C > ' 카테고리의 다른 글

[50]-A. 기억력 게임  (0) 2020.07.23
[50] 기억력 게임  (0) 2020.07.23
[49] 마리오 무브  (0) 2020.07.23
[48] 배열과 함수  (0) 2020.07.23
[47] 연습문제 : 함수  (0) 2020.07.23

댓글