2016-09-29 72 views
0

我目前正在尝试使用2张扑克牌创建所有可能的扑克组合。我知道有1,326种起手组合。 所以我创造了我开始的甲板像这样:PHP - 创建所有可能的扑克组合的扑克算法

$startingDeck = array(); 
for($i=1; $i <= 13; $i++) 
{ 
    for($x=0; $x <= 3; $x++) 
    { 
     array_push($startingDeck, array("Value" => $i ,"Color" => $x, "key"=> $i.$x)); 
    } 
} 

我现在要遍历所有的牌,并得到2卡的所有可能的组合,例如

: value 1 color 1 and value 1 color 2 
: value 1 color 1 and value 1 color 3 
... etc 
: value 2 color 0 and value 1 color 1 
: value 2 color 0 and value 1 color 2 
... etc 

我想要为所有这样做可能的组合,但如何。

回答

1

你已经有你的起始套牌了。这个想法是产生所有排列:

例如,

CARD NUMBER 
    1 2 3 4 5 6 7 8 9 10 11 12 13 ... 52 
1 o x x x x x x x x x x x x  x 
2 - o x x x x x x x x x x x  x 
3 - - o x x x x x x x x x x  x 
4 - - - o x x x x x x x x x  x 
5 - - - - o x x x x x x x x  x 
6 
7 ......... and so on ......... 
8 
9 
10 
11 
12 
13 
... 
52 

我们在甲板52卡(也就是你在$startingDeck生成的内容):

x表示我们想要生成的组合。请注意,我们不必生成矩阵的下半部分,因为您在同一时间接收到两张牌时顺序无关紧要。我们也不会生成轴,因为你不能有两次同一张卡(除非你欺骗:))。

现在的想法是使用两个循环,但让第二个循环开始取决于第一个初始的$j取决于$i。这样我们就不会产生例如2-1, 3-2, 3-1, ...,因为我们已经生成了1-2, 1-3, 2-3, ...

让我们开始:

for ($i = 0; i < count($startingDeck); $i++) { 
    // Ignore e.g. 2-1, 3-2, as we already generated 1-2, 2-3, and so on... 
    for ($j = $i+1; $j < count($startingDeck); $j++) { 
     $firstCard = $startingDeck[$i]; 
     $secondCard = $startingDeck[$j]; 
     // print my stuff 
    } 
} 

这产生顶部矩阵。 $i+1确保我们不生成对角线。

我希望有帮助。