(재미)미로 만드는 프로그램
재미로 순수 c++로만 만들었습니다. 미로 출력은 maze.bmp 입니다. 윈도우에서도 컴파일 될겁니다. 출력 예 : https://www.dropbox.com/s/0u5iffu5el2aaqt/maze.bmp
(왜 *.cpp *bmp 못 올리나요?)
소스가 더러워도 양해해 주세요.
#include
#include
#include
#define CEL 5
#define BOR 1
#define setwall(b) setpixel(b, 0x00, 0x00, 0x00)
int H, W, S;
const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
const bool SS[7][7] = {{0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 1, 0},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0}},
EE[7][7] = {{0, 0, 0, 0, 0, 0 ,0},
{0, 1, 1, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0}};
bool **chk;
char *BMP;
union QBYTE {
char byte[4];
short dbyte[2];
int qbyte;
};
struct mazetype {
QBYTE d;
mazetype() {}
mazetype(bool n, bool e, bool s, bool w) {
d.byte[0] = n, d.byte[1] = e, d.byte[2] = s, d.byte[3] = w;
}
} **M;
void exit_error(const char str[] = "Error! exiting...") {
puts(str);
exit(1);
}
void input() {
puts("Make Maze!");
printf("width height seed: ");
if(scanf("%d%d%d", &W, &H, &S) == EOF) exit_error();
if(H < 5 || W < 5) exit_error("size too small");
if(H * W > 50000) exit_error("size too big");
if(S == 0) S = time(0);
srand(S);
}
void makemaze(int h, int w) {
chk[h][w] = 1;
int i, j;
for(i = 0;; i++) {
for(j = 0; j < 4; j++) {
if(!chk[h + dir[j][0]][w + dir[j][1]]) break;
}
if(j >= 4) break;
int d = rand() % 4;
int nh = h + dir[d][0], nw = w + dir[d][1];
if(chk[nh][nw]) continue;
M[h][w].d.byte[d] = 0, M[nh][nw].d.byte[(d + 2) % 4] = 0;
makemaze(nh, nw);
}
}
void setpixel(char *start, char r, char g, char b) {
*start = b, *(start + 1) = g, *(start + 2) = r;
}
void printheader(int bitmapsize, int width, int height) {
unsigned int i;
char head1[] = {0x42, 0x4d};
char head3[] = {0, 0, 0, 0, 0x36, 0, 0, 0};
char head4[] = {0x28, 0, 0, 0};
char head7[] = {0x01, 0, 0x18, 0, 0, 0, 0, 0};
char head9[] = {0x13, 0x0b, 0, 0, 0x13, 0x0b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
QBYTE head2, head5, head6, head8;
head2.qbyte = bitmapsize + 54;
head5.qbyte = width;
head6.qbyte = -height;
head8.qbyte = bitmapsize;
for(i = 0; i < sizeof head1; i++) putchar(head1[i]);
for(i = 0; i < sizeof head2.byte; i++) putchar(head2.byte[i]);
for(i = 0; i < sizeof head3; i++) putchar(head3[i]);
for(i = 0; i < sizeof head4; i++) putchar(head4[i]);
for(i = 0; i < sizeof head5.byte; i++) putchar(head5.byte[i]);
for(i = 0; i < sizeof head6.byte; i++) putchar(head6.byte[i]);
for(i = 0; i < sizeof head7; i++) putchar(head7[i]);
for(i = 0; i < sizeof head8.byte; i++) putchar(head8.byte[i]);
for(i = 0; i < sizeof head9; i++) putchar(head9[i]);
}
int main() {
// input
input();
// make maze
int i, j;
M = new mazetype*[H + 2];
chk = new bool*[H + 2];
for(i = 0; i < H + 2; i++) {
M[i] = new mazetype[W + 2];
chk[i] = new bool[W + 2];
for(j = 0; j < W + 2; j++) {
M[i][j] = mazetype(1, 1, 1, 1);
if(i == 0 || i == H + 1 || j == 0 || j == W + 1) chk[i][j] = 1;
else chk[i][j] = 0;
}
}
makemaze(1, 1);
// print bitmap header
if(freopen("maze.bmp", "w", stdout) == NULL) exit_error("Cannot open output file");
int bmpw = W * (CEL + BOR * 2) * 3, bmph = H * (CEL + BOR * 2), pxw = W * (CEL + BOR * 2);
bmpw = bmpw % 4? (bmpw / 4 + 1) * 4: bmpw;
BMP = new char[bmpw * bmph];
for(i = 0; i < bmph * bmpw; i += 3) setpixel(&BMP[i], 0xFF, 0xFF, 0xDD);
printheader(bmpw * bmph, W * (CEL + BOR * 2), H * (CEL + BOR * 2));
// print maze
for(i = 0; i < bmph; i++) {
for(j = 0; j < pxw; j++) {
int vp = i % (CEL + BOR * 2), hp = j % (CEL + BOR * 2);
int hc = i / (CEL + BOR * 2) + 1, wc = j / (CEL + BOR * 2) + 1;
if(vp < BOR) {
if(hp < BOR || hp > CEL + BOR - 1) setwall(&BMP[i * bmpw + j * 3]);
else if(M[hc][wc].d.byte[0]) setwall(&BMP[i * bmpw + j * 3]);
} else if(vp > CEL + BOR - 1) {
if(hp < BOR || hp > CEL + BOR - 1) setwall(&BMP[i * bmpw + j * 3]);
else if(M[hc][wc].d.byte[2]) setwall(&BMP[i * bmpw + j * 3]);
} else {
if(hp < BOR && M[hc][wc].d.byte[3]) setwall(&BMP[i * bmpw + j * 3]);
else if(hp > CEL + BOR - 1 && M[hc][wc].d.byte[1]) setwall(&BMP[i * bmpw + j * 3]);
}
}
}
for(i = 0; i < 7; i++) {
for(j = 0; j < 7; j++)
if(SS[i][j]) setpixel(&BMP[i * bmpw + j * 3], 0xff, 0x11, 0x11);
}
int endh = (H - 1) * (CEL + BOR * 2), endw = (W - 1) * (CEL + BOR * 2);
for(i = endh; i < bmph; i++) {
for(j = endw; j < pxw; j++)
if(EE[i - endh][j - endw]) setpixel(&BMP[i * bmpw + j * 3], 0x11, 0x11, 0xff);
}
for(i = 0; i < bmpw * bmph; i++) putchar(BMP[i]);
return 0;
}
수정을 못하네요
소스파일
잘 만드셨네요. 그런데 흠...
잘 만드셨네요.
완료 되었다면 생성된 파일명과 함께 완료 되었다는 메시지 좀 넣어주셧으면 좋다고 생각합니다.
소스를 보고서야 이미지 파일이 결과물임을 알게되었네요.
마지막으로 라이센스좀 알고 싶네요. ^^;
부족한점 수정
수정했습니다. 감사합니다.
[냉무] 간단한 맵 크기를 가지면 이미 이 자체로 게임이 되지 않을까합니다.
간단한 맵 크기를 가지면 이미 이 자체로 게임이 되지 않을까합니다.
단순하지만 시간 킬 하고 싶은 분들 부담 없는 게임이지 않나 합니다.