2012-03-08 54 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位唯一随机数