如何在值数组中查找三个的所有序列
How to find all sequences of three in an array of values
这里是第一个问题...
我正在编写一个简单的 3 张牌扑克手牌评估器,并且遇到问题 finding/extracting 多个 "straights" (顺序值序列)来自一个值数组。
我需要提取和 return 阵列可能具有的每条直线。这是一个例子:
(假设数组首先按数字递增排序)
myArray = [1h,2h,3c,3h,4c]
可能的三值序列是:
[1 小时,2 小时,3 小时]
[1 小时,2 小时,3 小时]
[2h,3c,4c]
[2h,3h,4c]
这是我查找 3 序列的原始代码,其中数组包含带有 .value 和 .suit 的卡片对象。在这个问题中为了简单起见,我只是在这里输入“2h”等:
private var _pokerHand = [1h,2h,3c,3h,4c];
private function getAllStraights(): Array
{
var foundStraights:Array = new Array();
for (var i: int = 0; i < (_handLength - 2); i++)
{
if ((_pokerHand[i].value - _pokerHand[i + 1].value) == 1 && (_pokerHand[i + 1].value - _pokerHand[i + 2].value) == 1)
{
trace("found a straight!");
foundStraights.push(new Array(_pokerHand[i], _pokerHand[i + 1], _pokerHand[i + 2]));
}
}
return foundStraights;
}
但当存在重复值时(如上面的 3),它当然会失败。我不能丢弃重复项,因为它们可能有不同的花色。如上例所示,我需要所有可能的直线。这允许我 运行 通过 "Flush" 函数找到 "straight flush".
我缺少什么数组迭代技术?
这是一个有趣的问题。考虑到扑克游戏(和 Flash)的流行,我确信这个问题以前已经解决过很多次,但我无法在网上找到示例。以下是我的处理方式:
- 将其视为寻路问题。
- 以手中的每张牌作为可能路径(直线)的起点。
- 虽然有可能的顺子:
- 从列表中删除一个。
- 找到所有接下来的有效步骤(可以是 none,或最多 4 张具有相同值的后续卡片),对于每个接下来的有效步骤:
- 如果达到目标(完成直道),将其添加到找到的直道列表中。
- 否则将下一步的可能顺子添加回堆栈。
这似乎符合您的要求(Card
对象具有 .value
作为 int
):
private function getAllStraights(cards:Vector.<Card>, straightLength:uint = 3):Vector.<Vector.<Card>> {
var foundStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[];
var possibleStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[];
for each (var startingCard:Card in cards) {
possibleStraights.push(new <Card>[startingCard]);
}
while (possibleStraights.length) {
var possibleStraight:Vector.<Card> = possibleStraights.shift();
var lastCard:Card = possibleStraight[possibleStraight.length - 1];
var possibleNextCards:Vector.<Card> = new <Card>[];
for (var i:int = cards.indexOf(lastCard) + 1; i < cards.length; i++) {
var nextCard:Card = cards[i];
if (nextCard.value == lastCard.value)
continue;
if (nextCard.value == lastCard.value + 1)
possibleNextCards.push(nextCard);
else
break;
}
for each (var possibleNextCard:Card in possibleNextCards) {
var possibleNextStraight:Vector.<Card> = possibleStraight.slice().concat(new <Card>[possibleNextCard]);
if (possibleNextStraight.length == straightLength)
foundStraights.push(possibleNextStraight);
else
possibleStraights.push(possibleNextStraight);
}
}
return foundStraights;
}
给定 [1♥,2♥,3♣,3♥,4♣]
你得到:[1♥,2♥,3♣], [1♥,2♥,3♥], [2♥,3♣,4♣], [2♥,3♥,4♣]
当你有很多重复项时,它会变得非常有趣,比如 [1♥,1♣,1♦,1♠,2♥,2♣,3♦,3♠,4♣,4♦,4♥]
。这给你:
[1♥,2♥,3♦], [1♥,2♥,3♠], [1♥,2♣,3♦], [1♥,2♣,3♠], [1♣,2♥,3♦], [1♣,2♥,3♠], [1♣,2♣,3♦], [1♣,2♣,3♠], [1♦,2♥,3♦], [1♦,2♥,3♠], [1♦,2♣,3♦], [1♦,2♣,3♠], [1♠,2♥,3♦], [1♠,2♥,3♠], [1♠,2♣,3♦], [1♠,2♣,3♠], [2♥,3♦,4♣], [2♥,3♦,4♦], [2♥,3♦,4♥], [2♥,3♠,4♣], [2♥,3♠,4♦], [2♥,3♠,4♥], [2♣,3♦,4♣], [2♣,3♦,4♦], [2♣,3♦,4♥], [2♣,3♠,4♣], [2♣,3♠,4♦], [2♣,3♠,4♥]
我没有仔细检查过这个,但一眼看上去就对了。
这里是第一个问题... 我正在编写一个简单的 3 张牌扑克手牌评估器,并且遇到问题 finding/extracting 多个 "straights" (顺序值序列)来自一个值数组。
我需要提取和 return 阵列可能具有的每条直线。这是一个例子:
(假设数组首先按数字递增排序)
myArray = [1h,2h,3c,3h,4c]
可能的三值序列是: [1 小时,2 小时,3 小时] [1 小时,2 小时,3 小时] [2h,3c,4c] [2h,3h,4c]
这是我查找 3 序列的原始代码,其中数组包含带有 .value 和 .suit 的卡片对象。在这个问题中为了简单起见,我只是在这里输入“2h”等:
private var _pokerHand = [1h,2h,3c,3h,4c];
private function getAllStraights(): Array
{
var foundStraights:Array = new Array();
for (var i: int = 0; i < (_handLength - 2); i++)
{
if ((_pokerHand[i].value - _pokerHand[i + 1].value) == 1 && (_pokerHand[i + 1].value - _pokerHand[i + 2].value) == 1)
{
trace("found a straight!");
foundStraights.push(new Array(_pokerHand[i], _pokerHand[i + 1], _pokerHand[i + 2]));
}
}
return foundStraights;
}
但当存在重复值时(如上面的 3),它当然会失败。我不能丢弃重复项,因为它们可能有不同的花色。如上例所示,我需要所有可能的直线。这允许我 运行 通过 "Flush" 函数找到 "straight flush".
我缺少什么数组迭代技术?
这是一个有趣的问题。考虑到扑克游戏(和 Flash)的流行,我确信这个问题以前已经解决过很多次,但我无法在网上找到示例。以下是我的处理方式:
- 将其视为寻路问题。
- 以手中的每张牌作为可能路径(直线)的起点。
- 虽然有可能的顺子:
- 从列表中删除一个。
- 找到所有接下来的有效步骤(可以是 none,或最多 4 张具有相同值的后续卡片),对于每个接下来的有效步骤:
- 如果达到目标(完成直道),将其添加到找到的直道列表中。
- 否则将下一步的可能顺子添加回堆栈。
这似乎符合您的要求(Card
对象具有 .value
作为 int
):
private function getAllStraights(cards:Vector.<Card>, straightLength:uint = 3):Vector.<Vector.<Card>> {
var foundStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[];
var possibleStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[];
for each (var startingCard:Card in cards) {
possibleStraights.push(new <Card>[startingCard]);
}
while (possibleStraights.length) {
var possibleStraight:Vector.<Card> = possibleStraights.shift();
var lastCard:Card = possibleStraight[possibleStraight.length - 1];
var possibleNextCards:Vector.<Card> = new <Card>[];
for (var i:int = cards.indexOf(lastCard) + 1; i < cards.length; i++) {
var nextCard:Card = cards[i];
if (nextCard.value == lastCard.value)
continue;
if (nextCard.value == lastCard.value + 1)
possibleNextCards.push(nextCard);
else
break;
}
for each (var possibleNextCard:Card in possibleNextCards) {
var possibleNextStraight:Vector.<Card> = possibleStraight.slice().concat(new <Card>[possibleNextCard]);
if (possibleNextStraight.length == straightLength)
foundStraights.push(possibleNextStraight);
else
possibleStraights.push(possibleNextStraight);
}
}
return foundStraights;
}
给定 [1♥,2♥,3♣,3♥,4♣]
你得到:[1♥,2♥,3♣], [1♥,2♥,3♥], [2♥,3♣,4♣], [2♥,3♥,4♣]
当你有很多重复项时,它会变得非常有趣,比如 [1♥,1♣,1♦,1♠,2♥,2♣,3♦,3♠,4♣,4♦,4♥]
。这给你:
[1♥,2♥,3♦], [1♥,2♥,3♠], [1♥,2♣,3♦], [1♥,2♣,3♠], [1♣,2♥,3♦], [1♣,2♥,3♠], [1♣,2♣,3♦], [1♣,2♣,3♠], [1♦,2♥,3♦], [1♦,2♥,3♠], [1♦,2♣,3♦], [1♦,2♣,3♠], [1♠,2♥,3♦], [1♠,2♥,3♠], [1♠,2♣,3♦], [1♠,2♣,3♠], [2♥,3♦,4♣], [2♥,3♦,4♦], [2♥,3♦,4♥], [2♥,3♠,4♣], [2♥,3♠,4♦], [2♥,3♠,4♥], [2♣,3♦,4♣], [2♣,3♦,4♦], [2♣,3♦,4♥], [2♣,3♠,4♣], [2♣,3♠,4♦], [2♣,3♠,4♥]
我没有仔细检查过这个,但一眼看上去就对了。