23.05.25.
Today I Learned
- 컴공실
컴공실
maze 만들기
기존에 만들었던 코드는 집합밖에 만들지 못한다.
행을 내려가며 만드는 과정을 개발자는 알 수 있지만, 컴퓨터는 알지 못한다.
그러므로 한줄을 만들때마다 미로를 찍어내야한다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int W;
int H;
int* horizontalWall;
int* verticalWall;
int* maze;
int num = 1;
FILE* fp;
void borderWall() {
int i;
for (i = 0; i < W; i++) {
fprintf(fp, "+-");
}
fprintf(fp, "+\n");
}
void firstLine() {
int i, j;
int prevWall = -1;
for (i = 0; i < W - 1; i++) {
verticalWall[i] = rand() % 2;//1이면 벽이 있고, 0이면 없음
if (verticalWall[i]) {//벽이 생기면 이전블록부터 현재블록까지 같은 집합
for (j = prevWall + 1; j <= i; j++) {
maze[j] = num;
}
prevWall = i;
num++;
}
}
for (i = prevWall + 1; i < W; i++) {//남은 블록 전부 같은 집합
maze[i] = num;
}
num++;
}
//verticalWall이 1이면 |, 아니면 ' '출력
void makeVerticalWall() {
int i;
fprintf(fp, "|");
for (i = 0; i < W - 1; i++)
{
fprintf(fp, " ");
if (verticalWall[i])
{
fprintf(fp, "|");
}
else
{
fprintf(fp, " ");
}
}
fprintf(fp, " |\n");
}
void makeHorizontalWall() {
int i;
fprintf(fp, "+");
for (i = 0; i < W; i++)
{
if (horizontalWall[i])
{
fprintf(fp, "-+");
}
else
{
fprintf(fp, " +");
}
}
fprintf(fp, "\n");
}
void verticalCombine() {
int i;
int join_flag = 0;
int prevMazeNum = maze[0];
for (i = 0; i < W; i++) {
horizontalWall[i] = rand() % 2;
if (horizontalWall[i] == 0) {//벽이 없다면
join_flag = 1;
}
if ((i < W - 1) && (prevMazeNum != maze[i + 1])) {
if (!join_flag) horizontalWall[i] = 0;
else join_flag = 0;
}
if ((i == W - 1) && (!join_flag)) horizontalWall[i] = 0;//마지막까지 연 적 없으면 열기
if (horizontalWall[i]) {//벽이 있으면 번호 갱신
maze[i] = num;
num++;
}
}
}
void horizontalCombine() {
int i, j;
int prevMazeNum;
for (i = 0; i < W; i++) {
if (maze[i] != maze[i + 1]) {//다음블록과 다르면 랜덤한 벽 생성
verticalWall[i] = rand() % 2;
if (verticalWall[i] == 0) {//벽이 없다면
prevMazeNum = maze[i + 1];
maze[i + 1] = maze[i];
}
}
else verticalWall[i] = 1;//다음 블록과 같은집합이면 못 합친다
}
}
void makeMiddleWalls() {
int i;
for (i = 1; i < H-1; i++) {
verticalCombine();
makeHorizontalWall();
horizontalCombine();
makeVerticalWall();
}
}
void lastLine() {
int i, j;
int prevMazeNum;
for (i = 0; i < W - 1; i++) {
if (maze[i] != maze[i + 1]) {//마지막행은 다르면 무조건 합친다
verticalWall[i] = 0;
prevMazeNum = maze[i + 1];
maze[i + 1] = maze[i];
for (j = 0; j < W; j++) {
if (maze[j] == prevMazeNum) maze[j] = maze[i];
}
}
else verticalWall[i] = 1;
}
}
int main(void) {
fp = fopen("maze.maz", "w");
printf("Width: ");
scanf("%d", &W);//너비
printf("Height: ");
scanf("%d", &H);//높이
//초기화
horizontalWall = (int*)malloc(sizeof(int) * W);//처음 벽을 제외한 벽
verticalWall = (int*)malloc(sizeof(int) * (W - 1));//양 끝을 제외한 벽
maze = (int*)malloc(sizeof(int) * W);
srand(time(NULL));
borderWall();
firstLine();
makeVerticalWall();
makeMiddleWalls();
verticalCombine();
makeHorizontalWall();
lastLine();
makeVerticalWall();
borderWall();
fclose(fp);
return 0;
}