2014-12-16 2 views
2

Java에서 A * 알고리즘을 사용하여 Pacman 게임을하고 있습니다. 나는 많은 질문을 수색했다. 나는 한 걸음의 해결책을 찾았다. 하지만 블록 내에서 내 테이블을 새로 고치고 싶습니다. 내 솔루션은 마지막 단계 (결과 표시)에 따라 JTable을 새로 고치기 만합니다 (모든 단계를 계산). 하지만 나는 새로 고침을하면서 Pacman의 장소 (위치)를 단계별로 단계별로 보여주고 싶습니다. Pacmans가 움직이는 것처럼 보입니다. 그러나 나는 할 수 없었다. 내 코드는 다음과 같습니다 : 지연 그냥 아이디어 : 1Java에서 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(); 
    }  
}); 

UPDATE. 알고리즘이 너무 빨리 계산되어 타이머가 실행되지 않을 수 있습니다. 그러나 그것은 작동하지 않았고 또한 타이머가 각각 1 초에 해고된다고 생각하지 않습니까? 여전히 JTable의 마지막 값을 보았습니다.

답변

1

여기서 중요한 문제는 Java GUI 응용 프로그램의 다양한 스레드가 어떻게 작동하는지 이해해야한다는 것입니다. 특히 이벤트 발송 스레드에서 코드를 실행하면 해당 코드가 실행되는 동안 UI가 업데이트되지 않습니다. 귀하의 경우에는 JTable에 여러 번 업데이트 한 다음 디스플레이에 컨트롤을 반환하면 마지막 값이 표시됩니다.

여기 해결책은 타이머의 각 틱에서 알고리즘의 각 단계를 실행하고 그 결과를 표시하는 컨트롤을 반환하는 타이머 요소를 소개하는 것입니다. 자세한 내용은 javax.swing.Timer 클래스를 확인하십시오. 또한 자바 튜토리얼에서 '스윙 타이머 동시 사용'과 '스윙 타이머 사용 방법'섹션을 읽어 보시기 바랍니다.

+0

빠른 응답 감사합니다. 나는 업데이트했다 : 그리고 해결책이 이런 방식이어야한다는 것을 이해했다. 하지만 어디서 실수를하는지 이해할 수 없었습니다. – melomg

관련 문제