▸C언어/알고리즘 및 자료구조

스택구조_미로찾기 (애니메이션 ver) [2/3]

코데방 2019. 12. 9.
728x90

애니메이션 형태로 만들기는 간단하네요. 내친 김에 직접 움직여서 탈출하는 게임으로도 만들어볼까 했지만.. 콘솔로 게임 만들기는 좀 찾아보다보니 로직이나 알고리즘 전개의 문제라기보단 윈도우 제어 함수를 다루는 것에 더 중점이 있는 것 같아서 굳이 거기까지 공부할 필요는 없단 생각이 듭니다. 하면 좋기야 하겠지만 빨리 공부하고 JAVA로 넘어가는 편이 더 나을 것 같네요.

 

 

애니메이션 형태로 출력하기 위해 두 가지를 수정했습니다.

 


 

 

[ gotoxy() 함수 추가 - 출력 위치 지정 ]

  • 기본 함수가 아니라 직접 만들어줘야함 (인터넷에 아주 많음)
  • 유명한 함수 이름이 gotoxy()인데, 사실 이름은 마음대로 지정해서 쓰면 됨
  • windows.h 헤더파일에 있는 커서 위치 정보 변환 함수를 써서 만들어줌
  • 시간이 나면 깊게 공부해봐도 좋겠지만 GUI는 다른 언어로 만들것이므로 그냥 가져다 씀
  • x,y 좌표를 던져주면 그 위치부터 출력이 되기 때문에 출력 전에 좌표를 넣어주면 덮어쓰면서 출력
  • 해당 함수가 없으면 출력 후 다음 출력 위치부터 계속 출력하므로 여러개가 주르륵 출력됨
void maze_print(char maze[][COL])
{
	gotoxy(5, 3);
	for (int i = 0; i < ROW; ++i)
		printf("\t%s\n", &maze[i][0]);
}
/* 출력 좌표 이동 */
/* parameter : x, y 좌표*/
/* return : void */
void gotoxy(int x, int y)
{
	COORD pos = { x,y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

 

※ Point

gotoxy() 함수 대신, system("cls") 함수를 사용해서 출력 내용을 지운 뒤, 다시 출력하는 방식으로도 사용이 가능하지만, 아래와 같이 지우고 다시 출력하고를 반복하기 때문에 깜박거림이 발생하게 되어 기존 미로출력이 있는 상태에서 덮어써주는 방식을 선택하게 됨. 하지만 매번 크기가 같지 않은 경우라면 이 방법은 유효하지 않으며(기존 값이 남아있기 때문) system("cls")함수를 사용해줘야함

화면 깜박임 없애기

1. gotoxy() 함수로 같은 위치에 덮어써서 출력하기

(어느정도 깜박임이 줄어들지만 화면 크기가 늘어나고 출력이 많아지면 여전히 깜박임 발생)

2. 더블 버퍼링을 이횽해 기존 화면을 저장해두고 다음 화면으로 바로 전환시키는 방법

(다음 미로 버전에 추가)

[ system("cls") - 출력 내용 지우기 ]

윈도우 콘솔창에서 cls 명령어를 입력하면 콘솔창이 초기화됨. system() 함수도 windows.h 헤더 안에 포함되어 있으며, 괄호("")안에 명령 프롬프트 명령어를 입력해주면 해당 기능을 수행하도록 할 수 있고, 화면크기를 조정하는 등의 다른 명령어 입력 가능

 

깜박이는게 보기 싫음..

 


 

[ Sleep() 함수 추가 - 시간차 출력 ]

  • 덮어쓰면서 출력하더라도 컴퓨터는 넘나 빨라서 변화가 보이지 않음
  • 함수가 실행되는 속도를 제어해줄 수 있는 Sleep(1/1000초)함수를 써서 시간차 출력을 수행
  • windows.h 헤더안에 있으며 Sleep에서 S는 대문자를 써야함
  • 출력을 한번 한 후 Sleep()을 걸어줘서 출력 후 0.5초 뒤에 다시 실행시키도록 함 (출력 함수(maze_print)안에다가 바로 걸어줘도 됨)
maze_print(maze);
Sleep(500);

 


 

​​하고 나니 최단 경로를 구성하는 방법이 궁금해서 고민중이네요. 동서남북 방향을 순서대로 뒤지면 어찌됐건 최적경로보단 돌아가는 길이 발생할 수 있으니까요. 작성하면 다음 글에 올리도록 하겠습니다~

728x90

댓글

💲 추천 글