Du kannst nicht mehr als 25 Themen auswählen
Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
91 Zeilen
2.5 KiB
Java
91 Zeilen
2.5 KiB
Java
![]()
vor 9 Jahren
|
/*
|
||
|
* To change this license header, choose License Headers in Project Properties.
|
||
|
* To change this template file, choose Tools | Templates
|
||
|
* and open the template in the editor.
|
||
|
*/
|
||
|
package dungeon;
|
||
|
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.LinkedList;
|
||
|
import java.util.List;
|
||
|
import main.Counter;
|
||
|
import main.Dice;
|
||
|
import org.jgraph.graph.DefaultEdge;
|
||
|
import org.jgrapht.UndirectedGraph;
|
||
|
import org.jgrapht.graph.SimpleGraph;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @author MrMcX
|
||
|
*/
|
||
|
public class Dungeon {
|
||
|
private final List<Room> rooms;
|
||
|
private final LinkedList<Room> toGenerate;
|
||
|
private final Counter counter;
|
||
|
|
||
|
public Dungeon(int size, Type isNatural, Mode mode){
|
||
|
rooms = new ArrayList<>();
|
||
|
toGenerate = new LinkedList<>();
|
||
|
counter = new Counter();
|
||
|
generate(size, isNatural, mode);
|
||
|
}
|
||
|
|
||
|
private void generate(int size, Type isNatural, Mode mode){
|
||
|
toGenerate.add(Room.RandomRoom(true, Exit.Start(), counter, isNatural));
|
||
|
while(!toGenerate.isEmpty() && rooms.size() < size){
|
||
|
Room next;
|
||
|
switch(mode){
|
||
|
case STRAIGHT:
|
||
|
next = toGenerate.getLast();
|
||
|
break;
|
||
|
case BRANCHED:
|
||
|
next = toGenerate.getFirst();
|
||
|
break;
|
||
|
case RANDOM:
|
||
|
next = toGenerate.get(Dice.Roll(toGenerate.size(), 1)-1);
|
||
|
break;
|
||
|
default:
|
||
|
next = toGenerate.getFirst();
|
||
|
break;
|
||
|
}
|
||
|
next.generate(counter, isNatural).stream().forEach((r) -> {
|
||
|
toGenerate.add(r);
|
||
|
});
|
||
|
toGenerate.remove(next);
|
||
|
rooms.add(next);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String toString(){
|
||
|
return rooms.stream().map((r) -> r.toLongString() + "\n").reduce("", String::concat);
|
||
|
}
|
||
|
|
||
|
public UndirectedGraph toGraph(){
|
||
|
UndirectedGraph g = new SimpleGraph(DefaultEdge.class);
|
||
|
rooms.stream().forEach((r) -> {
|
||
|
g.addVertex(r);
|
||
|
});
|
||
|
rooms.stream().forEach((r) -> {
|
||
|
for(Exit e : r.exits){
|
||
|
if(e.isStart || e.room.number == 0 || g.containsEdge(r, e.room)){
|
||
|
continue;
|
||
|
}
|
||
|
g.addEdge(r, e.room, e);
|
||
|
}
|
||
|
});
|
||
|
return g;
|
||
|
}
|
||
|
|
||
|
public static enum Mode{
|
||
|
STRAIGHT,
|
||
|
BRANCHED,
|
||
|
RANDOM
|
||
|
}
|
||
|
|
||
|
public static enum Type{
|
||
|
NATURAL,
|
||
|
ARTIFICIAL
|
||
|
}
|
||
|
}
|