2012-03-08 55 views
0

我想實現一個成就係統,以我的隨機數猜測遊戲,但我沒有構建一個有效的邏輯。 我希望它有一個成就係統檢測連續2或3 正確答案。在隨機數猜猜遊戲中使用陣列

每當有正確答案,利弊+ 1(缺點是使用我的成就係統的「連續」功能變數IM。

否則,利弊-1和生活-1。

這裏是我的代碼如下...我確信邏輯中的錯誤是因爲cons - ;和生命 - ;是在循環中掃描陣列匹配(數組是一個即時通訊用來存儲10個兩位數的隨機數,這將成爲每個答案「正確性」的基礎。我的目的是添加LO OP是它將掃描陣列以尋找可能的匹配。

注意:謝謝您提前幫助您!

這裏是我的代碼:

public void cmpans() 
{ 
    String txget; 
    txget=gametext.getText(); 
    String pars; 
    int ans; 
    pars=gametext.getText(); 
    ans=Integer.parseInt(pars); 

    for(int i=0; i<10; i++) //this is my "Array Scanner" Loop 
    { 

     if(ans==arr[i]) 
     { 
      userscore=userscore+10; 
      lbscore.setText("Score: "+userscore); 
      ck[i].setSelected(true); 
      arr[i]=0000; 
      cons++; 
      gametext.setText(""); 
      lblives.setText("life: "+life); 
      lbcons.setText("cons: "+cons); 
     } 
     else if(ans!=arr[i]) 
     { 
      cons--; //this is the cons and life im talking about 
      life--; 
      if(cons==2) 
      { 
       lbachieve.setText("You're a GOOD GUESSER!"); 
       userscore=userscore+20; 
      } 
      else if(cons==4) 
      { 
       lbachieve.setText("You're an AMAZING GUESSER!!"); 
       userscore=userscore+50; 
      } 
     } 
    }gametext.setText(""); 

回答

0

我相信你的邏輯是相當深刻的缺陷,如果我的理解你的描述是正確的。

我的假設: 用戶給出了他的猜測,並且您看到該猜測是否存在於數組中。

首先,你會減少每個數字的球員得分,這與他的猜測不相等,即,即使他確實得到了一個正確的數字,他也會有9個錯誤。將該邏輯從for循環中移出,只需使用裏面的變量來檢查他是否猜到了,然後在外面進行增加和減少(一旦他猜到了,就跳出來)。其次,我不認爲你想在錯誤的猜測後減少缺點...如果你想連續,每個錯誤的猜測應該再次設置cons爲0(他必須重新開始)。

第三: 如果您使用的是結構更適合用於檢查是否存在在該結構中的給定值,就像一組,比如你可以大大簡化你的邏輯:

Set<Integer> randomValues = new HashSet<Integer>(); 

填補成立,然後你的邏輯將被縮減爲:

if(randomValues.contains(ans)){ 
//do stuff 
} else { 
//do other stuff 
} 

希望這有助於。

+0

謝謝mr.pcalcao,但玩家的得分是這樣的:每當用戶猜測,用戶核心+10。我認爲,它的工作原理與我預期的一樣(儘管不排除你的答案)。對於錯誤的邏輯,我很抱歉。 '因爲我只是一個二年級的學生,這是我第一次參加java =)。我不知道如何使用「Set randomValues = new HashSet (); 」。它是否也可以像數組一樣存儲10個兩位數的數字,如果用戶的猜測與它匹配,我如何檢查每個元素? – cryzone 2012-03-08 18:16:56

+0

是的,我明白,最大的問題是增加和減少for內部的邏輯。就像其他的暗示也一樣,這需要去掉for循環。如果您的數組可以多次具有相同的值,那麼Set不起作用(Set不會存儲重複值)。在這種情況下,您需要計算用戶在循環內的次數,然後在外部應用遊戲邏輯。 – pcalcao 2012-03-08 18:21:41

+0

哇。是的,謝謝你。我完全錯過了那一個。呃......你能教我如何使用Set ...我認爲這是一個非常好的主意。 – cryzone 2012-03-08 18:27:52

1

第一個問題是,你猜,你遞增或遞減的陣列中的每個匹配或不匹配cons(和life)。您需要將其移出循環,每次猜測只需一次。否則,遊戲永遠不會贏,因爲對於任何10個不同的數字和任何猜測,其中9個肯定會與猜測不同,因此最終得到cons的-9和可能的負life(取決於您最初的生命數量給予)在第一次猜測後。例如。

boolean guessMatches = false; 

for(int i=0; i<10 && !guessMatches; i++) //this is my "Array Scanner" Loop 
{ 
    guessMatches = (ans==arr[i]); 
} 
if(guessMatches) 
{ 
    userscore=userscore+10; 
    lbscore.setText("Score: "+userscore); 
    ck[i].setSelected(true); 
    arr[i]=0000; 
    cons++; 
    gametext.setText(""); 
    lblives.setText("life: "+life); 
    lbcons.setText("cons: "+cons); 
    if(cons==2) 
    { 
     lbachieve.setText("You're a GOOD GUESSER!"); 
     userscore=userscore+20; 
    } 
    else if(cons==4) 
    { 
     lbachieve.setText("You're an AMAZING GUESSER!!"); 
     userscore=userscore+50; 
    } 
} 
else if(ans!=arr[i]) 
{ 
    cons = 0; //this is the cons and life im talking about 
    life--; 
} 

還要注意的是後猜測是錯誤的,你應該設置cons爲0,而不僅僅是遞減它。否則,你實際上並沒有連續計數比賽。我相應地修改了上面的代碼示例。

此外,正如@pcalcao指出的那樣,通過使用適當的集合(一個Set)而不是一個數組,您可以使查找匹配更加簡單。

+0

感謝您的快速回復!我已經在考慮這個問題了,但即使我應該把這些代碼放在那裏,以至於每次猜測只會增加或減少一次,我仍然處於虧損狀態。 – cryzone 2012-03-08 18:02:56

0

我建議你使用一個標誌,而不是 - 這樣,你不會得到任何重複的++或 - 操作。也就是,

boolean success = false; 

for(int i=0; i<10; i++) 
{ 
    if(ans == arr[i]) 
    { 
     ... 
     success = true; 
    } 
} 

if(success) 
{ 
    cons++; 
} 
else 
{ 
    cons = 0; 
} 
+0

@ mr.pcalcao,你可以請教我如何實現設置爲我的系統? – cryzone 2012-03-09 00:44:08

+0

如果你只是想要一個可用的存儲一對夫婦的數字?只需使用HashSet:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashSet.html – donnyton 2012-03-09 10:26:05

+0

@donnyton_i想要使用像單維數組這樣的設置,它可以存儲10個唯一的隨機數取決於一定的範圍(例如1-20)。我怎麼能實現這個? – cryzone 2012-03-09 16:28:55

0

我這樣做的方式是創建一個數組並將其安置到「123456789」,然後對該數組進行洗牌,然後您可以使用for循環遍歷這個現在洗過的數組,然後根據需要提取儘可能多的數字使一個新的字符串長和唯一即4位數5位唯一隨機數