2010-09-14 85 views
2

一個魔力橋組合在魔力橋的遊戲,對於那些誰不知道,你有4種顏色,並與他們13點不同的數字(SO 4×13 = 52個唯一瓦片),其中瓷磚你必須用它來組隊。有兩種類型的組:如何驗證與王牌

  • 不同的顏色,相同的數字(例如R1-B1-G1
  • 相同顏色,數字序列(如G6-G7-G8

我寫的代碼是獲得一個列表的瓷磚並檢查它是否是有效的組合。到目前爲止,它的工作原理非常簡單。

它,當我們引進小丑瓷磚變得困難。您可以將這些圖塊用作任何圖塊來完成組合(例如G6-R6-J),並且您可以使用多個圖塊(例如R4-R5-J-J-R8)。

我計算過,我會驗證具有王牌組合在兩個步驟:

  1. 替換他們站在了片中的所有王牌。
  2. 驗證「歸一化」基團與現有碼(除非步驟1,因爲它已經看到了組合是無效的投擲錯誤)。

現在,該怎麼辦第1步?我認爲這是相當簡單的,如果只有一個小丑每組允許:

  • 如果相鄰百搭的磚是相同顏色的,右邊比左邊高2,與其間
  • 數代替
  • 如果相鄰瓷磚的編號相同但顏色不同,請替換爲尚未存在的顏色。
  • 並相同,但修改了一下,如果小丑在開頭或結尾

不幸的是,多個王牌是允許的,這使它成爲一個有點複雜,我被困在如何解決。

回答

2

如果硬要執行步驟1,你做的第一件事,你製造麻煩自己。從這個角度來看,解決這個問題在計算上是無效的。你最終會用這種方法做什麼,就是嘗試所有組合的待辦事項。 這是一個壞主意。

這裏有一個替代的方法,將毫不費力的工作:

  1. 是否含有組0或1個非小丑,並執行組至少包含三片那麼成功。
  2. 所有的非jokers的顏色都是相同的顏色,然後成功。
  3. 是否所有的碎片躺在等(1,2,小丑,4)其中所有王牌自動採取值一個比前片更高。如果是這樣,那麼成功。
  4. 如果以上都不是,則失敗。

依次執行所有這些檢查,你會發現如果一組件是一個有效的組。

對於此步驟3,你必須考慮一些序列可能是相反的,比如(joker,3,2,1)。 檢測這種情況下,你可以快速掃描非jokers,看看他們是增加還是減少,然後考慮這些(jokers將有一個比以前少一個值)。

請注意,只有在步驟2中的顏色顯着,並且只有在步驟3中才有意義。

+0

幾乎正確。步驟2應該是*它們是否具有相同的值*並且步驟3應該檢查它們是否都具有相同的顏色 – 2010-10-29 14:14:46

+0

我不記得遊戲的確切規則。當然,如果三個相同的值是一個有效的組,那麼他們也應該在第二步中檢查(除了第二步)。 – Zuu 2010-10-31 10:17:29

2

最近,我寫了一個Android Rummikub遊戲,可能是,我的代碼可以幫助您 (或者可能已經太晚了;但仍然可以幫助其他人)。 我不確定,如果有錯誤。因爲我沒有檢查太多。

我假設數字0〜105。 (B1〜0,B13〜12,R1〜13 ... G13〜51,B1〜52 ... G13〜103 GHOST1〜104,GHOST2〜105)

這裏是代碼:

public boolean isLegal(List<Byte> cards) 
{ 
    byte ghostNum = 0; 
    byte ghostRemain = 0; 
    byte size = (byte) cards.size(); 
    if (size == 0) 
    { 
     return true; 
    } 
    else if (size < 3) 
    { 
     return false; 
    } 

    //get the num of ghostcard 
    Collections.sort(cards); 
    if (cards.get(size - 1) >= 104) 
    { 
     ghostNum++; 
     if (cards.get(size - 2) >= 104) 
     { 
      ghostNum++; 
     } 
    } 
    ghostRemain = ghostNum; 

    byte[] a = new byte[size - ghostNum]; 
    byte[] b = new byte[size - ghostNum]; 
    for (byte i = 0; i < size - ghostNum; i++) 
    { 
     a[i] = (byte) (cards.get(i) % 13); // the num of the tiles 0~12 
     b[i] = (byte) ((cards.get(i)/13) % 4); // the color of the tiles 0~3(B,R,Y,G) 
    } 
    Arrays.sort(a); 
    Arrays.sort(b); 
    // tiles seems in same color 
    if (b[0] == b[size - 1 - ghostNum]) 
    { 
     for (int i = 0; i < size - 1 - ghostNum; i++) 
     { 
      if (a[i + 1] - a[i] != 1) 
      { 
       ghostRemain = (byte) (ghostRemain - a[i + 1] + a[i] + 1); 
       if (ghostRemain < 0) 
       { 
        return false; 
       } 
      } 
      if (b[i] != b[i + 1]) 
      { 
       return false; 
      } 
     } 
     return true; 
     // tiles in different colors 
    } 
    else if (b[0] != b[1]) 
    { 
     for (int i = 0; i < size - 1 - ghostNum; i++) 
     { 
      if (a[i] != a[i + 1]) 
      { 
       return false; 
      } 
      if (b[i] == b[i + 1]) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
    return false; 
}