2017-05-08 1 views
0

게임 일인 용 작업에서 작업 실행 취소를 구현하려고합니다. 나는 실제 요소를 복사 할 함수 저장을 만들고이 복사본으로 실제 요소를 무시하는 함수로드를 작성했습니다. 하지만 카드로 작업을하기 전에 함수 저장을 호출하면 함수는 값을 저장하지만 이러한 값의 소스가 변경되면 이러한 변수도 변경됩니다.함수에 설정된 변수가 계속 변경됩니다.

이러한 변수는 생성자 전에이 클래스에 설정됩니다

private void save_undo() 
{ 
    undo_card_stack1.add(working_pack1_stack); 
    undo_card_stack2.add(working_pack2_stack); 
.... 

ArrayList<CardStack> undo_card_stack1 = new ArrayList<>(); 

기능 save_undo 같은

public class Game extends javax.swing.JPanel 

단순히이이 같은 값을 취소하려면 값의 실제 상태를 복사

카드 - 카드가있는 모든 작업이 JLabel이되기 전에 함수가 호출됩니다. 나에게 명확하지 않은 점은 save_undo() 호출 후에이 코드 부분을 디버깅 할 때 값이 올바르게 설정되지만 pop 및 push로 작업 한 후 몇 줄 이후에 값을 다시 쓰는 이유입니다. 버튼을 클릭하면

private void start_deckMouseClicked(java.awt.event.MouseEvent evt) {           

    save_undo(); 
    discardPile_card = null; 
    if (!deck.isEmpty()) 
    { 

     discardPile.deck.push(deck.pop()); 
     ... 

기능 부하가 정확히 반대의 통화를 저장하고있다 않습니다 :이었다 후에도 변경하는 working_pack1_stack이 (변경 될 수 있음) 변경 가능한

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {           
    load_undo(); 
} 

답변

1

경우 가능하다 ArrayList에 추가되었습니다. 스택에 대한 참조를 ArrayList에 추가하는 것뿐입니다. 스택을 수정하면 목록을 포함하여 스택을 포함한 모든 위치가 변경됩니다.

스택 개체의 복사본을 만들어 목록에 추가하면 외부 코드에 의해 스택 개체가 변경되는 것을 방지 할 수 있습니다.

+0

감사합니다. 이러한 개체의 복사본을 만드는 가장 빠르고 가장 빠른 방법은 무엇입니까? –

+0

@ TomášDubovský CardStack 클래스의 코드를 보지 않고 말하기가 어렵습니다. ArrayList의 래퍼 인 경우,리스트의 * copy *를 포함한 새로운 CardStack 인스턴스를 작성하면됩니다. – Carcigenicate

+0

@ TomášDubovský 복사를 쉽게 할 수 있도록 CardStack 클래스의 "복사 생성자"를 만듭니다. CardStack을 허용하는 생성자를 만든 다음 생성자가이를 사용하여 복사본을 만들도록합니다. – Carcigenicate

관련 문제