类设计方法:以五子棋为例

概述

本篇将讨论一下如何进行面向对象编程(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():结束游戏
posted @   SXWisON  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示