Tested DFS search algorithm.
This commit is contained in:
parent
a3024f6e91
commit
81fb18ab3d
@ -1,5 +1,6 @@
|
|||||||
package ca.recrown.islandsurvivalcraft.pathfinding;
|
package ca.recrown.islandsurvivalcraft.pathfinding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
|
|
||||||
public class DepthFirstSearch {
|
public class DepthFirstSearch {
|
||||||
@ -7,13 +8,15 @@ public class DepthFirstSearch {
|
|||||||
private CoordinateValidatable validatable;
|
private CoordinateValidatable validatable;
|
||||||
private Node startNode;
|
private Node startNode;
|
||||||
private Node endNode;
|
private Node endNode;
|
||||||
|
private ArrayList<Node> checkedNodes;
|
||||||
|
|
||||||
public DepthFirstSearch(CoordinateValidatable validatable) {
|
public DepthFirstSearch(CoordinateValidatable validatable) {
|
||||||
queue = new PriorityQueue<>();
|
queue = new PriorityQueue<>();
|
||||||
this.validatable = validatable;
|
this.validatable = validatable;
|
||||||
|
checkedNodes = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStartNode(int xGoal, int yGoal, int x, int y) {
|
public void Setup(int xGoal, int yGoal, int x, int y) {
|
||||||
startNode = new Node(null, xGoal, yGoal, x, y);
|
startNode = new Node(null, xGoal, yGoal, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,7 +37,8 @@ public class DepthFirstSearch {
|
|||||||
endNode = null;
|
endNode = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConnected() {
|
public boolean buildTree() {
|
||||||
|
checkedNodes.clear();
|
||||||
queue.clear();
|
queue.clear();
|
||||||
Node begin = startNode;
|
Node begin = startNode;
|
||||||
queue.add(begin);
|
queue.add(begin);
|
||||||
@ -51,11 +55,12 @@ public class DepthFirstSearch {
|
|||||||
}
|
}
|
||||||
if (!n.check()) {
|
if (!n.check()) {
|
||||||
for (int i = 0; i < n.child.length; i++) {
|
for (int i = 0; i < n.child.length; i++) {
|
||||||
validatable.validate(n.child[i].x, n.child[i].y);
|
if (validatable.validate(n.child[i].x, n.child[i].y)) {
|
||||||
queue.add(n.child[i]);
|
queue.add(n.child[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,9 +102,24 @@ public class DepthFirstSearch {
|
|||||||
public boolean check() {
|
public boolean check() {
|
||||||
if (!checked) {
|
if (!checked) {
|
||||||
checked = true;
|
checked = true;
|
||||||
|
if (checkedNodes.contains(this)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
checkedNodes.add(this);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof Node) {
|
||||||
|
Node comp = (Node) obj;
|
||||||
|
if (comp.x == this.x && comp.y == this.y) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -140,8 +140,8 @@ public class IslandMapGenerator implements CoordinateValidatable {
|
|||||||
public boolean isSameIsland(int firstBlockX, int firstBlockZ, int secondBlockX, int secondBlockZ) {
|
public boolean isSameIsland(int firstBlockX, int firstBlockZ, int secondBlockX, int secondBlockZ) {
|
||||||
if (!isIsland(firstBlockX, firstBlockZ)) return false;
|
if (!isIsland(firstBlockX, firstBlockZ)) return false;
|
||||||
if (!isIsland(secondBlockX, secondBlockZ)) return false;
|
if (!isIsland(secondBlockX, secondBlockZ)) return false;
|
||||||
dfs.setStartNode(secondBlockX, secondBlockZ, firstBlockX, firstBlockZ);
|
dfs.Setup(secondBlockX, secondBlockZ, firstBlockX, firstBlockZ);
|
||||||
boolean res = dfs.isConnected();
|
boolean res = dfs.buildTree();
|
||||||
dfs.deleteTree();
|
dfs.deleteTree();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
package ca.recrown.islandsurvivalcraft;
|
|
||||||
|
|
||||||
import junit.framework.Test;
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
import junit.framework.TestSuite;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unit test for simple App.
|
|
||||||
*/
|
|
||||||
public class AppTest
|
|
||||||
extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Create the test case
|
|
||||||
*
|
|
||||||
* @param testName name of the test case
|
|
||||||
*/
|
|
||||||
public AppTest( String testName )
|
|
||||||
{
|
|
||||||
super( testName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the suite of tests being tested
|
|
||||||
*/
|
|
||||||
public static Test suite()
|
|
||||||
{
|
|
||||||
return new TestSuite( AppTest.class );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rigourous Test :-)
|
|
||||||
*/
|
|
||||||
public void testApp()
|
|
||||||
{
|
|
||||||
assertTrue( true );
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,103 @@
|
|||||||
|
package ca.recrown.islandsurvivalcraft.pathfinding;
|
||||||
|
|
||||||
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for simple App.
|
||||||
|
*/
|
||||||
|
public class DepthFirstSearchTest extends TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
private class Validator implements CoordinateValidatable {
|
||||||
|
private boolean[][] map;
|
||||||
|
|
||||||
|
public Validator(boolean[][] map) {
|
||||||
|
this.map = map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean validate(int x, int y) {
|
||||||
|
try {
|
||||||
|
return map[y][x];
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean[][] mapA = new boolean[][] {
|
||||||
|
{true, true},
|
||||||
|
{true, false},
|
||||||
|
{true, true}
|
||||||
|
};
|
||||||
|
|
||||||
|
private boolean[][] mapB = new boolean[][] {
|
||||||
|
{true, true, true, true},
|
||||||
|
{true, false, false, false},
|
||||||
|
{true, true, true, true}
|
||||||
|
};
|
||||||
|
|
||||||
|
private boolean[][] mapC = new boolean[][] {
|
||||||
|
{true, true, true, true},
|
||||||
|
{false, false, false, false},
|
||||||
|
{true, true, true, true}
|
||||||
|
};
|
||||||
|
|
||||||
|
private boolean[][] mapD = new boolean[][] {
|
||||||
|
{true, true, true, true},
|
||||||
|
{false, false, false, true},
|
||||||
|
{true, true, true, true},
|
||||||
|
{true, false, false, false},
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the test case
|
||||||
|
*
|
||||||
|
* @param testName name of the test case
|
||||||
|
*/
|
||||||
|
public DepthFirstSearchTest( String testName )
|
||||||
|
{
|
||||||
|
super( testName );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the suite of tests being tested
|
||||||
|
*/
|
||||||
|
public static Test suite()
|
||||||
|
{
|
||||||
|
return new TestSuite( DepthFirstSearchTest.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDFSMapAValid()
|
||||||
|
{
|
||||||
|
DepthFirstSearch dfs = new DepthFirstSearch(new Validator(mapA));
|
||||||
|
dfs.Setup(1, 0, 1, 2);
|
||||||
|
assertTrue(dfs.buildTree());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDFSMapBValid()
|
||||||
|
{
|
||||||
|
DepthFirstSearch dfs = new DepthFirstSearch(new Validator(mapB));
|
||||||
|
dfs.Setup(3, 2, 3, 0);
|
||||||
|
assertTrue(dfs.buildTree());
|
||||||
|
}
|
||||||
|
public void testDFSMapDValid()
|
||||||
|
{
|
||||||
|
DepthFirstSearch dfs = new DepthFirstSearch(new Validator(mapD));
|
||||||
|
dfs.Setup(0, 3, 0, 0);
|
||||||
|
assertTrue(dfs.buildTree());
|
||||||
|
}
|
||||||
|
public void testDFSInvalid()
|
||||||
|
{
|
||||||
|
DepthFirstSearch dfs = new DepthFirstSearch(new Validator(mapC));
|
||||||
|
dfs.Setup(3, 2, 3, 0);
|
||||||
|
assertFalse(dfs.buildTree());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user