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.
97 Zeilen
2.6 KiB
Java
97 Zeilen
2.6 KiB
Java
/*
|
|
* 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 type, Mode mode){
|
|
rooms = new ArrayList<>();
|
|
toGenerate = new LinkedList<>();
|
|
counter = new Counter();
|
|
generate(size, type, mode);
|
|
}
|
|
|
|
private void generate(int size, Type type, Mode mode){
|
|
toGenerate.add(Room.RandomRoom(true, Exit.Start(), counter, type));
|
|
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, type).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 boolean Natural(Type n){
|
|
return (n == Type.NATURAL || n == Type.EXP_NATURAL);
|
|
}
|
|
|
|
public static enum Mode{
|
|
STRAIGHT,
|
|
BRANCHED,
|
|
RANDOM,
|
|
}
|
|
|
|
public static enum Type{
|
|
NATURAL,
|
|
ARTIFICIAL,
|
|
EXP_NATURAL,
|
|
EXP_ARTIFICIAL
|
|
}
|
|
}
|