F#是否适合开发纸牌游戏人工智能?

10
我正在用C#编写麻将游戏(中国传统游戏,而不是纸牌)。在编写机器人玩家的人工智能代码时,我想知道一个函数式语言F#是否比我当前使用的大量Linq的C#更适合。我对F#了解不多,这就是为什么我在这里提问。

为了说明我的解决方法,以下是麻将的简要概述:

麻将有点像Gin Rummy。你手中有13张牌,在每个回合中,你抽一张牌并丢弃另一张牌,试图将自己的手牌改进到一个赢得麻将的手牌,其中包括4个集和一对牌。集可以是3个相同的(碰),4个相同的(杠)或3张连续牌的序列(吃)。如果它可以完成你的集之一,你还可以从另一个玩家那里偷取废弃物。

我必须写的代码来检测机器人是否能够宣布三个连续的牌组(“吃”)相当乏味。我必须找到手中所有独特的牌,然后开始检查是否存在一个包含手中那个牌的3张牌的序列。检测机器人是否能够去麻将更加复杂,因为它是检测他的手中是否有4个集和一对牌的组合。而且这只是一个标准的麻将手牌。还有许多“特殊”手,打破了这些规则,但仍然是麻将手。例如,“13个独特的奇观”由13个特定的牌组成,“玉皇朝”仅包含绿色染色的牌等。

在完美的世界里,我希望能够简单地指出麻将的“规则”,并使语言能够将13张牌组与这些规则匹配,以获取它满足哪些规则,例如,检查它是否为麻将手或是否包含4个相同的牌。 F#的模式匹配功能可以解决这个问题吗?

2个回答

8
如果您熟悉函数式语言,那么它们是编写游戏人工智能的绝佳方式。如果您不熟悉,学习一种函数式语言的挑战将有助于您成长,并使您成为比以前更好的程序员。 (我可以诚实地说,这对于类似Prolog的声明性语言和动态脚本/OO/多范式语言(例如Ruby或Python)同样适用!)。
按照您所描述的任务,在任何这些语言组中都应该很容易,因此选择其中一个并开始吧!我们将共同乐意回答由这些尝试引起的任何问题(我个人不熟悉F#或Scala,但很乐意帮助处理Haskell、任何ML系列语言、Scheme或Erlang等其他组的问题)。
严肃地说:至少掌握每个广泛类别(过程化、函数式、声明性/子句统一、关系型、动态/多范式等)中的一种语言会使您成为一个非常出色的程序员--除了麻将(它是意大利罗马涅地区的经典流行游戏,靠近我的家乡博洛尼亚;-),任何可以增加这方面技能的任务都值得去做!

1

没有什么是你无法自己制作的,而这些已经出现在其他语言中。

我曾尝试使用Java制作人工智能,基于我之前在Prolog上所做的工作。我认为编码会很麻烦。然而,我只需要编写几个方法来完成大部分繁重的工作,并将其从主要方法中剥离出来,它就能奇妙地运作。

你可能需要重新发明轮子,但在C#中你几乎可以实现F#的所有功能。

注意:我以前从未听说过F#,但它不可能那么糟糕。我可能/也许在自说自话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接