Random Maze Generation

by Abarrow
♥0 | Line 186 | Modified 2012-04-28 02:28:30 | GPLv3 License
play

ActionScript3 source code

/**
 * Copyright Abarrow ( http://wonderfl.net/user/Abarrow )
 * GNU General Public License, v3 ( http://www.gnu.org/licenses/quick-guide-gplv3.html )
 * Downloaded from: http://wonderfl.net/c/5WMG
 */

package {
    import flash.display.Sprite;
    import flash.display.Graphics;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.geom.Point;
    [SWF(width=465,height=465,backgroundColor="#ffffff",frameRate=24)]
    public class FlashTest extends Sprite {     
        public var field:TextField;
        public var format:TextFormat;
        public var back:Sprite;
        public var world:TextWorld;
        public function FlashTest() {
            back=new Sprite();
            back.graphics.beginFill(0);
            back.graphics.drawRect(0,0,465,465);
            back.graphics.endFill();
            addChild(back);
            format=new TextFormat();
            format.font="Courier";
            format.color=0xffffff;
            format.size=12;
            field=new TextField();
            field.selectable=false;
            field.autoSize="left";
            addChild(field);
            
            //empty map
            var str:String="";
            var wide:int=20;
            var high:int=20;
            for(var n:int=0;n<wide;n++){
                for(var m:int=0;m<high;m++){
                    str+=" ";
                }
                if(n!=wide-1){
                    str+="\n";
                }
            }
            
            world=new TextWorld(new TextMap(str));
            
            //make a room
            for(n=6;n<14;n++){
                for(m=6;m<14;m++){
                    if(n==6||m==6||n==13||m==13){
                        world.map.setValueAt(n,m,"W");
                    }else{
                        world.map.setValueAt(n,m," ");
                    }
                }
            }
            //make a door
            var po:Point=new Point();
            var rand:Number=Math.random();
            var am:int=Math.round(1+Math.random()*5);
            if(rand>0.75){
                po.x=6;
                po.y=6+am;
            }else if(rand>0.5){
                po.x=13;
                po.y=6+am;
            }else if(rand>0.25){
                po.y=6;
                po.x=6+am;
            }else{
                po.y=13;
                po.x=6+am;
            }
            world.map.setValueAt(po.x,po.y,"D");
            
            //make outer walls
            for(n=0;n<20;n+=19){
                for(m=0;m<20;m++){
                    world.map.setValueAt(n,m,"W");
                }
            }
            for(n=0;n<20;n++){
                for(m=0;m<20;m+=19){
                    world.map.setValueAt(n,m,"W");
                }
            }
            
            
            
            setField(world.output());
        }
        public function setField(str:String):void{
            field.text=str;
            field.setTextFormat(format);
        }
    }
}
class TextWorld{
    public var map:TextMap;
    private var width:int;
    private var height:int;
    public function TextWorld(ma:TextMap=null){
        setMap(ma);
    }
    public function setMap(ma:TextMap=null):void{
        var ok:Boolean=true;
        if(ma!=null&&ma.map.length>0){
            if(ma.map[0].length>0){
                map=ma;
                height=ma.map.length;
                width=ma.map[0].length;
            }else{
                ok=false;
            }
        }else{
            ok=false;
        }
        if(!ok){
            width=-1;
            height=-1;
            map=null;
        }
    }
    public function render():Vector.<String>{
        var rows:Vector.<String>=new Vector.<String>();
        if(width>0&&height>0&&map!=null){
            rows=map.map;
        }
        return rows;
    }
    public function output():String{
        var str:String="";
        var stuff:Vector.<String>=render();
        for(var yn:int=0;yn<stuff.length;yn++){
            str+=stuff[yn]+"\n";
        }
        return str;
    }
}
class TextMap{
    private var width:int;
    private var height:int;
    public var map:Vector.<String>;
    public function TextMap(ma:Object=null){
        var ok:Boolean=true;
        if(ma==null){
            ok=false;
        }else if(ma is Vector.<String>){
            setMap(ma as Vector.<String>);
        }else if(ma is String){
            decodeMap(ma as String);
        }else{
            ok=false;
        }
        if(!ok){
            width=-1;
            height=-1;
            map=null;
        }
    }
    public function decodeMap(ma:String):void{
        var m:Vector.<String>=new Vector.<String>();
        while(true){
            var ind:int=ma.indexOf("\n");
            if(ind==-1){
                m.push(ma);
                break;
            }else{
                m.push(ma.substr(0,ind));
                ma=ma.substr(ind+1);
            }
        }
        setMap(m);
    }
    public function setMap(ma:Vector.<String>=null):void{
        var ok:Boolean=true;
        if(ma!=null&&ma.length>0){
            if(ma[0].length>0){
                map=ma;
                height=ma.length;
                width=ma[0].length;
            }else{
                ok=false;
            }
        }else{
            ok=false;
        }
        if(!ok){
            width=-1;
            height=-1;
            map=null;
        }
    }
    public function setValueAt(x:int,y:int,v:String):void{
        if(width>0&&height>0&&map!=null){
            if(x<width&&y<height){
                map[y]=map[y].substr(0,x)+v+map[y].substr(x+1);
            }
        }
    }
}