3

如果给你:

  1. 一个好的洗牌算法(一个很好的随机性来源加上一种洗牌方法,不受任何会影响结果的常见陷阱的影响)
  2. 一个神奇的函数WINNABLE(D),它采用洗好的牌组,如果牌D组可以通过某些播放顺序获胜,则返回 True,如果不可避免地导致输掉位置,则返回 False。

那么就可以通过使用 (1) 生成大量起始套牌,然后使用 (2) 将它们过滤到可获胜的套牌来生成一组“分布良好”的可获胜单人纸牌交易。当您试图避免细微的选择偏差潜入您的结果时,这种随机生成可能性并从中挑选的方法始终是一个很好的起点。

问题在于(2)很难(可能是 NP-hard,具体取决于游戏),甚至它的近似值在计算上也很昂贵(比如说,如果你在 iPad 上)。然而,更便宜的算法,例如从获胜位置开始并随机“不移动”以将游戏反转回起点,可能会偏向难以量化或避免的特定套牌洗牌。

在生成这样的可赢游戏领域是否有任何有趣的算法或研究?

4

2 回答 2

0

由于纸牌游戏的差异如此之大,因此在这种普遍性水平上进行推理本身就很困难。为了集中我们的想法,让我们举一个特定的例子:四十大盗。这是一个双包装游戏,从空的基础开始,向上构建;一个空垃圾堆;以及十张预先发牌的正面朝上牌堆,每堆四张牌。废物和布局堆的顶牌暴露在外。在每一步,您都可以:

  1. 将暴露的卡片移至其在基金会中的合法位置,无需担心;
  2. 将一张暴露的牌移到布局中的一堆上,只有在同一套花色中向下建造时才合法;
  3. 将暴露的卡片移动到空的布局插槽;
  4. 从库存中处理一张卡片到废物的顶部。

初学者按所述顺序播放这些选项。(我使用的实现实际上有一个提示按钮,提示相应的移动。)我估计只有不到十分之一的交易可以通过该策略获胜,而实际可获胜交易的比例约为三分之一。

现在,如果您通过随机不移动产生可赢的交易,则存在难以量化的偏差;我不同意这一点。不过,我认为,在碰巧可赢的交易中,交易往往比平均水平更难,初学者的策略几乎没有可赢的交易。

但是,您可以故意使非移动非随机。如果您以与初学者策略相反的顺序选择不移动,您将获得初学者策略有效的交易:例如,如果仅作为最后的手段,您从基础不移动到浪费,然后从浪费移动到基础只要有可能总是正确的。

于 2018-06-30T06:10:30.560 回答
-3

嗯,我对纸牌不太了解,但这就是我解决问题的方法。请参阅我的伪代码。

//假设你已经创建了一个“卡片”对象。

Generate a List<Cards> deck;// A list populated with every card in deck that you can use in Solitaire with the number of each card you can use in Solitaire.
Generate a List<Cards> table;
while(deck.size()>0){//This is the real code.
     table.add(deck.remove((int)(Math.random()*deck.size())));
}
//And done. You know have a perfectly shuffled list of Cards in table.
//Now divide the list up however you want.

我不知道第 2 部分。

于 2013-09-17T23:59:32.533 回答