用于描述国际象棋规则的推荐数据格式

时间:2008-10-11 16:34:32

标签: c# java python chess dataformat

我将要为国际象棋写一个国际象棋服务器和一个或多个客户端,我想在编程语言中描述国际象棋的规则(例如,基于游戏状态的允许移动,游戏完成时的规则)独立的方式。这有点棘手,因为一些国际象棋规则(例如King Castling,en passent,基于3次或更多次重复动作绘制)不仅基于棋盘布局而且基于移动历史。

我希望格式为:

  • 文本
  • 人类可读
  • 基于标准(例如YAML,XML)
  • 可以用各种语言轻松解析

但我愿意为解决这些问题而牺牲其中任何一种。

我的主要问题是:我如何构建如此复杂的算法,以便从数据格式对这种复杂状态进行操作?

后续问题是:你能否提供一个类似问题的例子,以类似的方式解决,可以作为一个起点?

编辑:为了回应清晰的要求 - 请考虑我将使用Python编写的服务器,一个用C#编写的客户端和另一个用Java编写的客户端。我想避免在每个地方指定规则(例如,允许的棋子移动,检查的情况等)。我宁愿以语言独立的方式指定这些规则。

9 个答案:

答案 0 :(得分:4)

让我们思考一下。我们用状态和行为描述对象(位置和片段)。我们需要注意当前状态和来自当前状态的不断变化的允许状态变化集。

这是编程。您不需要一些“元语言”,然后您可以使用常规编程语言进行解析。只需使用编程语言。

从普通语言的普通类定义开始。全部工作。然后,这些类定义是国际象棋的定义。

只有极少数例外,所有编程语言

  • 人类可读
  • 合理标准化
  • 由各自的编译器或口译员轻松解析。

选择一种语言,你就完成了。由于需要一段时间才能解决这些细微差别,因此使用像Python或Ruby这样的动态语言可能比使用Java或C#等静态语言更快乐。

如果您想要便携性。选择一种便携式语言。如果您希望将语言嵌入“更大”的应用程序中,请选择“更大”应用程序的语言。


由于原始要求不完整,次要问题是如何让代码与多个客户端一起运行。

  1. 没有多种语言的客户端。选一个。例如,Java,坚持下去。

  2. 如果您必须拥有多种语言的客户端,那么您需要一种可以嵌入所有三种语言运行时环境的语言。你有两个选择。

    • 嵌入口译员。例如,Python,Tcl和JavaScript是轻量级解释器,您可以从C或C#程序调用它们。这种方法适用于浏览器,它可以为您工作。 Java,通过JNI也可以利用它。您可以使用BPEL规则引擎。

    • 将解释器生成为单​​独的子进程。在应用程序和生成的解释器之间打开命名管道或套接字或其他内容。您的Java和C#客户端可以与Python子进程通信。您的Python服务器可以简单地使用此代码。

答案 1 :(得分:2)

编辑:删除过于冗长的答案。

简短的回答是,用Python编写规则。使用Iron Python将其连接到C#客户端,将Jython连接到Java客户端。

答案 2 :(得分:2)

这是回答后续问题: - )

我可以指出,最流行的国际象棋服务器之一记录了它的协议here(警告,FTP链接,不支持被动FTP),但只能写入接口强>,不是出于任何其他目的。您可以开始为此服务器编写客户端作为学习体验。

有一点重要的是,优秀的国际象棋服务器提供的功能远不止移动中继。

也就是说,有一个更基本的协议用于与国际象棋引擎接口,记录here

哦,顺便说一下:Board Representation at Wikipedia

任何超出董事会代表的事物都属于程序本身,正如许多人已经指出的那样。

答案 3 :(得分:2)

已经有一种广泛使用的国际象棋格式Portable Game Notation。还有Smart Game Format,适用于许多不同的游戏。

答案 4 :(得分:2)

我建议Prolog描述规则。

答案 5 :(得分:2)

到目前为止,我从回复中收集了什么:

对于国际象棋棋盘数据表示:

参见[棋盘表示]上的维基百科文章(http://en.wikipedia.org/wiki/Board_representation_(chess))

国际象棋移动数据表示:

请参阅Portable Game NotationAlgebraic Chess Notation

上的维基百科文章

对于国际象棋规则表示:

这必须使用编程语言完成。如果想要减少在多种语言中实现规则的情况下编写的代码量,那么有几个选项

  1. 使用存在目标语言的可嵌入解释器的语言(例如Lua,Python)。
  2. 使用公共语言可以编译的虚拟机(例如,IronPython for C#,JPython for Java)。
  3. 使用后台守护程序或子流程来处理目标语言可以与之通信的规则。
  4. 重新实现每种目标语言中的规则算法。
  5. 虽然我本来希望一种可以由多种语言解释的强制执行国际象棋规则的声明性语法,但我的研究却让我不太可能成为候选人。我怀疑Constraint Based Programming可能是一种可能的途径,因为许多语言都存在求解器,但我不确定它们是否真正满足这一要求。感谢所有的关注,也许将来会出现一个答案。

答案 6 :(得分:0)

Drools有一个现代的人类可读规则实现 - https://www.jboss.org/drools/。 用户可以通过Excel方式输入规则。与其他工具相比,更多用户可以理解Excel中的内容。

答案 7 :(得分:0)

要表示您可以使用的板的当前状态(包括铸造可能性等) Forsyth-Edwards Notation,它会给你一个简短的ascii表示。 e.g:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

将是开幕式的职位。

然后从一个位置表示一个特定的移动,你可以使用numeric move notation(用于对应的国际象棋),它会给你一个简短的(4-5位)表示移动板。

至于代表规则 - 我很想知道自己。目前我的国际象棋引擎的规则只是用Python编写的,可能不像我想的那样具有声明性。

答案 8 :(得分:0)

我同意ΤΖΩΤΖΙΟΥ留下的评论,即。让服务器进行验证,让客户提交一个潜在的举动。如果这不是您想要采用设计的方式,那么只需按照S. Lott和其他人的建议在Python中编写规则。

真的不应该那么难。您可以将规则分为三大类:
   - 依赖于董事会状态的规则(铸造,通过,抽签,检查,将死,通过检查,甚至是这个玩家轮流等)
   - 适用于所有棋子的规则(不能占用与你自己颜色的另一块相同的方块,移动到正方形w /对手的棋子==捕捉,不能离开棋盘)
   - 适用于每件单品的规则。 (棋子不能倒退,城堡不能对角移动等)

每个规则都可以作为一个函数实现,然后对于每个半移动,通过查看它是否通过所有验证来确定有效性。

对于提交的每个可能的移动,您只需按以下顺序检查规则:

  1. 建议的举措是否有效? (正确的“形状”)
  2. 是否符合董事会的限制? (是否被封锁,是否会移出边缘)
  3. 此举是否违反了州的要求? (这次搬家后我还在检查吗?我是否经过检查?这是否合法捕获合法?)
  4. 如果所有这些都没问题,那么服务器应该接受移动为合法...