我有这个扑克牌游戏,可能的13张牌排名存储为[0到12]。 每手持有5张牌,其中有13张可能的牌位。
最终值是一个标识符,从指数13⁵(到5的幂)开始。
它存储了什么样的获胜手牌。 然后剩余的5个13的幂用于存储5张牌中的每一张。
另外更不用说并非所有5张牌都是随时存放的,这仅限于高牌赢,这需要4个踢球。
我的问题是只使用最终价值,我如何能够解开每张卡片以及获胜的手牌。
/** The ranking factors (powers of 13, the number of ranks). */
private static final int[] RANKING_FACTORS = {371293, 28561, 2197, 169, 13, 1};
rankings[0] = HIGHCARD WIN [0]
rankings[1] = 12; //Ace
rankings[2] = 6; //Eight
rankings[3] = 9; //Jack
rankings[4] = 1; //Three
rankings[5] = 3; //Five
// Calculate value.
for (int i = 0; i < NO_OF_RANKINGS; i++) {
value += rankings[i] * RANKING_FACTORS[i];
}
(0*371293) + (12*28561) + (6*2197) + (9*169) + (1*13) + (3*1) = 357451
尝试从357451
值解压缩值。
开始尝试在这里弄清楚数学。
if 357451 < 371293 rankings[0] = 0
(357451 / 28561) = 12 rankings[1] = 12
(357451 / 2197) / ((13*2)+1) = 6 rankings[2] = 6
(357451 / 169) / ((13*18)+1) = 9 rankings[3] = 9
//Alright it seems that 18 is from answers (12+6) probably because I haven't subtracted them or something.
//So next one should be (12+6+9)= 27, but it's 2115
(357451 / 13) / ((13*2115)+1) = 1 rankings[4] = 1
(357451 / 1) / ((13*9165)+1) = 3 rankings[5] = 3
我想我已经明白了,但我不明白这些价值可能只适用于这种情况会破坏任何其他情况。
不知道值2, 18, 2115, 9165
在哪里产生了可能是我编造的一些废话。
我该如何正确地做到这一点?我不认为我可以使用移位,因为这不是按位。
那么这样做呢?
(357451 / 371293) = 0
(357451 / 28561) = 12
(357451 % 28561) / 2197 = 6
(357451 % 2197) / 169 = 9
(357451 % 169) / 13 = 1
(357451 % 13) = 3
答案 0 :(得分:1)
通过这部分你是对的。
(357451 / 28561) = 12 rankings[1] = 12
但这不好......
(357451 / 2197) / ((13*2)+1) = 6 rankings[2] = 6
你需要取结果12并将其乘以28561然后从357451中减去它,看看剩下的是什么。在这种情况下,它是14719。
现在你可以继续使用那个数字而不是357451.所以14719/2197 = 6。
继续使用该模式(14719 - (2197 * 6)),直到获得5个数字。
如果你想这样做的话,(357451%28561)也会给你余数。
我的“解码”代码......
private static final int[] RANKING_FACTORS = {4826809, 371293, 28561, 2197, 169, 13, 1};
@Test
public void testDecode() {
long value = 357451;
int[] rankings = new int[6];
//System.out.println(Math.max(0,value-RANKING_FACTORS[0]));
for (int i=0; i < rankings.length; i++) {
rankings[i] = (int)(value / RANKING_FACTORS[i]);
value %= RANKING_FACTORS[i];
System.out.println(rankings[i]);
}
}