C

[C] #1 미로찾기 게임

Rix 2021. 9. 27. 21:46
미로 생성

- 미로의 틀 생성

미로의 크기를 19 x 19로 생성할 것이다.

#define SIZE 19

define은 매크로를 정의하는 구문이다. 위와 같은 경우를 보통 단순 매크로라고 부르면 기본적인 틀은 다음과 같다.

#define 매크로이름 값

 

- 미로 선언

char maze[SIZE][SIZE];

19 x 19의 2차원 배열의 미로가 생성될 것이다.

 

- 미로 내부 구성

미로를 구성하기에 앞서, txt 파일을 통해 난이도 선택을 할 수 있도록 하려고 한다.

즉, 파일을 읽어오는 방식이다.

txt 파일을 c 프로젝트와 같은 위치에 둔다.

 

- 난이도 변수를 받는 LoadMaze

void LoadMaze(char num)
{
	char path[20] = "./Maze";
	strcat(path, &num);
	strcat(path, ".txt");
    
    	char str_tmp[50] = { 0, };
  	FILE* f = fopen(path, "r");
}

--> 상대경로로 작성한 모습이다. 상대경로를 사용할 경우, 개개인마다 경로를 변경할 필요가 없이 파일 위치만 잘 조정해주면 된다.

기본적인 상대경로를 설정하고, strcat 함수를 이용해 난이도 변수, 확장자를 합쳐준다.

 

파일을 읽을 때는 <stdio.h> 헤더파일에 정의되어 있는 fopen 함수로 파일을 열고, 파일 포인터를 리턴받는다.

 

- 미로 저장

파일의 내용을 미로에 저장해야 하는데, 함수 2개만 짚고 넘어가겠다.

1. fgets 함수

fgets(char *s, int size, FILE *stream)

gets_s 함수와 비슷하다. 최대 크기가 size 이하인 문자를 stream으로부터 읽어서 s에 저장한다.

중간에 EOF  혹은 개행문자를 만나면 읽기를 멈추는 함수이다.

 

2. strtok 함수

char *strtok(char *string, char const *delimiter)

문자열 string을 delimiter를 기준으로 잘라서 반환한다.

string에 NULL을 넣고 실행하면, 이전에 자르고 남은 문자열을 다시 delimiter로 잘라서 반환해준다.

 

--> 이 함수들을 포함한 함수들은 다음과 같다.

void LoadMaze(char num)
{
	//....
	for (int i = 0; i < SIZE; i++)
	    {
	        fgets(str_tmp, 50, f);
	        char* ptr = strtok(str_tmp, "\t");
	        for (int j = 0; j < SIZE; j++)
	        {
	            maze[i][j] = *ptr;
	            ptr = strtok(NULL, "\t");
	        }
	    }
}

첫 번째 반복문의 내부에서 fgets로 한 줄의 데이터를 가져온다.

그 후, strtok 함수를 이용해 탭으로 문자열을 분리한 뒤, 미로에 저장하는 구조이다.