概述
本篇将讨论一下如何进行面向对象编程(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()
:结束游戏