2010-09-25 202 views
2

我是一個C++程序員,試圖學習設計,作爲一個開始我試圖通過給自己一個任務來製作一個面向對象遊戲的面向對象設計的設計。一個家庭作業q只是試圖發展一些技能。 以下是我腦海中至今爲止的內容總結: 「板塊」課程將把棋子的當前位置保存在棋盤上。 專門的課程「駱駝」「馬」「女王」「騎士」「典當」&「大象」,將從「片」類派生。這些課程中的每一個將持有2個成員,「允許移動的地方的數量」&「移動規則」,並獲取相同的方法。幫助設計一個國際象棋遊戲

一個基礎「玩家」類,將通過類「BlackPiecePlayer」&「WhitePiecePlayer」擴展。這些類中的每一個都將保存另一個名爲「PieceManager」的類實例。「PieceManager」類將決定在板上移動的邏輯。

一個「棋盤」類,它可以保存棋盤上所有棋子的映射,並可以訪問棋子可以移動的一組規則。它將提供接口來驗證由「PieceManager」計算的移動,然後在更新自己的映射時進行移動。

繼承人一個通用的流程,我可以想象。要求一個類「WhitePiecePlayer」進行移動,它會要求其自己的「WhitePieceManager」進行移動。 「WhitePieceManager」將通過使用「Board」類的接口訪問棋盤上的棋子位置。然後,它將使用其內部邏輯來計算一件作品的移動。每件作品存儲它的位置,以便計算該作品的位置。然後通過調用Board類的方法驗證移動是可能的,然後通過使用Board類接口進行移動..等等。

對不起,我只是想開發一種感覺設計,這就是我心目中,現在,你認爲其良好的開端或任何建議,就如何使它更好(如果它是正確的)

回答

1

幾點意見

1)國際象棋prgoram中最重要的是選擇移動的算法。通常它是一個alpha-beta修剪算法。爲了使這個算法高效,棋盤上棋子的表現方式非常重要。您可以在維基百科的implementation issues部分閱讀。我認爲這是董事會代表性的基礎。互聯網上有很多討論,像Crazy或Fruit這樣的開放引擎。我懷疑他們使用面向對象,但我不知道是否有任何面向對象的引擎在野外。

2)什麼是駱駝,大象等?你想代表什麼樣的國際象棋?我對此並不熟悉,對不起。大象是白嘴鴉還是駱駝主教?

3)有兩個不同的類,WhitePlayer和BlackPlayer的效用是什麼?他們與球員有什麼不同?你不應該有兩個不同的Player類的實例,稱爲白色和黑色嗎?

祝您的項目順利。我希望你從中學到很多東西! :)

+0

感謝您的快速回復和祝福。 1.謝謝,我當然會經歷這個,現在我正在考慮更多的設計2.對不起,我想你提到了正確的名稱..我不是一個真正精通國際象棋的遊戲3 。 謝謝!!正確!應該只是玩家的實例! – Ani 2010-09-25 12:13:00

2

一些建議

  • 你的作品相關的類層次結構似乎是合理的(雖然使用了正確的名稱爲塊騎士,魯克和主教很可能是最好馬,駱駝和大象) 。
  • 我不會存儲一塊棋子可以移動的方格數量。如果只是因爲可以根據情況而改變,那麼您會希望將其編碼在「移動規則」方法中。一個棋子可以在其初始移動中移動兩個方塊,然後在後續移動中移動一個方塊。一個國王只能移動一個方塊,除非它是鑄造的。
  • 你的作品類將需要某種方法來獲取所有作品的有效動作列表,以便將這些動作提供給將要選擇動作的引擎。
  • 你不需要BlackPiecePlayer和WhitePiecePlayer類。你只需要實例化Player類的兩個不同實例,並確保有一個「color」屬性。
  • ChessBoard類是一個好主意,需要表示棋子的位置,但它不應該執行邏輯評估棋子。這是移動引擎要做的事情。

正如哈維爾所討論的,構建國際象棋程序可能會涉及到設計一個有效的選擇移動算法的相當多的努力。假設你的意圖是應用面向對象的概念,而不是深入討論如何建立一個象棋引擎(爲了更好的性能,這往往會犧牲面向對象的純度),並假設你想要構建一個足夠好的東西來構建有趣的是,你可能要考慮執行antichess而不是普通的國際象棋。從面向對象的角度來看,它本質上是一個相同的問題,但最終的結果就是在沒有花費數百小時的時間來掌握國際象棋算法的情況下可以很好地運行。這是一個比可怕的國際象棋程序更令人愉快的結果。