帮助设计国际象棋游戏

时间:2010-09-25 11:55:14

标签: oop

我是一名C ++程序员,试图学习设计,作为一个开始,我试图通过给自己设计一个国际象棋游戏的OO设计来完成设计。这不是一个功课q只是试图发展一些技能。 以下是到目前为止我的想法总结: “Piece”类,用于保持棋子在棋盘上的当前位置。 专业课“骆驼”“马”“女王”“骑士”“典当”& “大象”将来自“片断”类。这些课程中的每一个都将容纳2名成员,“不允许移动的地方”和“移动规则”并获取检索相同的方法。

一个基础“玩家”类,将由“BlackPiecePlayer”和“BlackPiecePlayer”类扩展。 “WhitePiecePlayer”。这些类中的每一个都将包含另一个名为“PieceManager”的类实例。“PieceManager”类将决定在棋盘上移动棋子的逻辑。

“ChessBoard”类,它将保存棋盘上所有棋子的映射,并可以访问可以移动棋子的规则集。它将提供接口来验证由“PieceManager”计算的移动,然后在更新自己的映射时进行移动。

这是我可以想象的通用流程。要求一个类“WhitePiecePlayer”进行移动,它会要求自己的“WhitePieceManager”进行移动。 “WhitePieceManager”将使用“Board”类的接口访问板上件的位置。然后它将使用其内部逻辑来计算一个棋子的移动。每个棋子都存储它的位置,以便计算该棋子的位置。然后通过调用Board类的方法验证移动是否可行,然后使用Board类接口进行移动......等等。

对不起,长期以来,我只是想设计一种感觉,这就是我现在想到的,你认为它有利于一个开始或任何关于如何使其更好的建议(如果这是正确的)

2 个答案:

答案 0 :(得分:2)

一些建议

  • 你的作品相关类的层次结构似乎是合理的(尽管使用Knight,Rook和Bishop作品的专有名称可能比Horse,Camel和Elephant更可取。)
  • 我不会存储一块允许移动的方格数。您可能希望在“运动规则”方法中对其进行编码,只是因为它可以根据情况而改变。一个棋子可以在其初始移动时移动两个方格,然后在随后的移动中移动一个方格。除非是铸造,否则国王只能移动一个方格。
  • 您的作品类需要有某种方法来获取所有作品的有效动作列表,以便将这些动作提供给将要选择动作的引擎。
  • 您不需要BlackPiecePlayer和WhitePiecePlayer类。您只需要实例化Player类的两个不同实例,并确保存在“颜色”属性。
  • ChessBoard类是一个好主意,需要表示各个部分的位置,但它不应该实现逻辑评估动作。这是移动引擎要做的事情。

正如Javier所讨论的那样,建立国际象棋程序可能需要花费大量精力来设计一种有效的选择移动算法。假设您的目的是应用OO概念,而不是深入研究如何构建国际象棋引擎(这通常会牺牲OO纯度以获得更好的性能),并假设您想要构建一些可以发挥得足够好的东西。有趣的是,您可能需要考虑实施antichess而不是常规国际象棋。从OO的角度来看,它本质上是一个相同的问题,但最终的结果是在没有投入数百小时掌握国际象棋算法的情况下相当不错。这比一个非常糟糕的国际象棋程序更令人愉快。

答案 1 :(得分:1)

一些评论

1)国际象棋史上最重要的是选择移动的算法。通常它是alpha-beta修剪算法。为了使该算法有效,表示板中的部件的方式非常重要。您可以在维基百科的implementation issues部分中阅读该内容。我读过这个板块表示的基础。互联网上有很多讨论,还有Crazy或Fruit等开放引擎。我怀疑他们是否使用OO - 我不知道是否有任何面向对象的引擎。

2)骆驼,大象等是什么?你想用什么样的国际象棋代表?抱歉,我对此不熟悉。大象是车主和骆驼主教吗?

3)有两个不同的类,WhitePlayer和BlackPlayer有什么用处?他们会以哪种方式与玩家不同?你不应该有两个不同的Player类实例,叫做白色和黑色吗?

祝你的项目好运。我希望你能从中学到很多东西! :)