关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
5个月前关门了。
改进这个问题
帮助我如何接受输入。我不明白在主方法中添加什么
纸牌游戏规则:手是从一包纸牌中抽出的(不要开玩笑)。只有当他们是一种类型的3(…aaa…)或者4个(…aaaa…)。三张或三张以上的牌(…jqk。。。或者……a23456…。。。穿同一套衣服)。看看这名选手是否能打全手
//input a 4X13 matrix with 4 suits and 13 ranks of cards. set cards[suit][rank] to 1 if this card in hand.
public static boolean handClear(int[][] cards, int hand) {
if(hand == 0) return true;
for(int rank = 12; rank >= 0; rank--) {
for(int suit = 0; suit < 4; suit++) {
if(cards[suit][rank] == 1) { //if cards[suit][rank] in hand
cards[suit][rank] = 0; hand--;
int smallerRank = rank == 0 ? 12: rank - 1; // look for straight flush that end with this card
// watch for Ace as a special case that***QKA and A23***both valid
if(cards[suit][smallerRank] == 1) {
cards[suit][smallerRank] = 0; hand--;
int r = smallerRank - 1;
for(; r >= 0 && cards[suit][r] == 1; r--) { //try playing the straight flush found
cards[suit][r] = 0; hand--;
if(handClear(cards, hand)) return true;
}
r++;
for(; r <= smallerRank; r++) { //backtrack if play did not work
cards[suit][r] = 1; hand++;
}
}
//look for 3/4 of a kind for cards[suit][rand]
int n = cards[0][rank] + cards[1][rank] + cards[2][rank] + cards[3][rank];
if(n == 3 || n == 2) {
int tmp1 = cards[(suit + 1) % 4][rank],
tmp2 = cards[(suit + 2) % 4][rank],
tmp3 = cards[(suit + 3) % 4][rank];
cards[(suit + 1) % 4][rank] = 0; //try playing the 3/4 of a kind
cards[(suit + 2) % 4][rank] = 0;
cards[(suit + 3) % 4][rank] = 0;
hand -= n;
if(handClear(cards, hand)) return true;
cards[(suit + 1) % 4][rank] = tmp1; //backtrack if play did not work
cards[(suit + 2) % 4][rank] = tmp2;
cards[(suit + 3) % 4][rank] = tmp3;
hand += n;
}
cards[suit][rank] = 1; hand++;
}
}
}
return false;
}
1条答案
按热度按时间to94eoyn1#
我相信您只需要解释一下如何最初调用您在问题中发布的方法。
方法参数
cards
表示牌组中的所有牌。有四套西装,即梅花、钻石、红桃和黑桃。
显然每件衣服都有一个相关的索引。据我所知,你发布的代码,可以简单地将索引与西装任意关联。所以我们假设如下:
0=球杆
1=钻石
2=心形
3=黑桃
因此阵列的尺寸
cards
应该是4和13,因为每一套有13张牌。所以你需要创建一个二维数组。现在你需要把一张西装卡片和一个索引联系起来。假设王牌有索引0(0),国王有索引12(12)。
这意味着
cards[0][0]
代表俱乐部的王牌cards[2][10]
代表红心杰克。我的扑克知识有点生疏了,所以我可能错了,但是一张扑克手是由五张牌组成的。
所以你需要初始化
cards
并将每个元素设置为0(零),即。现在你需要“交易”一只手。您需要在中设置值
cards
卡的索引为1(一)。你是如何随机发牌的,我不知道,但是假设你给自己发了7张黑桃,那就意味着你需要做以下的事情。请注意您发布的方法,即。
handClear
,是一种递归方法。这意味着该方法调用自身。所有递归方法都必须具有终止递归的条件。in方法handClear
当[method]参数hand
等于0(零)。这意味着hand
必须是手中“已发”的牌数。正如我之前所说的,对于扑克来说,我相信是5。但这不重要,因为方法handClear
将处理参数的任何值hand
它收到的。所以为了最初调用
handClear
,您需要确定一手牌有多少张牌,例如扑克有5张牌。然后你必须创建二维数组并初始化它,就像我上面解释的那样,最后你必须选择hand
不同的元素cards
并将元素值设置为1(一)。然后可以调用方法handClear
.上面的一个非常简单的例子: