2014-10-04 2 views
1

Я пытаюсь создать Number Guessing Game в Java, который отличается от обычного, где вы угадываете число, и программа сообщает вам, является ли она высокой или низкой. Я пытаюсь построить тот, где программа угадывает номер, и вы говорите, является ли оно высоким или низким, пока программа не найдет номер, который вы выбрали.Java Number-Guessing Game Issue

У меня возникла проблема с оператором if, где число, которое программа считает слишком низким.

Конкретная проблема здесь:

if (hilow.equals("l")) 
     { 
      middle = middle * 2; 
      System.out.println(middle); 
      numbGuesses++; 
     } 

Вся программа до сих пор является следующее:

import java.util.*; 

public class NumbGuess 
{ 
    public static void main(String args[]) 
    { 
     int numbGuesses = 0; 
     boolean win = false; 
     int hi = 1000000; 
     int low = 0; 
     Scanner input = new Scanner(System.in); 
     int middle = hi/2; 
     System.out.println(middle); 


    while (win == false) 
    { 
     String hilow = input.nextLine(); 

     if (hilow.equals("h")) 
     { 
      middle = middle/2; 
      System.out.println(middle); 
      numbGuesses++; 
     } 

     if (hilow.equals("l")) 
     { 
      middle = middle * 2; 
      System.out.println(middle); 
      numbGuesses++; 
     } 

     if (hilow.equals("y")) 
     { 
      win = true; 
      System.out.println("It took: " + numbGuesses + " guesses"); 
     } 
    } 
} 
} 

Проблема Я бегу в это постоянный цикл, когда число слишком мало:

enter image description here

Я думаю, что нужно сп ange, для чего средний управляется, чтобы получить рабочий результат.

ответ

2

Ваша логика ошибочна. Когда число слишком низкое, вы не должны просто умножаться на 2, а когда он слишком высок, вам не следует просто делиться на 2.

Новое предположение должно находиться в середине диапазона. Если ваше первое предположение - 500000, и пользователь говорит, что он слишком низок, число находится между 500 000 и максимальным числом (1000000), поэтому новое предположение должно быть (1000000-500000)/2=750000, а не 500000*2. Если первое предположение слишком велико, число находится между минимальным номером (0) и 500000, поэтому следующее предположение должно быть (500000-0)/2=250000.

+0

Хорошо, спасибо. Я новичок в этом, и это мой маленький любимый проект. Ваш ответ был очень полезным. –

1

Ваша проблема связана как с высокими, так и с низкими if заявлениями. Вы должны корректировать свои границы каждый раз, когда делается предположение, например, если предположение было слишком высоким, необходимо установить новую привязку high к угадыванию. Аналогично, если догадка была слишком низкой, то необходимо установить новую привязку low к угадыванию.

0

Проблема не является постоянной петлей. Эта программа делает именно то, что вы спрашиваете:

В нем сказано 500000, вы сказали, что разделите ее на 2 (= 250000). Затем вы сказали, чтобы он умножился на 2 (= 500000). И до сих пор ...

Проблема в вашей логике. Вы должны установить лимиты (hi и low), когда программа получает информацию. Например, если программа угадывает 500000, и вы сказали, что она слишком высокая, теперь ваши лимиты между 1 и 499999 (= 500000-1). Если он слишком низок, теперь ваши лимиты между 500001 (= 500000 + 1) и 1000000. Предположите, что вы пересчитаете middle с hi и low ((hi+low)/2).

Надеюсь, что это поможет.

0

Логика, которую вы используете, чтобы изменить мнение компьютера, не совсем корректна. То, что вы хотите делать (и как оно выглядит, как вы пытаетесь сделать), - это двоичный поиск .

В вашем примере 50000 слишком высоко, 25000 слишком низко, поэтому следующее предположение не должно удваиваться 25000, оно должно быть в середине 50000 и 25000, или что-то вроде 37500.

В общем, вы должны отслеживать «низкую догадку, которая была слишком высокой», и «наивысшее предположение, которое было слишком низким», и следующее предположение должно быть на полпути между ними.

0

Вы должны динамически изменять привет и низким, а не держать их статическими. В зависимости от ответа пользователя, программа должна изменить значение привета или низкой и заменить его с текущим средней декрементируется или увеличивающейся соответственно, а затем установить новый средний усреднения нового привета и низкий.

Вот что я пытался, и это, кажется, работает:

import java.util.*; 

public class NumbGuess 
{ 
    public static void main(String args[]) 
    { 
     int numbGuesses = 0; 
     boolean win = false; 
     int hi = 1000000; 
     int low = 0; 
     Scanner input = new Scanner(System.in); 
     int middle = hi/2; 
     System.out.println(middle); 


    while (win == false) 
    { 
     String hilow = input.nextLine(); 

     if (hilow.equals("h")) 
     { 
      hi = middle - 1; 
      middle = (low + hi)/2; 

      System.out.println(middle); 
      numbGuesses++; 
     } 

     if (hilow.equals("l")) 
     { 
      low = middle + 1; 
      middle = (low + hi)/2; 

      System.out.println(middle); 
      numbGuesses++; 
     } 

     if (hilow.equals("y")) 
     { 
      win = true; 
      System.out.println("It took: " + numbGuesses + " guesses"); 
     } 
    } 
} 
}