【问题标题】:Using an array in Random Number Guessing Game在随机数猜谜游戏中使用数组
【发布时间】:2012-03-26 05:12:25
【问题描述】:

我想为我的随机数猜谜游戏实现一个成就系统,但我未能为其构建一个有效的逻辑。 我希望它有一个成就系统来检测 2 或 3 个连续的 CORRECT 答案。

只要有正确答案,cons+1(cons 是变量 im 用于我的成就系统的“连续”功能。

否则,cons-1 和 life-1。

下面是我的代码...我确定逻辑中的错误是因为 cons--;还有生活——;在 扫描数组 的循环中进行匹配(该数组是我用来存储 10 个两位数随机数的数组,这将是每个答案“正确性”的基础。我添加 LOOP 的目的是扫描数组以查找可能的匹配项。

注意:提前感谢您的帮助!

这是我的代码:

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("");

【问题讨论】:

    标签: java


    【解决方案1】:

    我这样做的方法是创建一个数组并将其设置为“123456789”,然后对该数组进行混洗,然后您可以使用 for 循环遍历这个已混洗的数组并提取所需数量的数字一个新的字符串,长度和唯一,即 4 位 5 位唯一随机数

    【讨论】:

      【解决方案2】:

      如您所料,第一个问题是,对于数组中的每个匹配或不匹配,您递增或递减cons(和life)。您需要将其移出循环,每轮猜测只执行一次一次。否则游戏永远不会赢,因为对于任何 10 个不同的数字和任何猜测,其中 9 个肯定会与猜测不同,因此您最终得到 -9 的 cons 和可能的负数 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)而不是数组来简化查找匹配项。

      【讨论】:

      • 感谢您的快速回复!我已经在考虑这个了,但我仍然不知道应该把这些代码放在哪里,这样它只会在每轮猜测中增加或减少一次。
      【解决方案3】:

      如果我对您的描述的理解是正确的,我认为您的逻辑存在很大缺陷。

      我的假设: 用户给出他的猜测,你看看这个猜测是否存在于数组中。

      首先,对于每个不等于他猜测的数字,你会降低玩家的分数,这意味着,即使他猜对了一个,他也会有 9 个错。将该逻辑移出for循环,只需在里面使用一个变量来检查他是否猜到了,然后在外面做你的增加和减少(一旦他猜到了,就跳出for)。

      其次,我不认为你想在错误猜测后减少 cons...如果你想要连续,每个错误的猜测都应该再次将 cons 设置为 0(他必须重新开始)。

      第三: 如果您使用更适合检查给定值是否存在于该结构中的结构(例如 Set),则可以大大简化您的逻辑:

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

      填写该设置,然后您的逻辑将简化为:

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

      希望这会有所帮助。

      【讨论】:

      • 谢谢mr.pcalcao,但是玩家得分是这样的:每当用户猜测时,userscore+10。我认为它可以正常工作,就像我预期的那样(虽然没有搁置你的答案)。我对错误的逻辑感到抱歉。 '因为我只是一个二年级学生,这是我在 java 的第一次学习 =)。而且我不知道如何使用“Set randomValues = new HashSet();”。它也可以像一个存储 10 个两位数的数组一样吗?如果用户的猜测与它匹配,我如何检查每个元素?
      • 是的,我明白,最大的问题只是在 for 内部增加和减少逻辑。就像其他答案也暗示过一样,这需要摆脱 for 循环。如果您的数组可以多次具有相同的值,则 Set 将不起作用(Set 不存储重复值)。在这种情况下,您需要计算用户在循环内部的次数,然后在外部应用游戏逻辑。
      • 哇。是的,谢谢。我完全错过了那个。呃……你能教我如何使用套装吗……我认为这真是个好主意。
      【解决方案4】:

      我建议你改用一个标志——这样,你不会得到任何重复的 ++ 或 -- 操作。也就是说,

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

      【讨论】:

      • @mr.pcalcao,你能教我如何在我的系统中实现 Set 吗?
      • 如果您只是想要一个可用的 Set 来存储几个数字?只需使用 HashSet:docs.oracle.com/javase/1.5.0/docs/api/java/util/HashSet.html
      • @donnyton_i 想使用像单维数组一样的集合,它可以存储 10 个唯一的随机数,这些随机数取决于某个范围(例如 1-20)。我该如何实现呢?
      • 我已经将您链接到 API,因此您应该查看那里并了解 Set 类本身,然后再向我们询问代码来执行此操作。否则,这听起来像是一个新问题。
      猜你喜欢
      • 1970-01-01
      • 2019-11-29
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2018-09-11
      相关资源
      最近更新 更多