面向对象的设计问题

时间:2010-05-10 23:27:45

标签: oop

我将使用Java(或其他OO语言)开发Tic-Tac-Toe游戏。现在我脑海里想到了一般设计。

接口: 玩家,然后我将能够根据我想要对手的方式实现几个玩家类,例如随机玩家,智能玩家等。

类: Board类,带有二维整数数组,0表示打开,1表示我,-1表示对手。评估函数也将在这里,根据当前的电路板安排返回下一个最佳移动,并且轮到它。

裁判类,它将创建董事会实例和两个玩家实例,然后开始游戏。

这是我的OO设计的粗略概念。请问有人批评我吗?我发现这真的很有益。非常感谢你。

5 个答案:

答案 0 :(得分:8)

当我想到对象结构时,我认为我的方法是做两件事之一:

1)向'对象'询问问题

2)命令'对象'做某事

话虽如此,对我来说,询问“董事会”下一步最佳举措是没有意义的。董事会应该只是持有价值并告诉你它的状态。

我可能会有一个专门用于确定给定“情报”的最佳下一步行动的对象。我们称之为'move_brain'。然后你可以说,“嘿move_brain,鉴于这个板块和这个级别的情报,下一个最好的举动是什么?”

您已经概述的董事会课程现在有许多职责:持有州,允许用户移动,以及考虑如何移动下一步。这太重要了。

毕竟,我会这样说:鉴于这个程序不是很大,几乎任何解决方案都可以。

祝你好运!

答案 1 :(得分:5)

我定义了3个接口:

  • 游戏界面
  • IPlayer界面
  • Board interface

以下是每个班级的简要概述:

游戏:

  • 球员(只能容纳2名球员)
  • board(这可能是其他类或只是2d矩阵)
  • 开始();
  • nextTurn();
  • 重新启动();
  • isEnded();

IP层:

  • onTurn()(这是告诉你轮到你玩的事件)
  • play(int x,int y);
  • onWin()(此事件告诉你赢了)
  • onLose()(你输了)
  • onTie(); (你并列)

您可以运行如下代码:

IPlayer meAsAPlayer = new UserPlayer(); //you'd have to implement this
                                        //as an "empty" class that would let the user
                                        //specify the actions
IPlayer AIPlayer = new AIPlayer(); //one AI class you'd have implemented
Game game = new Game(meAsAPlayer, AIPlayer);
game.start(); //this would run one game to the end
game.start(); //this would be the second game already

这将是游戏类决定哪些游戏是正确的,哪些不会。如果玩家试图进行不正确的游戏,它会阻止它并再次调用该玩家的OnTurn()事件。

或者不是定义IPlayer接口,您可以定义一个APlayer抽象类,它只允许您进行正确的移动。

答案 2 :(得分:1)

我会说使用我和对手进行球员动作并不是很正确。它应该是Xs和Os或者第一和第二个玩家。除此之外,你有一个开始。输入将在何处处理?裁判或在董事会广场或其他地方?另外,在1场比赛之后存在的统计跟踪怎么样?

只是一些想法。

答案 3 :(得分:1)

一般的想法应该是尽可能使对象成为自包含和单一的对象。 这样可以让您更快更紧凑地设计。

另外,不要害怕将最小的作品建模为自己的类实体。如果您可以直接从一开始就从高级建模,那么交互就会简单得多。

答案 4 :(得分:1)

对于其中一个,您需要使用一些符号值(如枚举或常量)来表示电路板中插槽的状态。