2013-12-02 2 views
2

Итак, я должен сделать Java-игру в стиле Nim .... и мне удалось сделать большую часть этого ... У меня просто есть пара вопросов, которые я смущен on:Игра Nim Loop

Вопрос 1: Программа выполняется нормально, и она даже запускается один раз, но после прохождения кода один раз программа завершает работу ... Мне нужна помощь, чтобы понять, почему это происходит (я использую неправильный цикл?)

Вопрос 2: Почему программа всегда выбирает компьютер в так называемом «интеллектуальном режиме»?

Любая помощь будет очень признательна. Спасибо вам, ребята: D

Вот мой код:

import java.util.*; 
public class GameOfNim 
{ 
    public static void main (String [] args) 
    { 
     Scanner in = new Scanner (System.in); 
     Random num = new Random(); 
     int numberLeft = num.nextInt(101-10) + 10; 
     int computerMode = num.nextInt(1); 
     int subtraction = numberLeft; 
     boolean turn = num.nextBoolean(); 

     System.out.println ("The number you start out with is: " + numberLeft); 

     if (computerMode == 0) 
     { 
      System.out.println ("The computer is in smart mode"); 
     } 
     if (computerMode == 1) 
     { 
      System.out.println ("The computer is in dumb mode"); 
     } 

     while (numberLeft > 1) 
     { 
      if (turn == true) 
      { 
       System.out.println ("It is your turn..."); 
       System.out.printf ("Please enter the number you wish to take from the pile (Remember it has to be less than " + numberLeft/2 + "): "); 
       subtraction = in.nextInt(); 
       numberLeft -=subtraction; 
       System.out.println ("The number left is " + numberLeft); 
       turn = false; 
      } 
      if (turn ==false) 
      { 
       System.out.println ("It is the computer's turn..."); 
       if (computerMode == 0) 
       { 
        numberLeft = smartComputer(numberLeft); 
        System.out.println ("The number left is " + numberLeft); 
       } 

       if (computerMode == 1) 
       { 
        numberLeft -= num.nextInt(numberLeft/2); 
        System.out.println ("The number left is " + numberLeft); 
       } 
       turn = true; 
       return; 
      } 
     } 

     if (numberLeft <= 1) 
     { 
      if (turn = false) 
      { 
       System.out.println ("You Win!"); 
      } 
      else 
      { 
       System.out.println ("You're horrible...you lost to a computer."); 
      } 
     } 
    } 

    public static int smartComputer (int num) 
    { 
     int power = 2;   
     while (power < num) 
     { 
      power *=2; 
     } 
     power /= 2; 
     num = power-1; 
     return num; 
    } 
} 
+0

Ну, на самом деле, я понял, что я сделал цикл, я просто должен был избавиться от заявления о возврате, которое я написал после его окончания ... но я до сих пор не знаю, почему он не выберет тупую версию ... – PratikM

+0

Для вашего второго вопроса 'int computerMode = num.nextInt (1);' всегда будет возвращать '0', входя в' smartmode'. И для вашего 1-го вопроса вы можете добавить еще несколько объяснений, что происходит? – Smit

ответ

2

Из documentation из случайных:

Возвращает псевдохаотическом равномерно распределенное значение INT между 0 (включительно) и заданным значением (исключительным).

«Exclusive» означает, что nextInt(n) будет возвращать целое число, которое может быть n-1, но может не быть n. nextInt(n) имеет n различные возможные результаты, в том числе 0.

Простое решение состоит в том, чтобы сделать это nextInt(2), так как существует 2 возможных режима.

3

Random.nextInt (Int N) будет возвращать целочисленное значение в диапазоне от 0 до п эксклюзив. Поскольку вы вычислен computerMode как это:

int computerMode = num.nextInt(1); 

computerMode всегда возвращает 0.

Если есть только два режима, что компьютер может быть в возможно, вы можете использовать nextBoolean вместо этого?

+0

Правда, я мог бы это сделать, но я просто изменил 1 на 2, и теперь он блестяще работает: D YAY – PratikM

2

Поскольку вы указали, что решили свой первый вопрос, я отвечу на второй вопрос.

Эта линия:

Int computerMode = num.nextInt(1) 

Должно быть:

Int computerMode = num.nextInt(2) 

Или, возможно, что-то вроде

Boolean computerMode = num.nextBoolean() 

Согласно документации для Random#nextInt:

Возвращает псевдохаотическом равномерно распределенное значение INT между 0 (включительно) и заданным значением (исключительного) ...

Следовательно, поскольку вы передаете в значении 1, это единственно возможное значение, которое может будет возвращено 0. Я предложил использовать метод nextBoolean, так как похоже, что вы используете метод nextInt для генерации логического значения в любом случае.

+0

Поздно к вечеринке снова. Набрав на моем телефоне ... –