2015-01-20 2 views
-2
private static void algorithm2() { 
    String name = ""; 
    int high = (char)90; 
    int low =(char) 66; 
    int letter; 
    int direction; 
    do { 
     letter = (high + low)/2; 
     String[] choices = { "Before", "This is the letter", "After", "Done" }; 

     direction = JOptionPane.showOptionDialog(null, 
       "Is the next letter in your name a(n) \'" +(char) letter 
         + "\' or is it after/before it? ", "Option 2", 
       JOptionPane.DEFAULT_OPTION, 
       JOptionPane.PLAIN_MESSAGE, 
       null, choices, "Option 2"); 

     if (direction == 0) 
      low= letter - 1; // 

     if (direction == 1){ 
      name+=(char)letter; 
     } 

     if(direction==2){ 
      high = letter + 1; // last guess was too high 
     } 
     if (direction == 3) 
      break; 
    } while (direction != 1); 

    JOptionPane.showMessageDialog(null, "Thanks for playing " + name + "!"); 
} 

Угадайте среднюю букву в каждой последовательности возможных букв. В первый раз это m или n. Всякий раз, когда угадывается вопрос, спрашивайте у пользователя, правильно ли оно: а) правильное предположение, б) правильный ответ раньше в алфавитном порядке, чем предположение, или в) правильная буква позже в алфавитном порядке, чем догадка. Откорректируйте последующие догадки соответственно, всегда угадывая среднюю букву в оставшемся наборе возможных букв. Когда число возможностей четное, не имеет значения, угадаете ли вы первую или вторую «среднюю» букву. Когда есть только одна возможность, этот является средним выбором в списке одного значения.Как заставить мой метод работать правильно?

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

+1

Несомненно, 'low = letter - 1' должно быть' high = letter - 1', а 'high = letter + 1' должно быть' low = letter + 1'? – ruakh

+0

Ну, какие диагностические проверки вы выполнили? Вы пробовали отладку? Если да, то что случилось? Какая неверная буква отображается? Правильно ли интерпретируется направление? –

+0

Действительно, комментарий «последнее предположение было слишком высоким» не соответствует опции «следующая буква после [буквы отображается]». –

ответ

0

Как люди отметил в комментарии:

if (direction == 0) 
    low= letter - 1; // 

Должно быть

high = letter - 1; 

Аналогично,

if(direction==2){ 
    high = letter + 1; // last guess was too high 
} 

Должно быть

low = letter + 1; 

Более того, когда direction == 1 вы завершить цикл:

while (direction != 1); 

, так что пользователь не может заполнить более чем 1 символ, так что вы должны изменить его на while(true); или while(direction != 3)

public static void main(String[] args) { 


    String name = ""; 
    int direction; 
    do { 
     int high = (char) 90; 
     int low = (char) 66; 
     int letter; 

     do { 
      letter = (high + low)/2; 
      String[] choices = { "Before", "This is the letter", "After", 
        "Done" }; 

      direction = JOptionPane.showOptionDialog(null, 
        "Is the next letter in your name a(n) \'" 
          + (char) letter 
          + "\' or is it after/before it? ", "Option 2", 
        JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, 
        null, choices, "Option 2"); 
      System.out.println(direction); 
      if (direction == 0) 
       high = letter - 1; // 

      if (direction == 1 || direction == 3) { 
       name += (char) letter; 
      } 

      if (direction == 2) { 
       low = letter + 1; // last guess was too high 
      } 

     } while (direction != 1 && direction != 3); 

    } while (direction != 3); 

    JOptionPane.showMessageDialog(null, "Thanks for playing " + name + "!"); 
} 

Будьте осторожны при high == low , если пользователь не принимает этот символ, это должно быть ошибкой.

+0

Должны ли clear() в каждом? – user3269660

+0

Это только дает мне около 4 букв для до и 4 буквы для после – user3269660

+0

@ user3269660 Обновленный мой ответ, в основном, вам нужны две петли. –

Смежные вопросы