概述
本篇將討論一下如何進行物件導向程式設計(OOP),並將其分為了提取物件、描述物件行為、定義欄位和方法、設計函式控制代碼等多個步驟。
什麼是物件導向(OOP)?
程序導向程式設計(POP)
- 基本思想:將程式視為一系列的操作步驟,重點在於如何解決問題,按順序執行這些操作。
- 結構:程式由函式(或過程)和資料組成,函式透過運算元據來實現功能。
- 特點:
- 順序性:按步驟執行,從上到下逐行執行程式碼。
- 模組化:透過函式或過程將功能模組化,易於複用和維護。
- 資料與函式分離:資料和運算元據的函式是分開的。
物件導向程式設計(OOP)
- 基本思想:將程式視為一組物件的集合,每個物件都是類的例項,封裝了資料和操作這些資料的方法。
- 結構:程式由類和物件組成,類定義了物件的屬性和方法,物件是類的具體例項。
- 特點:
- 封裝:將資料和運算元據的方法封裝在物件中,提供公共介面,隱藏內部實現細節。
- 繼承:類可以繼承其他類的屬性和方法,實現程式碼重用和擴充套件。
- 多型:不同物件可以以相同的方式響應相同的訊息,提高程式碼的靈活性和可擴充套件性。
類設計流程
提取物件 & 描述物件行為
在五子棋對局中,主要的物件包括玩家、裁判和棋盤,每個物件的行為可以簡潔地描述如下:
-
玩家 Agent:分析棋盤上的棋局,制定策略,並在棋盤上選擇最佳位置落子。考慮對手的可能走法,並進行相應的防守或進攻。
-
裁判 Judge:監督整個對局過程,確保所有玩家遵守遊戲規則。同時裁判需確保棋局狀態的透明度,
-
棋盤 Chessboard:記錄和維護棋子的位置資料,支援玩家進行棋局分析。棋盤需要持續更新棋子的狀態,並判斷是否出現了五子連珠。
這三個類並不是同級的類,很明顯能看出來,裁判Judge應當是層級更高的類,它在落子過程中負責監督資料的傳遞,確保棋局資訊的透明,通知玩家當前回合,並監督玩家的落子行為等。簡單來說,玩家Agent和棋盤Chessboard都是由裁判Judge進行管理的。
資料在類之間的傳遞過程為:
- 裁判從棋盤獲得棋局資訊,並向玩家提供資訊。
- 玩家作出決策後,將決策資訊反饋給裁判。
- 裁判對玩家的決策進行審查,若合法,則將決策傳遞給 棋盤。
- 棋盤執行玩家的決策,並更新棋局狀態,將新的棋局資訊返回給 裁判。
- 裁判根據更新的棋局資訊,重複第一步,直至比賽結束。
棋盤 Chessboard
棋盤類主要提供落子、以及訪問資料的功能。
Field
board
:棋盤資料currentPlayer
:當前玩家isGameEnded
:遊戲狀態winner
:勝利玩家
Method
getChessboard()
:獲取棋盤資料getCurrentplayer()
:獲取當前玩家getGameStatus()
:獲取遊戲狀態makeMove()
:落子reset()
:重置棋盤
欄位(Field):指類或物件中的變數,儲存資料的地方。也稱為屬性(Property)或成員變數(Member Variable)。
方法(Method):指類或物件中定義的函式,用於操作欄位或實現特定功能。也稱為函式(Function)或成員函式(Member Function)。
Agent 智慧體類
Field
ROI
:感興趣區域player
:玩家陣營
Method
decision()
:決策#updateROI()
:更新感興趣區域#calReward()
:獲取遊戲狀態#chooseDecision()
:選擇決策
帶'#'的表示私有函式
Judge裁判類
Field
chessboard
:棋盤資料agentB
:玩家1(執黑)agentW
:玩家2(執白)
Method
game()
:建立一局遊戲step()
:執行一次落子#end()
:結束遊戲