Labirintus algoritmus OFF
Nagy Endre
gumo at lucifer.kgt.bme.hu
Tue Dec 17 12:21:11 CET 2002
> >Kuldok egy forrast.
>
> Koszi elore is. Szivesen megneznem, hogy en ertettem
> valamit felre a magyarazatbol, vagy az algoritmus
> sajatsaga, ahogy most muxik.
Ezt ugyanabban a levelben kuldtem attachmentkent, ha jobban megnezed :)
De itt van inline:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define xS 80 //x size
#define yS 24 //y size
#define S (xS*yS) //size
#define F '*' //fill
#define E ' ' //empty
void Hdiv(char *scr,int x1,int y1,int x2,int y2);
void Vdiv(char *scr,int x1,int y1,int x2,int y2);
int main(void) {
char screen[S];
int i;
srand((unsigned int)time(NULL)); //rnd initialization
for(i=0;i<S;i++) screen[i]=E;
for(i=0;i<xS;i++) {screen[i]=F;screen[S-i-1]=F;}
for(i=0;i<yS;i++) {screen[i*xS]=F;screen[(i+1)*xS-1]=F;}
Hdiv(screen,0,0,xS-1,yS-1);
screen[1]=E;screen[S-2]=E;
for(i=0;i<S;i++) printf("%c",screen[i]);
return 0;
}
//Horizontal splitting (|)
void Hdiv(char *scr,int x1,int y1,int x2,int y2) {
double xd,yd;
int x,y,i;
if(x2-x1<4) return;
//wall
xd=(x2-x1-4)*((double)rand()/RAND_MAX)/2;
x=x1+2+2*(int)rint(xd);
//hole
yd=(y2-y1-2)*((double)rand()/RAND_MAX)/2;
y=y1+1+2*(int)rint(yd);
for(i=y1;i<y2;i++) scr[i*xS+x]=F;
scr[x+y*xS]=E;
Vdiv(scr,x1,y1,x,y2);
Vdiv(scr,x,y1,x2,y2);
return;
}
//Vertical splitting (-)
void Vdiv(char *scr,int x1,int y1,int x2,int y2) {
double xd,yd;
int x,y,i;
if(y2-y1<4) return;
//wall
yd=(y2-y1-4)*((double)rand()/RAND_MAX)/2;
y=y1+2+2*(int)rint(yd);
//hole
xd=(x2-x1-2)*((double)rand()/RAND_MAX)/2;
x=x1+1+2*(int)rint(xd);
for(i=x1;i<x2;i++) scr[y*xS+i]=F;
scr[x+y*xS]=E;
Hdiv(scr,x1,y1,x2,y);
Hdiv(scr,x1,y,x2,y2);
return;
}
More information about the Elektro
mailing list