2009年10月31日 星期六

迷宮



#include <stdio.h>
#include <time.h>

enum {U=1, L=2, R=4, D=8};
int  w=32, h=28;
char mz[256][256];
char inv[4] = {3,2,1,0};
char yd[4] = {-1,0,0,1}; 
char xd[4] = {0,-1,1,0};
char *cell = "  │─┘─└─┴││┐┤┌├┬└";  //內部牆壁類型

void link (int x, int y)
{
    int i=0, d, dir = rand()%4;                 //連結牆壁
    do{
        d = (dir+i) & 3;                        
        if ((mz[x][y] & 1<<d) ||                //若此方向已選過
            mz [x + xd[d]][y + yd[d]]) {        //或此方位已有牆壁
            i++; continue;                      //便選擇其他方向    
        }
        mz[x][y] |= 1<<d;                       //記錄所選方向
        x += xd[d];                             //朝此方向移動 
        y += yd[d];
        if (x<0 || x>w || y<0 || y>h) break;    //若出界則返回
        mz[x][y] |= 1<<inv[d];                  //紀錄舊點連結方向
        dir = rand()%4; i = 0;                  //隨機選擇方向
    }
    while (i < 4);
}

void main ()
{
    srand (time(0));
    int i,j, u=0, r=w, d=h, l=0;
    for (i=0;i<=w*h;i++) mz[0][i] = 0;          //設定cell的允許方向   
    for (i=0;i<=w;i++) {mz[i][0] |= L+R; mz[i][h] |= L+R;}
    for (j=0;j<=h;j++) {mz[0][j] |= U+D; mz[w][j] |= U+D;}

    while (u<d && l<r) {                        //對每個位置下種子
        for (i=l; i<=r; i++) link (i,u); u++;   //填充迷宮內部
        for (i=u; i<=d; i++) link (r,i); r--;
        for (i=r; i>=l; i--) link (i,d); d--;
        for (i=d; i>=u; i--) link (l,i); l++;
    }
    for (i=0; i<=h; i++, puts(""))              //印出迷宮
        for (j=0; j<=w; j++) {
            r = mz[j][i]*2;
            if (j==0 && r==22) r-=4; 
            if (i==0) r==14? r-=6: r==30? r=20:0;
            if ((i==h || j==w) && (r==26 || r==28)) r-=24;
            printf("%c%c", cell[r], cell[r+1]);
        }
        getch();
}
輸出:
┐───┬──────┬────┬──────┬────────┐ ││┌─┘┌┐─┐┌─┘┌──┐│┌────┐│┌┬─┬─┐┌┐│ ││└──┘└─┘├┬┐└─┐│└┘┌─┐┌┘└┘└┐└┐││││ │└┐┌─┐┌─┐│││──┘│┌┬┘│├┘┌┐┌─┘┌┘││││ │┌┘│┌┘│┌┘└┐├┐┌┬┘│└─││┌┤└┘┌─└┐└─┘│ ││┌┘└─┘││┌┘│├┘└┐└──┘││├┬─└──┘│┌┬┤ │││┌───│└┘┌┤└─┐├──┌┬─┘││┌┬──┐││││ │└┴┴─┌─┘┌─┘└─┐│├─┌┘│┌┐│┌┘│┌┐│└┘││ ││┌──┴──│┌──┬┘││┌┤│││└┬┘─┐││└┐┌┘│ │││─┐┌┐┌┘│┌┐│┌┘│││└┘└┐└─┌┘│└┐└┘││ │││┌┴┘││─┘│├─┘┌┘└──┐┌┘┌─┘┌┘┌┤┌─┤│ │├┴┘┌┐│└┐┌┘└┬┐│┌┬─┌┘└─┘┌┐│─┘│└┐└┤ ││┌┐││└┐││┌┐││└┘│┌┘────┘│└┐┌┘─┴─│ │└┘└┘└┐││││└┐└─┐││┌───┐┌┤─┤└───┬┤ │┌────┘│└┐││└┐─┘┌┘└┐┌─┘││┌┘─┬┐┌┘│ ├┘┌─┌──┐┌┘│└┐│┌┐└─┐│└───┘└──┘││┌┤ │││┌┘┌─┘│┌┴─││││┌┐└┘───┬──┐┌┐┌┘││ ││││─┘┌┐┌┘┌┐│││└┘└┐│┌┐┌┘─┬┘││└─┐│ │├┘└┐┌┘│└┐│└┤└┘│┌┐│││││┌┬┘┌┘│┌─┘│ │├──┘└┐┌┐└┘┌┘┌┐└┘││││┌┘││┌┘┌┘│┌┐│ │├┐┌┬─└┘│┌─┘┌┘│┌─┤└┤├┘─┐││┌┘┌┘│││ ││││└───┘└─┐└┐│└─└┐│└─┐││││┌┘─┘││ │││├─────┌─┘─┘└┐┌┐│└─┐└┘││└┘─┬─┘│ ││││┌┐│┌┐└─────┘│└┤─┐││┌┘└───┘│┌┤ │┌┘└┘└┤│└┐┌┐┌┐┌┐└─│┌┤│││┌────┐│││ │├───┐││┌┘│└┘│││┌┐││││├┴┘│┌──┘└┘│ ││──┐└┴┘└───┐│┌┴┘└┘│││└──┤│┌┐┌┐┌┤ │└──┤───────┘├┘─┬──┘│└───┘└┘└┘└┘│ └───┴────────┴──┴───────────────└

沒有留言:

張貼留言