簡體   English   中英

象棋游戲設計和辛格爾頓模式

[英]Chess game design and Singleton pattern

我目前正在創建由以下課程組成的國際象棋游戲:

  • ChessPiece-對於所有各種棋子,由一個MovementBehaviour實例變量組成
  • MovementBehaviour-由PawnMovementBehaviour,KingMovementBehaviour等類實現的接口,用於定義每種棋子類型如何移動
  • ChessBoard-由ChessPiece [] [] 2D數組組成,具有addPiece()/ removePiece()/ replacePiece()等功能
  • 播放器 -小類有助於將哪些作品屬於哪個人類玩家
  • 游戲 -主要類別是從要求玩家提供他們的名字和所需的棋子顏色開始,然后通過實例化一個國際象棋棋盤並讓玩家輪流移動直到到達死敵來運行游戲。

我想知道我是否應該使用Singleton模式(關於ChessBoard類)? 目前我還不是,我正在將ChessBoard實例傳遞給棋子移動功能,以便棋子可以了解其周圍環境。 這是因為當然可以根據棋盤上隨時占用/空出的空間來認為移動是合法的。

單例很少是一個好主意。 我最近剛開始一個類似的項目,所以我將從目前的經驗中回答。

我實現它的方法是考慮一個棋盤一組Location對象,其中一個位置保存一個X值, Y值和一個Piece對象。 只有相關的地方會被填充,甚至沒有被追蹤的地方。

您似乎想知道是否應該將單例用於驗證的單個目的。 完成移動后,您需要驗證很多很多事情:您可以那樣移動嗎? 在檢查嗎 它是被動的嗎? 是Rochade嗎? 等等

您可以做的是創建一堆驗證方法,將棋盤,起始位置和終止位置作為參數。 這樣,您便擁有檢查移動是否有效所需的所有信息。 這確實需要作品知道它們自己的屬性:我該如何移動? 我的顏色是什么?

擁有所有這些功能之后,您可以實施不同的驗證邏輯來​​進行操作。

當您僅提取驗證並傳遞棋盤時,使用單例將非常麻煩。 測試也將變得更加困難(好的測試絕對是您在國際象棋游戲中想要的東西)。

我的設置如下所示:

Chessboard.CanMoveToLocation(int startX, int startY, int endX, int endY) {
    // Call validators with local field chessboard and given location objects
}

每個驗證器將返回一個自定義的枚舉ValidationResult以指示此特定驗證器是允許還是禁止它。

您必須確保以正確的順序調用了驗證器(在檢查是否有效之后再返回false並不是一個好主意:他可能一直在游盪或殺死通行者)。 或者,您當然可以合並相關的驗證器。

您是否應該看一看: 我當前(尚未完成)的實現

根據我的經驗,在這種情況下,我寧願使用觀察者模式。 ChessBoard類扮演Observer角色,而ChessPiece應該是一個抽象類,它是Subject類。 您可能想看看觀察者模式及其用法

當您拿起一塊棋子進行移動時,這意味着該棋子的位置已更改,並且該棋子將通知董事會以檢查該移動是否有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM