gpt4 book ai didi

java - 在扑克牌中找到 EVEN STRAIGHT

转载 作者:行者123 更新时间:2023-11-29 05:14:51 25 4
gpt4 key购买 nike

所以我的教授决定变聪明,为我的扑克项目设计了一手名为 EVEN STRAIGHT 的牌。这就像顺子,只是牌必须是连续的偶数。例如- 8,6,2,4,10 是偶数顺子。此外,一张 A(值为 1)可以用作“高端”或“低端”,这意味着它可以是 1 还是 14,具体取决于其他牌。我无法按升序对数组中卡片的值进行排序,因为我们无法在此项目中使用 .sort 方法。有人能帮我吗?这也是一个介绍性的 Java 类,因此请尽量使其简单。谢谢。这是我目前所拥有的......

//可以假设只有 5 张卡片作为参数传入。

public static boolean hasEvenStraight(Card [] cards) {  
boolean evenCard = false;
int [] value = new int[cards.length];
for(int i = 0; i<cards.length; i++){
Card myCard = cards[i];
value[i] = myCard.getValue();
if(value[i]%2 == 0){
evenCard = true;
}
else
evenCard = false;
}
if(evenCard){
//This is where I am stuck
}
return false;
}

最佳答案

首先,您的代码中存在逻辑错误。在您的 for 循环中,您正在检查当前卡片是偶数还是奇数。但是当循环结束时,剩下的就是你是否看过最后一张牌。你需要检查它们是否都是偶数。

    for(int i = 0; i<cards.length; i++){
Card myCard = cards[i];
value[i] = myCard.getValue();
if ( value[i] == 1 ) {
value[i] = 14;
}
if(value[i]%2 != 0)
return false
}
}

这个循环,如果它发现一张牌不是偶数,它会立即返回 false,因为即使是奇数牌也意味着你没有偶数顺子。所以在它完成后你知道你有所有的偶数。

但这当然是不够的。您想知道卡片是否连续。诀窍在这里:您实际上不必将所有卡片值都保存在该 value 数组中。您只需要保留最高的一个和最低的一个。循环结束后,如果你知道它们都是偶数,并且你的最高 - 你的最低 = 8,则说明你有连续的偶数,即偶数顺子。

为什么?因为如果它们不是连续的,那么即使在中间也会有缺失,对吧?但是,如果最低点比最高点少 8,则无法将 3 张牌推到它们之间以使它们都相等。

但是我们需要注意相同点数的牌,比如黑桃2和红桃2。他们会破坏这个原则。如果它们存在,那也不是一条直线。

为了检查这一点,我们必须为我们处理的每个卡值保留一个标志,说“我们是否已经处理了这个卡值”?为此,我们可以使用类似 Set 的东西。在检查每个数字时,我们会问:“这个数字在我们已经检查过的数字集中吗?”。如果是这样,那么当然,这不是偶数顺子。如果不是,我们将当前数字添加到集合中,以便可以检查后面的数字。

对于范围较小的整数,我们可以在没有实际 Java Set 的情况下执行此操作。我们使用一个名为 alreadyThere 或类似名称的 boolean 值数组。索引 i 处的元素表示“我们是否检查了值为 i 的卡片”。这有点浪费空间,因为我们永远不会使用奇数索引或零和一索引,但它很容易实现。只需检查 alreadyThere[cardValue] 是否为 true。当然,在我们检查它是一个唯一的数字之后,我们将 alreadyThere[cardValue] 设置为 true 以供下一次迭代检查。

那么让我们修改你的方法:

public static boolean hasEvenStraight(Card [] cards) {  

int low = 20; // There is no 20 card.
int high = 0; // There is no 0 card.

// This array is a bit wasteful as it won't all be used,
// but it's straightforward this way.

boolean[] alreadyThere = new boolean[15];

for(int i = 0; i<cards.length; i++){
Card myCard = cards[i];
int currValue = myCard.getValue();

// Handle ace. If it's 1 it's not an
// even hand anyway, so assume it's 14.
if ( currValue == 1 ) {
currValue = 14;
}

// If any card is not even, this is not an Even Straight.
if(currValue%2 != 0){
return false;
}

// We have two cards of the same number
// (E.g. 2 of spades and 2 of hearts). So
// not a straight.
if ( alreadyThere[currValue] ) {
return false;
}
alreadyThere[currValue] = true;

// To get the lowest and highest, compare each value to
// existing lowest and highest and change them accordingly.
if ( currValue > high ) {
high = currValue;
}
if ( currValue < low ) {
low = currValue;
}
}

// Loop finished. All the numbers are even, now check if they
// are consecutive.
return ( high - low ) == 8;
}

关于java - 在扑克牌中找到 EVEN STRAIGHT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com