2013-10-18 38 views
-3

该程序在用户播放时似乎与原始程序一样(实际上,玩这两个游戏的人不应该是能够告诉他们分开)。 在原始程序中,用户猜测1到100之间的随机数。在每次猜测后,程序会返回数字是高于还是低于猜测,直到用户猜测正确为止。数字猜测游戏,强制用户进行最大数量的猜测(Java)

但是,这个程序作弊。与其选择1-100范围内的随机数字,程序根本不会想到隐藏数字,而是以这样的方式回答 ,以便强制用户尽可能多地进行猜测。

我该如何做到这一点?我需要做一个if语句的循环吗?我现在认为可以做的唯一事情就是做一些其他的事情,我甚至不知道这是否会起作用。

我应该继续这个内在的if else的想法,但越来越具体吗?我只是觉得必须有更好的方法。

UPDATE *

好了,所以我想我已经想通了什么,我最初来的,但现在的程序卡住在一个无限循环当我选择与猜测相等的上下选择一个号码。任何想法为什么?

public static int feedback (Scanner console, int guess, int max) { 
     String sorry = "Sorry, that guess is incorrect."; 
     String lower = "The number I am thinking of is lower."; 
     String higher = "The number I am thinking of is higher."; 
     int guessCount = 0; 
     guess = console.nextInt(); 
     int upperBound = max + 1; 
     int lowerBound = 0; 
     if (guess <= max && guess >= 1) { 
      guessCount = guessCount + 1; 
      if (max - guess < guess) { 
        System.out.println(sorry); 
        System.out.println(lower); 
        System.out.print("Your guess? "); 
        upperBound = guess; 
        guess = console.nextInt(); 
        guessCount = guessCount + 1; 
      } else { 
        System.out.println(sorry); 
        System.out.println(higher); 
        System.out.print("Your guess? "); 
        lowerBound = guess; 
        guess = console.nextInt(); 
        guessCount = guessCount + 1; 

      while (upperBound - lowerBound > 2) { 
       if (guess <= max && guess >= 1) { 
        if ((lowerBound + ((upperBound - lowerBound)/2)) < guess) { 
         System.out.println(sorry); 
         System.out.println(lower); 
         System.out.print("Your guess? "); 
         upperBound = guess; 
         guess = console.nextInt(); 
         guessCount = guessCount + 1; 
        } else { 
          System.out.println(sorry); 
          System.out.println(higher); 
          System.out.print("Your guess? "); 
          lowerBound = guess; 
          guess = console.nextInt(); 
          guessCount = guessCount + 1; 
          } 
       } else { 
        System.out.println("Your guess must be in the range 1-" + max + ". Try again."); 
       } 
        } 
        System.out.println("Yes, the number I was thinking of was " + guess); 
       } 
      } else { 
      System.out.println("Your guess must be in the range 1-" + max + ". Try again."); 
      return guessCount; 
     } 
     return guessCount; 
     } 
+0

从crapton开始! – iluxa

+0

想一下这些限制:任何新的答案都不应该与过去的答案相矛盾。用户猜测的范围应该是最大的。然而,对于使用二分搜索的用户来说,作弊最多会迫使他做log2(n)猜测。 – Tarik

+0

你在这里正确的轨道上。但请记住,可用的数字范围不断变化。如果用户猜测90并且你的程序显示“较低”,那么89是新的最高可能数字;现在排除90到100。同样,如果用户猜测20并且程序说“更高”,那么21是新的最低可能数字。您需要跟踪最低和最高可能的数字,并且每个猜测都会更改其中一个数字。 – steveha

回答

0

每个猜测分区可用的数字范围。

在第一次猜测之前,数字可以是1到100之间的任意值。假设用户猜测“60”。这给了我们三种可能性:小于60,等于60或大于60.

现在您需要确定这三种可能性中的哪一种会使用户猜测最长。我会给你一个提示:你不想说用户是正确的,直到只有一个号码留给用户猜测,所以绝对不要接受“60”作为第一个猜测。

您应该能够编写一个接受输入的循环,然后根据输入决定如何回答。例如,如果用户的第一个猜测是“99”,那么您肯定希望您的程序说“太大”。让循环继续运行,直到只剩下一个答案。

祝你好运,玩得开心!

+0

不,我的想法是选择具有更多可能性的范围,我只需要帮助将其转换为代码!我觉得做这件事的唯一方法是单调乏味,重复性和永久性,而且我无法围绕这个方向。我确定有更好的方法。 – user2892771

0

开始与一些变量来定义您的电流范围即

int lower = 1; 
int upper = 100; 

创建这需要用户的猜测的方法。这种方法应该根据猜测如何划分范围(即尽可能保持范围尽可能大以达到目标)来确定哪个范围界限要被替换。然后它应该返回(或打印)更高或更低,然后循环回到获得用户的另一个猜测

// For example 
Starts lower = 1, upper = 100 
User guesses 25 
Replace lower with 25 
say to guess higher 
Get another guess range is now lower = 25, upper = 100 
User guesses 75 
replace upper with 75 
say to guess lower 
get another guess range is now lower = 25, upper = 75 
etc, etc, etc, until guess has to be correct. 
+0

问题在于,我需要在任何时候允许任何猜测。即使它只能是25-75,该程序也需要能够对97的猜测作出响应。 – user2892771

+0

那么在这种情况下,您只是不会替换界限,因为用户显然是延迟 –