Random Maze Generation
♥0 |
Line 186 |
Modified 2012-04-28 02:28:30 |
GPLv3 License
archived:2017-03-20 16:55:59
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);
}
}
}
}