2014-03-01 53 views
0

我有這個撲克紙牌遊戲,其中可能的13張牌等級存儲爲[0至12]。每支持有5張有13張可能卡牌的卡牌。開箱指數因子表乘以打包值返回原始值

最終值是從指數13 5開始(到5的冪)的標識符。

哪些存儲什麼樣的贏手。 然後13個剩餘的5個冪用於存儲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 

試圖從該值中解壓值。 開始試圖找出這裏的數學。

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 

回答

1

你通過這部分正確的..

(357451/28561) = 12      rankings[1] = 12 

但是,這沒有什麼好...

(357451/2197)/((13*2)+1) = 6   rankings[2] = 6 

你需要把你的結果12和繁殖回28561然後從357451中減去,看看剩下的是什麼。在這種情況下,它是14719.

現在,您可以繼續使用該號碼,而不是357451.所以二千一百九十七分之一萬四千七百十九= 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]); 
    } 
} 
+0

所以是這樣的'(28561分之357451)= 12' '(357451%28561)/ 2197 = 6' '(357451%2197)/169 = 9' '(357451%169)/ 13 = 1' '(357451%13)= 3'如何在沒有if語句的情況下檢查第一個值? – SSpoke

+0

所以你也做'357451/371293'來獲得第一個值0? – SSpoke

+1

假設你只是在數字的高端添加額外的值,你可以使用排名[0] =數學。max(0,value-RANKING_FACTORS [0]) –