栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

BSP地牢生成的简单示例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

BSP地牢生成的简单示例

这还没有链接房间,但是它使用所描述的算法生成了不错的地牢。(不幸的是,它是在Java中,但是我尝试添加一些注释来阐明正在执行的操作。)

public static class Rectangle {    private static int MIN_SIZE = 5;    private static Random rnd = new Random();    private int top, left, width, height;    private Rectangle leftChild;    private Rectangle rightChild;    private Rectangle dungeon;    public Rectangle(int top, int left, int height, int width) {        this.top = top;        this.left = left;        this.width = width;        this.height = height;    }    public boolean split() {        if( leftChild != null ) //if already split, bail out return false;        boolean horizontal = rnd.nextBoolean(); //direction of split        int max = (horizontal ? height : width ) - MIN_SIZE; //maximum height/width we can split off        if( max <= MIN_SIZE ) // area too small to split, bail out return false;        int split = rnd.nextInt( max ); // generate split point         if( split < MIN_SIZE )  // adjust split point so there's at least MIN_SIZE in both partitions split = MIN_SIZE;        if( horizontal ) { //populate child areas leftChild = new Rectangle( top, left, split, width );  rightChild = new Rectangle( top+split, left, height-split, width );        } else { leftChild = new Rectangle( top, left, height, split ); rightChild = new Rectangle( top, left+split, height, width-split );        }        return true; //split successful    }    public void generateDungeon() {        if( leftChild != null ) { //if current are has child areas, propagate the call leftChild.generateDungeon(); rightChild.generateDungeon();        } else { // if leaf node, create a dungeon within the minimum size constraints int dungeonTop = (height - MIN_SIZE <= 0) ? 0 : rnd.nextInt( height - MIN_SIZE); int dungeonLeft =  (width - MIN_SIZE <= 0) ? 0 : rnd.nextInt( width - MIN_SIZE); int dungeonHeight = Math.max(rnd.nextInt( height - dungeonTop ), MIN_SIZE );; int dungeonWidth = Math.max(rnd.nextInt( width - dungeonLeft ), MIN_SIZE );; dungeon = new Rectangle( top + dungeonTop, left+dungeonLeft, dungeonHeight, dungeonWidth);        }    }}

这是一个测试类来演示其用法:

import java.util.ArrayList;import java.util.Random;public class GenerateDungeon {    private static Random rnd = new Random();    public static void main(String[] args) {        ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>(); // flat rectangle store to help pick a random one        Rectangle root = new Rectangle( 0, 0, 60, 120 ); //        rectangles.add( root  ); //populate rectangle store with root area        while( rectangles.size() < 19 ) { // this will give us 10 leaf areas int splitIdx = rnd.nextInt( rectangles.size() ); // choose a random element Rectangle toSplit = rectangles.get( splitIdx);  if( toSplit.split() ) { //attempt to split     rectangles.add( toSplit.leftChild );     rectangles.add( toSplit.rightChild ); }        }        root.generateDungeon(); //generate dungeons        printDungeons(rectangles); //this is just to test the output    }    private static void printDungeons(ArrayList<Rectangle> rectangles) {        byte [][] lines = new byte[60][];        for( int i = 0; i < 60; i++ ) { lines[ i ] = new byte[120]; for( int j = 0; j < 120; j++ )     lines[ i ][ j ] =  -1;        }        byte dungeonCount = -1;        for( Rectangle r : rectangles ) { if( r.dungeon == null )     continue; Rectangle d = r.dungeon; dungeonCount++; for( int i = 0; i < d.height; i++ ) {     for( int j = 0; j < d.width; j++ )         lines[ d.top + i ][ d.left+ j ] = dungeonCount; }        }        for( int i = 0; i < 60; i++ ) { for( int j = 0; j < 120; j++ ) {     if( lines[ i ][ j ] == -1 )         System.out.print( '.');     else         System.out.print( lines[ i ][ j ] ); } System.out.println();        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/388385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号