我正在使用Java中的A *算法进行Pacman游戏。我搜索了很多问题。我找到了一步的解决方案。但我想在块中刷新我的表,我的解决方案是根据最后一步(只显示结果)刷新JTable(计算所有步骤)。但我希望刷新并逐步显示Pacman的位置(位置)。它必须看起来像Pacmans正在移动。但我无法做到。我的代码如下:
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的最后一个值。
答案 0 :(得分:1)
我怀疑你的主要问题是你需要了解Java GUI应用程序中的各种线程是如何工作的。具体来说,如果您在事件调度线程中执行代码,则在执行该代码时将不会对UI进行更新。在您的情况下,您正在对JTable进行多次更新,然后将控件返回到显示器,然后显示最后一个值。
这里的解决方案是引入一个计时器元素,在计时器的每个刻度中执行算法的每一步,然后返回控件以显示结果。有关详细信息,请查看javax.swing.Timer类。我还建议您阅读Java教程中的“Swing中的并发性”和“如何使用Swing Timers”部分。