gpt4 book ai didi

java - 国际象棋引擎。可以将板对象引用传递给一 block 吗?

转载 作者:行者123 更新时间:2023-11-30 07:01:40 26 4
gpt4 key购买 nike

我正在创建一个国际象棋引擎。我有 Piece 接口(interface),Rook,Bishop 等实现了这个类。我的棋盘是 Piece[][] 数组。假设白人玩家想要移动他的主教。我将目的地坐标和板引用传递给主教。主教检查,如果目的地在同一条对角线上,那么它会询问棋盘在他的位置和目的地广场之间是否没有任何棋子。从 OOP 的角度来看可以这样做吗?谢谢

最佳答案

这有点微妙。

OOP 的观点

从 OOP 的角度来看,有人可能会质疑 Board 是否首先应该是一个 Piece[][] 数组。这里一个漂亮、干净、面向对象的设计可能会涉及类似

interface Board {
Piece get(int r, int c);

// Should this be here? See below...
void set(int r, int c, Piece p);
}

然后,一个关键问题是:主教是否会将“自己”放置在给定棋盘的目标位置上?或者,专注于 OOP 点:提供给棋子的棋盘是可变还是“只读”?可以想象一个 MaliciousBishop 类,当它获得 Board 时,通过将自己置于国王的位置来暗杀对手的国王。

从非常高层次、抽象的 OOP 观点来看,人们可能会质疑 Piece 是否应该具有任何智能。 Piece 是一 block 哑塑料。它对国际象棋规则一无所知。 (玩家)可以将棋子放在任何地方,遵守或忽略国际象棋规则。因此,遵守甚至检查任何规则当然不是作品的工作。可以说,遵守规则是对玩家的期望,而强制遵守规则是上位智能的工作(也许是一些“ChessGameManager”类)。

一种似乎(!)适用于 OO 国际象棋实现的简单方法是拥有像这样的类

abstract class Piece {
Color getColor() { ... }
Point getPosition() { ... }

abstract void doMove(...) { ... }
}

class Bishop extends Piece {
void doMove(....) { ... }
}

// + other classes extending "Piece"

但请注意,这可能并不总是最好的方法,而且可能并不总是足够的。特别是,您应该非常清楚地了解您的引擎、您的Board、您的Piece 和您的Player 类交互以及它们的职责是什么。 (考虑一段时间后,您可能会得出这样的结论:您还需要一个 Move 类...)。一般而言,检查移动是否有效比乍一看要复杂得多。您提到过,对于 Bishop 移动,您检查目标位置是否有效,并且中间没有其他棋子。但如果此棋导致己方国王被制止,此棋仍然无效。这只能由“引擎”来检查,而很难由作品本身来检查。人们容易忘记的其他事情(涉及整个游戏状态的信息,因此很难由单个 Piece 处理)是 CastlingEn passant Action 。

国际象棋引擎的观点

对于国际象棋引擎,有几个要求使得一个好的、面向对象的方法特别困难。如果您打算编写一个高效的国际象棋引擎,那么您的棋盘很可能是一个 long 值数组,这些值通过按位操作进行操作....

(旁注:如果您将 Board 类设计为 interface,如上所示,那么您仍然可以保留一个漂亮的高级对象面向查看这种用于引擎本身的高度性能优化表示。我的经验法则是:始终在开始时将所有内容建模为接口(interface)。之后很容易使其更具体)


所以要看你要不要写

  • 一个漂亮的、面向对象的国际象棋,适合两个人类棋手,带有规则检查或
  • 国际象棋引擎

您可能希望以不同的方式处理游戏设计的某些部分。


编辑:当您在寻找有关国际象棋(引擎)编程的信息时,您肯定会偶然发现这一点,但我想指出 https://www.chessprogramming.org/Main_Page提供了大量背景信息。再次强调:这并不是真正的 OO 设计,而是更多关于国际象棋引擎的细节。

关于java - 国际象棋引擎。可以将板对象引用传递给一 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com