71 lines
1.5 KiB
Text
71 lines
1.5 KiB
Text
import Algorithms as algo;
|
|
import Mathematics as math;
|
|
import Terminal as term;
|
|
|
|
class Maze {
|
|
_rows = none;
|
|
_cols = none;
|
|
_data = none;
|
|
constructor( rows_, cols_ ) {
|
|
_rows = ( rows_ / 2 ) * 2 - 1;
|
|
_cols = ( cols_ / 2 ) * 2 - 1;
|
|
_data = [].resize( _rows + 2, [].resize( _cols + 2, false ) );
|
|
x = 0;
|
|
y = 0;
|
|
path = [];
|
|
rng = math.Randomizer( math.Randomizer.DISTRIBUTION.DISCRETE, 0, integer( $2 ^ $63 - $1 ) );
|
|
for ( _ : algo.range( _rows * _cols / 3 ) ) {
|
|
_data[y + 1][x + 1] = true;
|
|
while ( true ) {
|
|
n = neighbours( y, x );
|
|
ns = size( n );
|
|
if ( ns == 0 ) {
|
|
if ( size( path ) == 0 ) {
|
|
break;
|
|
}
|
|
y, x = path[-1];
|
|
path.pop();
|
|
continue;
|
|
}
|
|
oy, ox = ( y, x );
|
|
y, x = n[rng.next() % ns];
|
|
_data[(y + oy) / 2 + 1][(x + ox) / 2 + 1] = true;
|
|
path.push( ( y, x ) );
|
|
break;
|
|
}
|
|
}
|
|
_data[0][1] = true;
|
|
_data[-1][-2] = true;
|
|
}
|
|
neighbours( y_, x_ ) {
|
|
n = [];
|
|
if ( ( x_ > 1 ) && ! _data[y_ + 1][x_ - 1] ) {
|
|
n.push( ( y_, x_ - 2 ) );
|
|
}
|
|
if ( ( y_ > 1 ) && ! _data[y_ - 1][x_ + 1] ) {
|
|
n.push( ( y_ - 2, x_ ) );
|
|
}
|
|
if ( ( x_ < ( _cols - 2 ) ) && ! _data[y_ + 1][x_ + 3] ) {
|
|
n.push( ( y_, x_ + 2 ) );
|
|
}
|
|
if ( ( y_ < ( _rows - 2 ) ) && ! _data[y_ + 3][x_ + 1] ) {
|
|
n.push( ( y_ + 2, x_ ) );
|
|
}
|
|
return ( n );
|
|
}
|
|
to_string() {
|
|
s = "";
|
|
for ( r : _data ) {
|
|
s += ∑( algo.map( r, @( b ) { b ? " " : "#"; } ) );
|
|
s += "\n";
|
|
}
|
|
return ( s );
|
|
}
|
|
}
|
|
|
|
main() {
|
|
rows = term.lines() - 2;
|
|
cols = term.columns() - 1;
|
|
maze = Maze( rows, cols );
|
|
print( "{}".format( maze ) );
|
|
}
|