소코반 게임 질문입니다

조회수 160회
#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.1.12 11:25
  • ?? 코드블록 적용하는 법 말씀이시라면 앞뒤로 ``` 를 붙이시면 됩니다. 엽토군 2020.1.12 15:58
  • 감사합니다! 이재덕 2020.1.15 13:55

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

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.