Fixes issue #2

This commit is contained in:
joachimschmidt557 2019-02-15 15:01:48 +01:00
parent ae2c6c321f
commit 526d15f2c7
3 changed files with 40 additions and 14 deletions

View file

@ -1,6 +1,8 @@
package base; package base;
import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
@ -80,7 +82,9 @@ public class Graph<T> {
*/ */
public List<T> getAllValues() { public List<T> getAllValues() {
return nodes.stream().map(x -> x.getValue()).collect(Collectors.toList()); return nodes.stream()
.map(x -> x.getValue())
.collect(Collectors.toList());
} }
@ -93,7 +97,9 @@ public class Graph<T> {
*/ */
public List<Edge<T>> getEdges(Node<T> node) { public List<Edge<T>> getEdges(Node<T> node) {
return edges.stream().filter(x -> x.getNodeA().equals(node)).collect(Collectors.toList()); return edges.stream()
.filter(x -> x.getNodeA().equals(node) || x.getNodeB().equals(node))
.collect(Collectors.toList());
} }
@ -137,29 +143,33 @@ public class Graph<T> {
final Node<T> firstNode = nodes.get(0); final Node<T> firstNode = nodes.get(0);
ArrayList<Node<T>> allVisitedNodes = new ArrayList<Node<T>>(); HashSet<Node<T>> allVisitedNodes = new HashSet<Node<T>>();
ArrayList<Node<T>> nextVisitNodes = new ArrayList<Node<T>>(); ArrayDeque<Node<T>> nextVisitNodes = new ArrayDeque<Node<T>>();
allVisitedNodes.add(firstNode); allVisitedNodes.add(firstNode);
nextVisitNodes.addAll(getEdges(firstNode).stream() nextVisitNodes.addAll(getEdges(firstNode).stream()
.map(x -> x.getNodeB()) .map(x -> x.getOtherNode(firstNode))
.filter(x -> !allVisitedNodes.contains(x)) .filter(x -> !allVisitedNodes.contains(x))
.collect(Collectors.toList())); .collect(Collectors.toList()));
while (nextVisitNodes.size() > 0) { while (!nextVisitNodes.isEmpty()) {
allVisitedNodes.add(nextVisitNodes.get(0)); final Node<T> nextNode = nextVisitNodes.removeFirst();
nextVisitNodes.addAll(getEdges(nextVisitNodes.get(0)).stream() allVisitedNodes.add(nextNode);
.map(x -> x.getNodeB())
nextVisitNodes.addAll(getEdges(nextNode).stream()
.map(x -> x.getOtherNode(nextNode))
.filter(x -> !allVisitedNodes.contains(x)) .filter(x -> !allVisitedNodes.contains(x))
.collect(Collectors.toList())); .collect(Collectors.toList()));
nextVisitNodes.remove(0);
} }
System.out.println(allVisitedNodes.size());
System.out.println(nodes.size());
return allVisitedNodes.size() == nodes.size(); return allVisitedNodes.size() == nodes.size();
} }
} }

View file

@ -8,6 +8,7 @@ import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* Diese Klasse representiert das Spielfeld. Sie beinhaltet das Hintergrundbild, welches mit Perlin noise erzeugt wurde, * Diese Klasse representiert das Spielfeld. Sie beinhaltet das Hintergrundbild, welches mit Perlin noise erzeugt wurde,
@ -153,15 +154,30 @@ public class GameMap {
private void generateEdges() { private void generateEdges() {
List<Node<Castle>> castleNodes = castleGraph.getNodes(); List<Node<Castle>> castleNodes = castleGraph.getNodes();
/*
for (int i = 0; i < castleNodes.size(); i++) { for (int i = 0; i < castleNodes.size(); i++) {
if (i == castleNodes.size() - 1) if (i == castleNodes.size() - 1)
castleGraph.addEdge(castleNodes.get(i), castleNodes.get(0)); castleGraph.addEdge(castleNodes.get(i), castleNodes.get(0));
else else
castleGraph.addEdge(castleNodes.get(i), castleNodes.get(i+1)); castleGraph.addEdge(castleNodes.get(i), castleNodes.get(i+1));
}*/
final double radius = 300.0;
for (Node<Castle> cast : castleNodes) {
for (Node<Castle> c : allCastlesInRadius(cast, castleNodes, radius))
castleGraph.addEdge(cast, c);
} }
} }
private List<Node<Castle>> allCastlesInRadius(Node<Castle> castle, List<Node<Castle>> allCastles, double r) {
return allCastles.stream()
.filter(x -> x.getValue().distance(castle.getValue()) <= r)
.collect(Collectors.toList());
}
/** /**
* Hier werden die Burgen in Königreiche unterteilt. Dazu wird der {@link Clustering} Algorithmus aufgerufen. * Hier werden die Burgen in Königreiche unterteilt. Dazu wird der {@link Clustering} Algorithmus aufgerufen.

View file

@ -21,7 +21,7 @@ public class GraphConnectionTest {
testGraph.addEdge(a, b); testGraph.addEdge(a, b);
testGraph.addEdge(a, c); testGraph.addEdge(a, c);
testGraph.addEdge(c, d); testGraph.addEdge(d, c);
assertTrue(testGraph.allNodesConnected()); assertTrue(testGraph.allNodesConnected());