|
|
1
10
你知道吗,根据我玩过或听说过的任何扑克游戏的规则,直投都不能打对?Ace可以是低[A,2,3,4,5]或高[10,J,Q,K,A],但它不能包裹。根据这些规则(不是你的),我以前也实施过类似的事情。基本上,你对数组进行排序并遍历它,确保当前的卡片比前一张高。在第一次迭代中,如果它是一个ace,那么你显式地检查[A,2,3,4,5]。如果是,则返回true,如果不是,则继续正常的直接逻辑。这应该会让你走上正确的方向。 |
|
|
2
5
你可以编写一个花哨的算法,不管可能有多少张牌,都能返回true,但如果你意识到排序后的手牌上只有10个有效的组合,你可以找这些:
|
|
|
3
3
一般来说,解决扑克手牌问题的一个好方法是为每张牌分配一个位值,设置位((rank-2)*2)位和位(suit+28)位(因此2=1,3=4,4=16等,直到A=0x1000000)。然后将所有卡片加在一起(将结果称为“Sum”。计算V1=(Sum&0x2AAAAAA)>>1,V0=(求和&0x1555555),V2=V1&V0。同时,将五张牌的值相加,并计算V3=OrValue&0xF000000;
这种方法所需的测试应该可以用最少的分支快速实现。 |
|
|
4
2
由于你的列表中只有5张牌,你可以对其进行排序,并确定连续2张牌之间的差异。如果它包含一张王牌,你也需要将其视为一张低牌。如果所有的差异都是1(或-1,取决于排序顺序),那么你就得到了你的直线。 |
|
|
5
0
我认为,根据RANK的定义,直道只能从ACE.points()-4的最大值开始。 因此,如果您对手部进行排序,最低RANK为>ACE.points()-4,那么你就不能有一条直线,否则你只需迭代手牌,看看每张牌都是之前的RANK+1。 如果ACE可以高或低,那么就按照SHS的回答。 |
|
|
6
0
有了内环,它就变得相当微不足道,挑战在于在没有内环的情况下做到这一点。.. 此外,这取决于你是否理解你的老师,或者你的老师是否误解(或歪曲)了游戏规则。 我想我会忍不住创建一个数组[2..14],并将卡片放置在与它们的排名相对应的位置。如果你点击了一个重复,它就不是直线,当你完成时,你应该有8个空格。如果你一排的空格少于8个,那就不是直线。 我能想到的所有其他解决方案都需要一个内部循环——如果你想成为一名受人尊敬的程序员,内部循环是你需要尽可能避免的草率编程之一。 编辑:此外,如果你误解了老师,唯一的包装条件是“10,j,q,k,a”(就像在真实的规则中一样),那么你需要进行一个额外的测试,如果2、13和14都设置好了,这也是一个失败(2-a-k包装)。 (重读问题后,再次编辑,将ace的1替换为14) |
|
|
7
0
我不太使用枚举,我更喜欢命名常量,但我认为从“ACE”到“14”是微不足道的 我懒得写真正的java代码(其实你还得做功课^^)
%运算符称为模,因此(15%13)==2 每当我面临“覆盖”挑战时,我都会使用这个运算符 编辑:重读你的问题后,我的答案无法开箱即用。您应该重新排序枚举,使TWO==0 |
|
|
8
0
我建议使用位向量来表示卡片。这避免了排序。你可以两次添加ace(一次作为1,另一次作为国王),或者你可以在检查2是否设置之前检查ace位是否设置,从而对起始情况进行特殊处理)。如果速度很重要,你可以建立一个大的查找表。这种方法还可以清洁鳞片,找到剩下的手(冲水、两双、满屋、绊倒等)。它还可以很容易地找出给定的直线是否高于另一条直线。它干净地扩展到7个卡片评估器 在伪代码中,对于非常一般的情况,它看起来像这样(你可以有任意数量的卡。它返回第一条直线)
|
|
|
9
0
将所有排名按顺序添加到列表中,两次。然后,要检查一只手是否是直的,请按排名对手进行排序,然后检查该手是否是该列表的子列表。 |
|
10
-2
你可以编写一个类,将每张卡转换为特定的卡值 小丑=11 女王=12 国王=13 Ace=0或14 这将使卡片处理和寻找可能的手变得容易得多。 |