麻将获胜手算法

时间:2011-02-08 20:04:55

标签: algorithm artificial-intelligence mahjong

我正在寻找一种能够确定当前麻将牌是否胜利的算法。如果你不熟悉游戏,这里是基本的想法(简化):

  
      
  • 有三套瓷砖,每套都包含排名为1-9的瓷砖。还有特殊的瓷砖,七种类型。每个瓷砖有四个副本,因此每个套装有36个瓷砖和28个特殊瓷砖。
  •   
  • 一只手上有14块瓷砖。
  •   
  • chow 是一组三个单一排名的牌。
  •   
  • pong 是一组三个相同的图块。
  •   
  • kong 是一组四个相同的图块。
  •   
  • 是一组两个相同的图块。
  •   
  • 胜利之手是指瓷砖形成任意数量的ch,p,和/或kong和一对。
  •   

手按照套装排序,然后按等级排序。我的想法是这样的:

  1. 将所有瓷砖标记为未访问且无法获胜。
  2. 访问第一个未经访问过的瓷砖。
  3. 检查后续的瓷砖,直到遇到食物,pong或kong,或者直到没有可能。如果组合完成,请将所有参与的磁贴标记为已访问且已获胜
  4. 如果已访问过所有图块,请检查是否所有图块都已获胜。如果未访问过所有图块,请转到2.
  5. 问题在于,一旦瓷砖成为组合的一部分,就不能成为任何其他组合的成员,可能会使手牌成为赢家。

    有关工作算法的任何想法吗?

1 个答案:

答案 0 :(得分:0)

如果您将算法嵌入回溯算法(http://en.wikipedia.org/wiki/Backtracking),那么您的算法就可以了。最简单的方法是在找到匹配的对/ chow / ...后递归调用您的方法,但如果没有,则丢弃当前的选择。在伪代码中,这看起来像这样:

1. Mark all tiles as nonwinning
2. Call function Backtracking

Function Backtracking:
1. If all tiles are marked winning return WINNING else NONWINNING
2. Visit tiles as described in your algorithm
3. When found a chow/pong/... or the first pair    
   3.1. Mark those tiles as winning.     
   3.2. Afterwards call method Backtracking.    
   3.3. If return value of 3.2 is WINNING also return WINNING    
   3.4. Else unmark the tiles as nonwinning again    
4. If not finished search for pair/chow/... by looping to 3.
5. All combinations are done and no winning movewas found so return NONWINNING

背后的想法是你首先尝试每一对/ ...作为获胜手的一部分,但如果这不起作用,只要尝试相同,假设它不是获胜手的一部分。

如果你不仅对胜利之手感兴趣,而且所有可能的获胜对/ chows / ......的组合都会跳过步骤3.3中的回归。