[英]Chess game design and Singleton pattern
我目前正在創建由以下課程組成的國際象棋游戲:
我想知道我是否應該使用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.