将2D数组转换成带有节点和边的图形

3
我的问题是,为了创建我的吃豆人游戏板,我正在使用一个一维数组,但我想实现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. 如果您有更好的想法,请告诉我!谢谢 :)

1个回答

0

可能还有更多的问题,但对我来说最明显的是,在填充地图之前创建了迭代器。当你遍历它时,它会给你填充之前的内容,所以它是空的。

如果你把 Iterator<?> mapIterator = map.entrySet().iterator(); 移到循环下面,应该会发生更多的事情。

但是这个检查 "s[i][j] == 16" 看起来有点可疑,但我还没有想透彻,但不知怎么的,我期望你的地图看起来像 {1: 16, 2: 16, 3: 16, ...},用 Python 的术语来写。


16是Pacman吃掉一个豆子的位置。当它被吃掉后,该方格的值变为15,那么你觉得我应该把索引位置作为地图的值吗? - Kody Berry
重点是现在你有一种非常复杂的计算16的方法。像这样,你甚至不需要使用地图,因为你只需使用密钥,每16个密钥就会增加一次,所以 for (int i = 1; i <= k; i++) undirectedGraph.addVertex(i) 将完全相同,或者你可以直接将计数器放入图形中,并省去第二个循环。也许保存位置会更有帮助,但我承认我不知道在这个图形库中应该在哪里保存它,因为我不知道你代码的其余部分和这个图形库。 - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接