본문내용
cessInput(void) /*키보드를 입력받아서 움직인다*/
{
int ch = getch();
switch(ch)
{
case 0xe0:
switch (getch())
{
case LEFT:
MovePlayer(-1, 0);
break;
case RIGHT:
MovePlayer(1, 0);
break;
case UP:
MovePlayer(0, -1);
break;
case DOWN:
MovePlayer(0, 1);
break;
}
break;
case 'q':
case 'Q':
return 1; // 게임 종료
break;
case 'r':
case 'R':
LoadMap(stage); // 이번 스테이지 다시 시작
PrintScore();
break;
case 'n':
case 'N':
if (stage < MAX_STAGE)
{
LoadMap(++stage); // 다음 스테이지로 이동
PrintScore();
}
break;
case 'p':
case 'P':
if (stage > 1)
{
LoadMap(--stage); // 다음 스테이지로 이동
PrintScore();
}
break;
case 'u': // 마지막 이동 취소
case 'U':
UndoLast();
break;
}
return 0;
}
void MovePlayer(int dx, int dy)
{
int move = 0;
int next_place = map[cury + dy][curx + dx];
switch (next_place)
{
case BLANK: // 빈칸
case BOX: // 빈 상자
move = 1; // 이동 가능
break;
case HEART: // 하트
case HEARTBOX: // 하트가 든 상자
move = PushHeart(dx, dy); // 하트를 밀 수 있으면 이동 가능
break;
}
if (move) // 이동 가능하면...
{
// 이동 취소를 위해서...
prevx = curx;
prevy = cury;
prev_block = next_place;
// 푸쉬맨 위치 이동
curx += dx;
cury += dy;
step++;
// 화면 갱신
PrintScore();
GotoXY(MAP_LEFT + curx * 2, MAP_TOP + cury);
printf("%s", block[PUSHMAN]); // 푸쉬맨
GotoXY(MAP_LEFT + prevx * 2, MAP_TOP + prevy);
printf("%s", block[map[prevy][prevx]]);
}
}
int PushHeart(int dx, int dy)
{
int move = 0;
int * heart = &map[cury + dy][curx + dx]; // 하트 종류
int * next_place = &map[cury + dy + dy][curx + dx + dx];
if (*heart == HEART) // 상자 바깥의 하트는,
{
if (*next_place == BLANK) // 다음 칸이 비어 있을 때,
{
*next_place = HEART; // 빈 칸으로 하트 이동
*heart = BLANK; // 하트가 있던 자리는 빈 칸으로...
move = 1; // 이동 가능
}
else if (*next_place == BOX) // 다음 칸이 빈 상자일 때,
{
*next_place = HEARTBOX; // 빈 상자 안으로 하트 이동
*heart = BLANK; // 하트가 있던 자리는 빈 칸으로...
left_hearts--; // 남은 하트 수 감소
move = 1; // 이동 가능
}
}
else // *heart == HEARTBOX, 상자 안의 하트는,
{
if (*next_place == BOX) // 다음 칸에 빈 상자가 있으면
{
*next_place = HEARTBOX; // 빈 상자 안으로 하트 이동
*heart = BOX; // 하트가 있던 자리는 빈 상자로...
move = 1; // 이동 가능
}
}
if (move) // 이동 가능한 경우, 화면 갱신
{
GotoXY(MAP_LEFT + (curx + dx + dx) * 2, MAP_TOP + cury + dy + dy);
printf("%s", block[*next_place]);
GotoXY(MAP_LEFT + (curx + dx) * 2, MAP_TOP + cury + dy);
printf("%s", block[*heart]);
}
return move;
}
void UndoLast(void)
{
int dx, dy;
int * heart;
if (prev_block >= 0) // 이동 취소는 연속으로 할 수 없음
{
dx = curx - prevx;
dy = cury - prevy;
heart = &map[cury + dy][curx + dx];
if (prev_block == HEART) // 하트가 있던 자리였으면,
{
if (*heart == HEARTBOX) // 하트가 든 상자는
{
*heart = BOX; // 빈 상자로...
left_hearts++;
}
else // 하트가 있던 자리는
*heart = BLANK; // 빈 칸으로...
}
else if (prev_block == HEARTBOX) // 하트가 담겨 있던 상자였으면
*heart = BOX; // 상자를 비움
map[cury][curx] = prev_block; // 푸쉬맨이 서있던 자리를 원래 상태로 복구
GotoXY(MAP_LEFT + (curx + dx) * 2, MAP_TOP + cury + dy);
printf("%s", block[*heart]);
GotoXY(MAP_LEFT + curx * 2, MAP_TOP + cury);
printf("%s", block[prev_block]);
GotoXY(MAP_LEFT + prevx * 2, MAP_TOP + prevy);
printf("%s", block[PUSHMAN]); // 푸쉬맨
curx = prevx;
cury = prevy;
prev_block = -1; // 연속적인 이동 취소 불가
step++;
PrintScore();
}
}
{
int ch = getch();
switch(ch)
{
case 0xe0:
switch (getch())
{
case LEFT:
MovePlayer(-1, 0);
break;
case RIGHT:
MovePlayer(1, 0);
break;
case UP:
MovePlayer(0, -1);
break;
case DOWN:
MovePlayer(0, 1);
break;
}
break;
case 'q':
case 'Q':
return 1; // 게임 종료
break;
case 'r':
case 'R':
LoadMap(stage); // 이번 스테이지 다시 시작
PrintScore();
break;
case 'n':
case 'N':
if (stage < MAX_STAGE)
{
LoadMap(++stage); // 다음 스테이지로 이동
PrintScore();
}
break;
case 'p':
case 'P':
if (stage > 1)
{
LoadMap(--stage); // 다음 스테이지로 이동
PrintScore();
}
break;
case 'u': // 마지막 이동 취소
case 'U':
UndoLast();
break;
}
return 0;
}
void MovePlayer(int dx, int dy)
{
int move = 0;
int next_place = map[cury + dy][curx + dx];
switch (next_place)
{
case BLANK: // 빈칸
case BOX: // 빈 상자
move = 1; // 이동 가능
break;
case HEART: // 하트
case HEARTBOX: // 하트가 든 상자
move = PushHeart(dx, dy); // 하트를 밀 수 있으면 이동 가능
break;
}
if (move) // 이동 가능하면...
{
// 이동 취소를 위해서...
prevx = curx;
prevy = cury;
prev_block = next_place;
// 푸쉬맨 위치 이동
curx += dx;
cury += dy;
step++;
// 화면 갱신
PrintScore();
GotoXY(MAP_LEFT + curx * 2, MAP_TOP + cury);
printf("%s", block[PUSHMAN]); // 푸쉬맨
GotoXY(MAP_LEFT + prevx * 2, MAP_TOP + prevy);
printf("%s", block[map[prevy][prevx]]);
}
}
int PushHeart(int dx, int dy)
{
int move = 0;
int * heart = &map[cury + dy][curx + dx]; // 하트 종류
int * next_place = &map[cury + dy + dy][curx + dx + dx];
if (*heart == HEART) // 상자 바깥의 하트는,
{
if (*next_place == BLANK) // 다음 칸이 비어 있을 때,
{
*next_place = HEART; // 빈 칸으로 하트 이동
*heart = BLANK; // 하트가 있던 자리는 빈 칸으로...
move = 1; // 이동 가능
}
else if (*next_place == BOX) // 다음 칸이 빈 상자일 때,
{
*next_place = HEARTBOX; // 빈 상자 안으로 하트 이동
*heart = BLANK; // 하트가 있던 자리는 빈 칸으로...
left_hearts--; // 남은 하트 수 감소
move = 1; // 이동 가능
}
}
else // *heart == HEARTBOX, 상자 안의 하트는,
{
if (*next_place == BOX) // 다음 칸에 빈 상자가 있으면
{
*next_place = HEARTBOX; // 빈 상자 안으로 하트 이동
*heart = BOX; // 하트가 있던 자리는 빈 상자로...
move = 1; // 이동 가능
}
}
if (move) // 이동 가능한 경우, 화면 갱신
{
GotoXY(MAP_LEFT + (curx + dx + dx) * 2, MAP_TOP + cury + dy + dy);
printf("%s", block[*next_place]);
GotoXY(MAP_LEFT + (curx + dx) * 2, MAP_TOP + cury + dy);
printf("%s", block[*heart]);
}
return move;
}
void UndoLast(void)
{
int dx, dy;
int * heart;
if (prev_block >= 0) // 이동 취소는 연속으로 할 수 없음
{
dx = curx - prevx;
dy = cury - prevy;
heart = &map[cury + dy][curx + dx];
if (prev_block == HEART) // 하트가 있던 자리였으면,
{
if (*heart == HEARTBOX) // 하트가 든 상자는
{
*heart = BOX; // 빈 상자로...
left_hearts++;
}
else // 하트가 있던 자리는
*heart = BLANK; // 빈 칸으로...
}
else if (prev_block == HEARTBOX) // 하트가 담겨 있던 상자였으면
*heart = BOX; // 상자를 비움
map[cury][curx] = prev_block; // 푸쉬맨이 서있던 자리를 원래 상태로 복구
GotoXY(MAP_LEFT + (curx + dx) * 2, MAP_TOP + cury + dy);
printf("%s", block[*heart]);
GotoXY(MAP_LEFT + curx * 2, MAP_TOP + cury);
printf("%s", block[prev_block]);
GotoXY(MAP_LEFT + prevx * 2, MAP_TOP + prevy);
printf("%s", block[PUSHMAN]); // 푸쉬맨
curx = prevx;
cury = prevy;
prev_block = -1; // 연속적인 이동 취소 불가
step++;
PrintScore();
}
}
소개글