我的问题是,为了创建我的吃豆人游戏板,我正在使用一个一维数组,但我想实现BFS算法到幽灵上,并且据我理解,除非我有一个带有节点和边的图形,否则我无法执行该算法...因此在我的代码中,我正在尝试将一个新创建的二维数组转换为哈希映射,并使用键(节点)的迭代器,该节点包含“值”,即棋盘上的特定索引。我希望我走在正确的道路上,但我正在为此苦苦挣扎。
package pacman;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.Collectors;
import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.DefaultUndirectedGraph;
import org.jgrapht.graph.SimpleWeightedGraph;
/**
* This class is used to create a graph from a 2d array
*
* @author Kody Berry
*
*/
public class GraphCreation {
private final static short levelData[] = { 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 22, 17, 16, 16, 16, 16,
24, 16, 16, 16, 16, 16, 16, 16, 16, 20, 25, 24, 24, 24, 28, 0, 17, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0,
0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 20, 19, 18, 18, 18, 18, 18, 16, 16, 16, 16, 24, 24, 24, 24, 20, 17,
16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21, 17, 16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21,
17, 16, 16, 16, 24, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21, 17, 16, 16, 20, 0, 17, 16, 16, 16, 16, 18, 18, 18,
18, 20, 17, 24, 24, 28, 0, 25, 24, 24, 16, 16, 16, 16, 16, 16, 20, 21, 0, 0, 0, 0, 0, 0, 0, 17, 16, 16, 16,
16, 16, 20, 17, 18, 18, 22, 0, 19, 18, 18, 16, 16, 16, 16, 16, 16, 20, 17, 16, 16, 20, 0, 17, 16, 16, 16,
16, 16, 16, 16, 16, 20, 17, 16, 16, 20, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 20, 25, 24, 24, 24, 26, 24,
24, 24, 24, 24, 24, 24, 24, 24, 28 };
public static Graph<Integer, DefaultEdge> undirectedGraph = new DefaultUndirectedGraph<Integer, DefaultEdge>(
DefaultEdge.class);
public static Graph<Integer, DefaultEdge> createGraph(int[][] s) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int k = 1;
// Getting an iterator
Iterator<?> mapIterator = map.entrySet().iterator();
// Adding values to hash map
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s[i].length; j++) {
if (s[i][j] == 16) {
map.put(k, s[i][j]);
k++;
}
}
}
while (mapIterator.hasNext()) {
Map.Entry mapElement = (Map.Entry)mapIterator.next();
int t = (int) mapElement.getKey();
undirectedGraph.addVertex(t);
}
return undirectedGraph;
}
/**
* Method used to convert the 1d array game board to a 2d array board
*
* @param s
* @return
*/
public static int[][] oneDtoTwoDConverter(short[] s) {
int array2d[][] = new int[15][15];
for(int i=0; i<15;i++)
for(int j=0;j<15;j++)
array2d[i][j] = s[(j*15) + i];
return array2d;// Returns new 2d array.
}
// Test output
public static void main(String[] args) {
int[][] s = oneDtoTwoDConverter(levelData);
System.out.println(createGraph(s));
}
}
目前我的输出如下。
([], [])
我也在使用JGraphT库,但还没有弄清如何创建边,如果您对此有任何建议,我将非常感激。
PS. 如果您有更好的想法,请告诉我!谢谢 :)
for (int i = 1; i <= k; i++) undirectedGraph.addVertex(i)
将完全相同,或者你可以直接将计数器放入图形中,并省去第二个循环。也许保存位置会更有帮助,但我承认我不知道在这个图形库中应该在哪里保存它,因为我不知道你代码的其余部分和这个图形库。 - Christian