Do you like my tutorials?

Then consider supporting me on Ko-fi

Talking about Actionscript 3, Flash and Game development.

Today I’ll show you a procedural way to generate perfect caves, to be used in roguelike games.

The roguelike is a sub-genre of role-playing video games, characterized by randomization for replayability, permanent death, and turn-based movement. Most roguelikes feature ASCII graphics, with newer ones increasingly offering tile-based graphics. Games are typically dungeon crawls, with many monsters, items, and environmental features. Computer roguelikes usually employ the majority of the keyboard to facilitate interaction with items and the environment. The name of the genre comes from the 1980 game Rogue (source).

Please note I said “perfect cave” but I do not mean “better than the rest”, but a cave in which every tile can be reached from any other tile without jumping through walls.

This is the code:

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	public class terrain extends Sprite {
		private const MIN_TILES:int=750;
		private var canvas:Sprite;
		private var tilesPlaced:int;
		private var tilesToProcess:int;
		private var adjacentCells:int;
		private var startX:int;
		private var startY:int;
		private var mapWidth:int=64;
		private var mapHeight:int=48;
		private var tileSize:int=10;
		private var turnRatio:Number=0.25;
		private var randomDirections:Array;
		private var theCave:Array;
		public function terrain() {
			canvas = new Sprite();
			addChild(canvas);
			setupCave();
			generateCave();
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}
		private function onClick(e:MouseEvent):void {
			setupCave();
			generateCave();
		}
		private function generateCave():void {
			randomDirections=shuffle([0,1,2,3]);
			tilesPlaced=1;
			startX=Math.round(mapWidth/2);
			startY=Math.round(mapHeight/2);
			while (tilesPlaced0) {
				var currentX=xCoordsArray.pop();
				var currentY=yCoordsArray.pop();
				adjacentCells=getAdjacentCells(tilesToProcess);
				if (adjacentCells>0) {
					if (Math.random()=0&&adjacentX=0&&adjacentY0) {
				suffledArray.push(startArray.splice(Math.floor(Math.random()*startArray.length),1));
			}
			return suffledArray;
		}
	}
}

and this is the result:

Click on the movie to generate a new cave. Now it’s time to take a pause on “procedural stuff generation” and explain all previous scripts. Meanwhile feel free to custom the script, I tried to use variables with the most meaningful name I could figure out.

Now try to do the same with Perlin noise… :)

Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.