2

我正在使用 Java 中的 A* 算法做一个吃豆人游戏。我搜索了很多问题。我找到了一步的解决方案。但是我想在while块中刷新我的表,我的解决方案只是根据while(计算所有步骤)中的最后一步(仅显示结果)刷新JTable。但是我想在块中逐步刷新并显示吃豆人的地点(位置)。它必须看起来像吃豆人在移动。但我做不到。我的代码如下:

btnStartGame.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        //randomly placement of Pacmans
        table_1.setValueAt(yellowPacman, locationyellowX, locationyellowY);
        ...calculating heuristics
        //after calculation
        newXYellow =locationyellowX;
        newYYellow =locationyellowY+1;
        nodeYellow = 10 * newXYellow + newYYellow;
        while(heuristics != zero){  
            ...enemy pacmans' movement
            //after enemy pacmans' movement calculating yellow pacman's movement            
            if((newXYellow>=0 && newXYellow<10 && newYYellow>=0 && newYYellow<10) &&  !wallList.contains(nodeYellow)){
                //calculate heuristic again
                manhattanDistance[0][0] = Math.abs(newXYellow-locationblackX[0])+
                              Math.abs(newYYellow-locationblackX[0]);
                manhattanDistance[0][1] = Math.abs(newXYellow-locationblackX[1])+
                              Math.abs(newYYellow-locationblackX[1]);
                manhattanDistance[0][2] = Math.abs(newXYellow-locationblackX[2])+
                              Math.abs(newYYellow-locationblackX[2]);
                fyellow[0] = manhattanDistance[0][0] + manhattanDistance[0][1] + manhattanDistance[0][2];
                selectedNodeXYellow = newXYellow;
                selectedNodeYYellow = newYYellow;
                timer2.start();//updated    
                while(delay != 0)
                    delay--;
                delay = 4000; 
                locationyellowX = selectedNodeXYellow;
                locationyellowY = selectedNodeYYellow;
                nodeYellow = 10 * selectedNodeXYellow+ selectedNodeYYellow;
                timer3.start();//updated
                while(delay != 0)
                    delay--;
                delay = 10000; 
            }//ending if
        }//ending while
    }
}//ending action    
timer2 = new Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        table_1.setValueAt(null, locationyellowX, locationyellowY);//I wanted to delete old moves                
        timer2.stop();
    }    
});
timer3 = new Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        table_1.setValueAt(yellowIcon, locationyellowX, locationyellowY);//here I want to show each moves step by step in while block                
        timer3.stop();
    }    
});

更新 1: 延迟只是一个想法。也许算法计算得太快,无法触发计时器。但它没有用,也不应该每隔一秒触发一次计时器?我仍然看到了 JTable 的最后一个值。

4

1 回答 1

1

我怀疑您的主要问题是您需要了解 Java GUI 应用程序中的各种线程是如何工作的。具体来说,如果您在事件分派线程中执行代码,则在执行该代码时不会对 UI 进行更新。在您的情况下,您正在对 JTable 进行多次更新,然后将控制权返回给显示屏,然后显示屏将显示最后一个值。

这里的解决方案是引入一个计时器元素,它在计时器的每个滴答中执行算法的每个步骤,然后返回控制以显示结果。检查 javax.swing.Timer 类以获取详细信息。我还建议您阅读 Java 教程中的“Swing 中的并发性”和“如何使用 Swing 计时器”部分。

于 2014-12-17T03:55:57.927 回答