【问题标题】:Regular Expressions for validating chess-based input?用于验证基于国际象棋的输入的正则表达式?
【发布时间】:2011-06-01 15:16:42
【问题描述】:

我正在使用 HTML/CSS/PHP 开发一个基于国际象棋的爱好项目。我事先对国际象棋并不熟悉,所以我决定制作一个工具,它可以根据给定棋子的类型和方格显示允许的走法。

我有一个带有两个文本字段的 HTML 表单:一个用于块的类型,另一个用于所述块的当前方块。一切正常,但我想使用正则表达式进行验证。

棋子类型的有效、不区分大小写的输入是p、pawn、r、rook、b、bishop、n、knight、q、queen、k、king

正方形的有效、不区分大小写的输入是 LetterNumber,其中 Letter 可以是 A-HNumber可以是1-8

所以我想知道使用正则表达式是否可能/实用,如果是这样,谁能告诉我它们是什么?我在想我应该只使用带有逻辑或的条件语句作为片段类型,但我很想知道是否有其他解决方案。

【问题讨论】:

  • 如果您已经在分隔输入字段,我不建议使用正则表达式。分别验证棋子和方子要简单得多。
  • 一个数字1-8怎么能表达一个位置呢?不应该是字母-数字-数字吗?
  • @mihsathe 我正在使用str_split() 函数来分割假设用户输入表单的正方形。我有一个函数,它接受字母部分(例如“C4),它代表文件/列,并将字母转换为相应的列号(例如3)。我这样做的原因是使其遵循国际象棋惯例,即您会说并将其视为“C4”而不是“3-4”。
  • @Jason McCreary 这就是我的假设,但感谢您的确认。
  • 再次感谢所有回复的人。我还没有进行任何客户端验证并且有一些问题,但如果有人对我所拥有的内容感兴趣,请查看:freemusing.com/chess

标签: php regex chess


【解决方案1】:

编程棋步验证

您始终可以使用正则表达式来至少设置要调查的图块(无需调查块根本无法移动的图块),例如,捡起一个苦工时最多应检查四个图块(两次罢工位置,单次移动,可能还有最初的双重移动)。

我相信它可以通过这样的方式完成:

1 算法获取要检查的字段数组。 字段检测阻塞件的路径(好的和坏的)。 (骑士不需要,因为他疯了;]) fields 会检测到要攻击的敌方棋子(在路径中,除了棋子。)

记住: - 如果移动会让你受到控制,你就不能执行它。 - 如果你在检查,你只能避免检查或 - 只有“特殊规则”是易位和晋升。晋升并不会真正影响您的运动计算。 Castling 可以用两个布尔值来完成,“女王侧完整”和“国王侧完整”,如果有任何移动,则开始为真并打破为假(不要像某些国际象棋模拟游戏那样只检测它们是否站在正确的位置...... . 这很尴尬。将你的王后移回她的起始位置不会为王后易位开放。)


更多像样的PHP国际象棋资源

这里有一些基于 php 的国际象棋游戏,我没有时间浏览它们,但应该有大量的移动验证可以学习:

http://www.bebogame.com/download/php/multiplayer_chess/multiplayer_chess.zip

http://sourceforge.net/projects/some-chess/files/Some%20Chess%202.0/Some%20Chess%202.0%20beta%203/SomeChess_2.0b3.tbz/download

http://www.redlionwebdesign.com/phpchess.htm

【讨论】:

  • 我的项目只是生成一个 HTML/CSS 棋盘并突出显示给定棋子可以根据其位置移动到的方格。不过感谢这些链接,尤其是第一个链接。
【解决方案2】:

输入的正则表达式:

  • 片段:^[p|r|b|n|q|k|P|R|B|N|Q|K]$
  • 位置:^[A-H|a-h][1-8]$

您可以评估表单的 onblur、onchange 和 onsubmit。

我同意在客户端和服务器端验证移动也很有意义。

【讨论】:

  • 这是一个很好的现场测试正则表达式的网站:gskinner.com/RegExr
  • 谢谢。该职位的正则表达式正是我正在寻找的。我将如何扩展该作品的名称以包含作品的实际名称?
【解决方案3】:

对于这样的任务,我强烈建议不要使用正则表达式。任何给定棋子的有效移动都与其当前位置和颜色有关,并且可以通过验证功能更好地验证。

【讨论】:

  • 我只需要找到验证假设用户输入的方法,即找出表单万无一失的方法。我已经完成了实际的计算部分,尽管现在我意识到棋子的颜色决定了它可以移动的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多