2016-04-11 20 views
0

Java acemi, .....Java Stack Kullanımı algılamak için en iyi ben izolasyon üzerinde çalıştığım bir sorunu yaklaşım konusunda geribildirim takdir ediyorum

temel bir oyunumu oluşturmak için çalışılıyor aramaları Bir oyuncu bir ızgara/tahta etrafında hareket eder. Yukarı/aşağı/sola/sağa yöntemleri (örn. Public void playerMovesUp() vb) var ve geri al/yinele hareket işlevselliğini uygulamaya koyması gerekiyor, böylece bir oyuncu x adımını tekrar izleyebilir ve daha sonra oyun sırasında herhangi bir noktada x numarasını tekrar alabilir .

Bunu yapmak için, örneğin yukarı/aşağı/sol/sağ yöntem çağrılarının sırasını kaydetmek ve sonra her ikisini de ters sırayla (geri al) yeniden çağırmak ve sonra yeniden yapmak için yollar aradık.

Yığın veya sıra toplama mantıklı görünüyor .... ve ayrıca java.lang.Thread.getStackTrace() hakkında okudukları java yığın belleğini de işlev çağrılarının sırasını saklıyorlar.

Geçerli düşünceler ..... Bu dört yöntemi tek bir iş parçacığına ayırırsam, bir diziyi döndürmek için java.lang.Thread.getStackTrace() yöntemini kullanabilir ve bir şekilde getMethodName() öğesini arayabilir, sonra da bir şekilde uygulanabilir sırayla yöntemler?

Ayrıca, bir sıra/yöntem çağrısı yığını depolamak mümkün mü?

Doğru yolda olduğumu hissediyorum, ama son öneri biraz dağınık/mantıksız görünüyor! Herhangi bir işaretçi/tavsiye takdir edilecektir.

+0

Java 'Yığını - https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html – brso05

+0

genellikle, biri uygulamak için Komut-Desenini kullanarak farklı Sınıflardaki eylemleri tasarlar. (bkz. http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine) –

+0

Hareketlerinizi "Stack" yani "right" "left" "yukarı" "aşağı" olarak kaydedin ... geriye doğru hareket etmek istediğinizde, sadece 'Stack' öğesinin üst öğesini tut ve tersini yap. 'Halinde (topElement.equalsIgnoreCase) ("sağ") {MoveLeft();} '. – brso05

cevap

1

Bunun için Yığını kullanamazsınız. Metodun kendine ait aramalarını takip etmelisin. Ve hayır, "yöntem çağrılarını" bir Koleksiyona kaydedemezsiniz.

Bunun yerine, her bir sınıfın bir do ve bir undo uyguladığı eylemleriniz için sınıflar tasarlamak daha kolay olurdu. Bu sınıfların örnekleri daha sonra bir Stack veya Queue'da saklanabilir. Kullanıcı eylemlerini geri almak isterse, geriye doğru işleyebilir ve tüm öğeleri geri çağırma işlemini geri alabilirsiniz. Bu örüntü Komut Kalıbı olarak bilinir (bkz. Ör., Design Pattern for Undo Engine)

+0

Teşekkürler Raphael. Her bir eylem için yeni bir sınıf oluşturmuş olsaydım (yukarı/aşağı vb) ve bir oyuncu bir ızgara alanı her hareket ettirdiğinde bir nesne üretirse, oyuncudan her seferinde yalnızca bir dize eklemekten çok daha verimsiz olmaz mıydı? yığınıma mı taşınır? Bu yüzden bir yığın "sol", "yukarı", "sağ", "yukarı" vb. Var. Aksi halde, bir oyuncunun kaç kez bir kısıtlaması olmadığı için yığınımda çok miktarda nesne ile sonuçlanabilir. hareket. Ne düşünüyorsun? – javapalava

2

Yığını böyle kullanmayın. Bunun için böyle değil. Sadece çektiğiniz adımların listesini tutun ve bu listeyi kullanarak adımlarınızı tekrar gözden geçirin.

İlgili konular