편집 기록

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

    소코반 게임 질문입니다


    #include <Turboc.h>
    #include <conio.h>
    #include <ctype.h>
    
    void DRAWSCREEN();
    void MOVEDOLL(int ch);
    
    #define MAXSTAGE 3//전체 맵 수
    #define RIGHT 77
    #define LEFT 75
    #define UP 72
    #define DOWN 80
    
    int x, y;
    int nx, ny;//현재의 x,y좌표
    int nstage;//현재의 스테이지
    char arstage[18][21];//각 스테이지를 복사할 배열
    int nmove;//움직인 총 횟수
    char ARSTAGE[MAXSTAGE][18][21] = {
    
         {
         "####################",
         "####################",
         "####################",
         "#####   ############",
         "#####O  ############",
         "#####  O############",
         "###  O O ###########",
         "### # ## ###########",
         "#   # ## #####  ..##",
         "# O  O   @      ..##",
         "##### ### # ##  ..##",
         "#####     ##########",
         "####################",
         "####################",
         "####################",
         "####################",
         "####################",
         "####################"
         },
         {
         "####################",
         "####################",
         "####################",
         "####################",
         "####..  #     ######",
         "####..  # O  O  ####",
         "####..  #O####  ####",
         "####..    @ ##  ####",
         "####..  # #  O #####",
         "######### ##O O ####",
         "###### O  O O O ####",
         "######    #     ####",
         "####################",
         "####################",
         "####################",
         "####################",
         "####################",
         "####################"
         },
         {
         "####################",
         "####################",
         "####################",
         "####################",
         "##########     @####",
         "########## O#O #####",
         "########## O  O#####",
         "###########O O #####",
         "########## O # #####",
         "##....  ## O  O  ###",
         "###...    O  O   ###",
         "##....  ############",
         "####################",
         "####################",
         "####################",
         "####################",
         "####################",
         "####################"
         },
    };
    
    int main() {
    
        int ch;
        nstage = 0;
        nmove = 0;
    
        for (;;) {
    
            memcpy(arstage, ARSTAGE[nstage], sizeof(arstage));
    
            for (y = 0; y < 18; y++) {
                for (x = 0; x < 21; x++) {
                    if (arstage[y][x] == '@') {
                        nx = x;
                        ny = y;
                    }
                }
            }
    
            for (; 2;) {
    
                clrscr();
                DRAWSCREEN();
    
                ch = _getch();
                if (ch == 0 || ch == 0xE0) {
                    ch = _getch();
                    MOVEDOLL(ch);
                }
                else {
                    ch = tolower(ch);
                    if (ch == 'n') {
                        if (nstage < MAXSTAGE - 1) {
                            nstage++;
                            break;
                        }
                    }
                    else if (ch == 'p') {
                        if (nstage > 0) {
                            nstage--;
                            break;
                        }
                    }
                    else if (ch == 'q') {
                        exit(0);
                    }
                }
            }
        }
    }
    void DRAWSCREEN() {
    
        for (y = 0; y < 18; y++, puts("")) {
            for (x = 0; x < 21; x++) {
                _putch(arstage[y][x]);
            }
        }
        gotoxy(40, 5);
        printf("종료 하실려면 q");
        gotoxy(40, 7);
        printf("다음 스테이지 n 이전 스테이지 p");
        gotoxy(40, 9);
        printf("총 이동 횟수 : %d\n", nmove);
    
    }
    void MOVEDOLL(int ch) {
        int dx = 0, dy = 0;
    
        switch (ch) {
        case RIGHT:
            dx += 1;
            break;
        case LEFT:
            dx -= 1;
            break;
        case UP:
            dy -= 1;
            break;
        case DOWN:
            dy += 1;
            break;
        }
    
        if (arstage[ny + dy][nx + dx] != '#') {
            if (arstage[ny + dy][nx + dx] == ' ' || arstage[ny + dy][nx + dx] == '.') {
                arstage[ny + dy][nx + dx] = '@';
                arstage[ny][nx] = ' ';
            }
            else if (arstage[ny + dy][nx + dx] == 'O'&&arstage[ny+dy*2][nx+dx*2]!='O') {
                if (arstage[ny + dy * 2][nx + dx * 2] == '.' || arstage[ny + dy * 2][nx + dx * 2] == ' ') {
                    arstage[ny + dy * 2][nx + dx * 2] = 'O';
                    arstage[ny + dy][nx + dx] = '@';
                    arstage[ny][nx] = ' ';
                }
            }
            if (ARSTAGE[nstage][ny][nx] == '.' && arstage[ny][nx] == ' ') {
                arstage[ny][nx] = '.';
            }
            nx += dx;
            ny += dy;
            nmove++;
        }
    }
    

    처음으로 만들어본 게임이라 정말 이상하지만 혼자서 해결을 못하겠어서 질문드립니다

    아마도 문제가 MOVEDOLL() 함수에서인것 같은데

    예를들어서 (VC++에서 만들었어요) 실행을 해보면 OO@ 이러한 상황에서(@ 이아이가 말) 원래는 못움직여야 정상인데 말이 뚫고 지나가버리네요 조건문은 나름 잘 짯다고 생각했었는데... 다시봐도 어디서 오류가 난건지 못찾겠습니다 ㅠ

  • 프로필 알 수 없는 사용자님의 편집
    날짜2020.01.12

    소코반 게임 질문입니다


    include

    include

    include

    void DRAWSCREEN(); void MOVEDOLL(int ch);

    define MAXSTAGE 3//전체 맵 수

    define RIGHT 77

    define LEFT 75

    define UP 72

    define DOWN 80

    int x, y; int nx, ny;//현재의 x,y좌표 int nstage;//현재의 스테이지 char arstage[18][21];//각 스테이지를 복사할 배열 int nmove;//움직인 총 횟수 char ARSTAGE[MAXSTAGE][18][21] = {

     {
     "####################",
     "####################",
     "####################",
     "#####   ############",
     "#####O  ############",
     "#####  O############",
     "###  O O ###########",
     "### # ## ###########",
     "#   # ## #####  ..##",
     "# O  O   @      ..##",
     "##### ### # ##  ..##",
     "#####     ##########",
     "####################",
     "####################",
     "####################",
     "####################",
     "####################",
     "####################"
     },
     {
     "####################",
     "####################",
     "####################",
     "####################",
     "####..  #     ######",
     "####..  # O  O  ####",
     "####..  #O####  ####",
     "####..    @ ##  ####",
     "####..  # #  O #####",
     "######### ##O O ####",
     "###### O  O O O ####",
     "######    #     ####",
     "####################",
     "####################",
     "####################",
     "####################",
     "####################",
     "####################"
     },
     {
     "####################",
     "####################",
     "####################",
     "####################",
     "##########     @####",
     "########## O#O #####",
     "########## O  O#####",
     "###########O O #####",
     "########## O # #####",
     "##....  ## O  O  ###",
     "###...    O  O   ###",
     "##....  ############",
     "####################",
     "####################",
     "####################",
     "####################",
     "####################",
     "####################"
     },
    

    };

    int main() {

    int ch;
    nstage = 0;
    nmove = 0;
    
    for (;;) {
    
        memcpy(arstage, ARSTAGE[nstage], sizeof(arstage));
    
        for (y = 0; y < 18; y++) {
            for (x = 0; x < 21; x++) {
                if (arstage[y][x] == '@') {
                    nx = x;
                    ny = y;
                }
            }
        }
    
        for (; 2;) {
    
            clrscr();
            DRAWSCREEN();
    
            ch = _getch();
            if (ch == 0 || ch == 0xE0) {
                ch = _getch();
                MOVEDOLL(ch);
            }
            else {
                ch = tolower(ch);
                if (ch == 'n') {
                    if (nstage < MAXSTAGE - 1) {
                        nstage++;
                        break;
                    }
                }
                else if (ch == 'p') {
                    if (nstage > 0) {
                        nstage--;
                        break;
                    }
                }
                else if (ch == 'q') {
                    exit(0);
                }
            }
        }
    }
    

    } void DRAWSCREEN() {

    for (y = 0; y < 18; y++, puts("")) {
        for (x = 0; x < 21; x++) {
            _putch(arstage[y][x]);
        }
    }
    gotoxy(40, 5);
    printf("종료 하실려면 q");
    gotoxy(40, 7);
    printf("다음 스테이지 n 이전 스테이지 p");
    gotoxy(40, 9);
    printf("총 이동 횟수 : %d\n", nmove);
    

    } void MOVEDOLL(int ch) { int dx = 0, dy = 0;

    switch (ch) {
    case RIGHT:
        dx += 1;
        break;
    case LEFT:
        dx -= 1;
        break;
    case UP:
        dy -= 1;
        break;
    case DOWN:
        dy += 1;
        break;
    }
    
    if (arstage[ny + dy][nx + dx] != '#') {
        if (arstage[ny + dy][nx + dx] == ' ' || arstage[ny + dy][nx + dx] == '.') {
            arstage[ny + dy][nx + dx] = '@';
            arstage[ny][nx] = ' ';
        }
        else if (arstage[ny + dy][nx + dx] == 'O'&&arstage[ny+dy*2][nx+dx*2]!='O') {
            if (arstage[ny + dy * 2][nx + dx * 2] == '.' || arstage[ny + dy * 2][nx + dx * 2] == ' ') {
                arstage[ny + dy * 2][nx + dx * 2] = 'O';
                arstage[ny + dy][nx + dx] = '@';
                arstage[ny][nx] = ' ';
            }
        }
        if (ARSTAGE[nstage][ny][nx] == '.' && arstage[ny][nx] == ' ') {
            arstage[ny][nx] = '.';
        }
        nx += dx;
        ny += dy;
        nmove++;
    }
    

    }

    처음으로 만들어본 게임이라 정말 이상하지만 혼자서 해결을 못하겠어서 질문드립니다 아마도 문제가 MOVEDOLL()함수에서인것 같은데 예를들어서 (VC++에서 만들었어요) 실행을 해보면 OO@ 이러한 상황에서(@ 이아이가 말) 원래는 못움직여야 정상인데 말이 뚫고 지나가버리네요 조건문은 나름 잘 짯다고 생각했었는데... 다시봐도 어디서 오류가 난건지 못찾겠습니다 ㅠ