類設計方法:以五子棋為例

SXWisON發表於2024-09-16

概述

本篇將討論一下如何進行物件導向程式設計(OOP),並將其分為了提取物件描述物件行為定義欄位和方法設計函式控制代碼等多個步驟。

什麼是物件導向(OOP)?


程序導向程式設計(POP)

  • 基本思想:將程式視為一系列的操作步驟,重點在於如何解決問題,按順序執行這些操作。
  • 結構:程式由函式(或過程)和資料組成,函式透過運算元據來實現功能。
  • 特點:
    1. 順序性:按步驟執行,從上到下逐行執行程式碼。
    2. 模組化:透過函式或過程將功能模組化,易於複用和維護。
    3. 資料與函式分離:資料和運算元據的函式是分開的。

物件導向程式設計(OOP)

  • 基本思想:將程式視為一組物件的集合,每個物件都是類的例項,封裝了資料和操作這些資料的方法。
  • 結構:程式由類和物件組成,類定義了物件的屬性和方法,物件是類的具體例項。
  • 特點:
    1. 封裝:將資料和運算元據的方法封裝在物件中,提供公共介面,隱藏內部實現細節。
    2. 繼承:類可以繼承其他類的屬性和方法,實現程式碼重用和擴充套件。
    3. 多型:不同物件可以以相同的方式響應相同的訊息,提高程式碼的靈活性和可擴充套件性。

類設計流程

提取物件 & 描述物件行為


在五子棋對局中,主要的物件包括玩家裁判棋盤,每個物件的行為可以簡潔地描述如下:

  • 玩家 Agent:分析棋盤上的棋局,制定策略,並在棋盤上選擇最佳位置落子。考慮對手的可能走法,並進行相應的防守或進攻。

  • 裁判 Judge:監督整個對局過程,確保所有玩家遵守遊戲規則。同時裁判需確保棋局狀態的透明度,

  • 棋盤 Chessboard:記錄和維護棋子的位置資料,支援玩家進行棋局分析。棋盤需要持續更新棋子的狀態,並判斷是否出現了五子連珠。

這三個類並不是同級的類,很明顯能看出來,裁判Judge應當是層級更高的類,它在落子過程中負責監督資料的傳遞,確保棋局資訊的透明,通知玩家當前回合,並監督玩家的落子行為等。簡單來說,玩家Agent和棋盤Chessboard都是由裁判Judge進行管理的。

資料在類之間的傳遞過程為:

  1. 裁判從棋盤獲得棋局資訊,並向玩家提供資訊。
  2. 玩家作出決策後,將決策資訊反饋給裁判。
  3. 裁判對玩家的決策進行審查,若合法,則將決策傳遞給 棋盤。
  4. 棋盤執行玩家的決策,並更新棋局狀態,將新的棋局資訊返回給 裁判。
  5. 裁判根據更新的棋局資訊,重複第一步,直至比賽結束。

棋盤 Chessboard


棋盤類主要提供落子、以及訪問資料的功能。

Field

  1. board:棋盤資料
  2. currentPlayer:當前玩家
  3. isGameEnded:遊戲狀態
  4. winner:勝利玩家

Method

  1. getChessboard():獲取棋盤資料
  2. getCurrentplayer():獲取當前玩家
  3. getGameStatus():獲取遊戲狀態
  4. makeMove():落子
  5. reset():重置棋盤

欄位(Field):指類或物件中的變數,儲存資料的地方。也稱為屬性(Property)或成員變數(Member Variable)。
方法(Method):指類或物件中定義的函式,用於操作欄位或實現特定功能。也稱為函式(Function)或成員函式(Member Function)。

Agent 智慧體類


Field

  1. ROI:感興趣區域
  2. player:玩家陣營

Method

  1. decision():決策
  2. #updateROI():更新感興趣區域
  3. #calReward():獲取遊戲狀態
  4. #chooseDecision():選擇決策

帶'#'的表示私有函式

Judge裁判類


Field

  1. chessboard:棋盤資料
  2. agentB:玩家1(執黑)
  3. agentW:玩家2(執白)

Method

  1. game():建立一局遊戲
  2. step():執行一次落子
  3. #end():結束遊戲

相關文章