2013-11-21 2 views
0

У меня проблемы с моей петлей. Цикл, который, как я думаю, прекрасно работает в теории, только когда я пытаюсь свалить его, он говорит, что он должен быть статичным. Я меняю его на статический, а генератор для случайного числа больше не работает, любые предложения будут оценены.Пример игры Nim Статические и случайные вопросы

Вопрос Игра Nim. Это известная игра с несколькими вариантами. Следующий вариант имеет интересную стратегию выигрыша. Два игрока поочередно берут шарики из кучи. В каждом ходу игрок выбирает количество шариков. Игрок должен взять хотя бы одну, но большую часть мрамора. Затем другой игрок делает поворот. Игрок, который берет последний мрамор, проигрывает.

Для примера. Если начальная свая начинается со 100, тогда игрок 1 может принимать от 1 до 50 мрамор. Предположим, что игрок 1 берет 20 мрамор, разрезая кучу до 80 мрамор. Игрок 2 может занимать от 1 до 40 мраморов. Это продолжается до тех пор, пока все мраморы не исчезнут.

Напишите программу, в которой компьютерные игроки против человеческого противника. Создайте случайное целое число от 10 до 100, чтобы обозначить начальный размер сваи. Создайте случайное целое число от 0 до 1, чтобы решить, берет ли компьютер или человек первый оборот. Создайте случайное целое число от 0 до 1, чтобы определить, играет ли компьютер умный или глупый. В глупом режиме компьютер просто берет случайное юридическое значение (между 1 и n/2) из ​​сваи всякий раз, когда у него есть поворот. В интеллектуальном режиме компьютер снимает достаточное количество мрамора, чтобы сделать размер сваи мощностью два минус 1 - то есть 3, 7, 15, 31 или 63. Это всегда законный ход, за исключением случаев, когда размер куча в настоящее время составляет менее двух раз. В этом случае компьютер совершает случайный юридический ход (значение от 1 до n/2).

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

ПРИМЕЧАНИЕ. Вам не нужно беспокоиться о округлении, когда числа, с которыми вы работаете, являются нечетными. Просто используйте целочисленное деление, которое усекает (удаляет без округления) десятичные разряды деления.

МОЙ КОД

import java.util.Random; 
import java.util.Scanner; 
public class Nim 
{ Random generator= new Random(); 
    int turn= generator.nextInt(2); 
int pile= generator.nextInt(91) + 10; 
    int smartDumb= generator.nextInt(2); 
    Scanner in= new Scanner(System.in); 

    public static void main(String [] args){ 
     String Comp; 
     int currentPile= pile; 

      while (pile>0){ 
      int take=0; 

       if(smartDumb==1) 
           Comp="dumb"; 
           else Comp= "smart"; 
       if (turn == 1) 
         turn = 0; 
       else 
         turn = 1; 
         { 
          if (turn==0){ 
           System.out.println("Please take some marbles."); 
           currentPile=pile-in.nextInt(); 
           turn=1; 
           } 
           else 
           if (comp="dumb") 
           take= generator.nextInt(1,currentPile); 
           Currentpile= currentPile-take; 

           if (comp=="smart") 
           if (currentPile > 64) 
            currentPile=63; 
           if (currentPile > 32 && currentPile < 63) 
            currentPile=31; 
           if (currentPile > 16 && currentPile < 31) 
            currentPile=15; 
           if (currentPile > 8 && currentPile < 15) 
            currentPile=7; 
           if (currentPile > 4 && currentPile < 7) 
           currentPile=3; 
           if (currentPile == 2) 
           currentPile = 1; 
           if (currentPile==1) 
           currentPile=0; 

           System.out.println("The game is over!"); 
           break; 




     } 
    } 
}} 
+2

«Когда я пытаюсь вам свалить, он говорит, что он должен быть статичным». Вы очень плохо описываете свою проблему. Мне кажется, что основная часть вопроса описывает вашу игру. Вместо этого вы должны указать сообщение об ошибке, которое вы получаете, когда пытаетесь скомпилировать (называемый stacktrace) – user2651804

ответ

0

Я думаю, что вам нужно брекеты следующие ваши ИФ:

if (comp="dumb") 

и

if (comp=="smart") 

Это также очень полезно для разбивки код на меньшие подпрограммы так вы можете тестировать/отлаживать меньшие куски кода за раз

1

В то время как vandale правильно, что вы должны использовать {} вокруг тела ваших операторов if, ваша непосредственная проблема в том, что у вас есть метод static (main), пытающийся получить доступ к нестатическим полям класса Nim. Это не разрешено. Чтобы получить доступ к нестатическому полю, вам нужно иметь экземпляр класса, а вы этого не делаете. Поскольку вы, очевидно, новичок, я не буду слишком глубоко вникать в то, что все это значит (мы оставим это для вашего профессора). На данный момент вам нужно знать, что с mainstatic единственными переменными, к которым он может обращаться, являются его собственные (те, которые определены внутри него) или другие переменные static, определенные вне его.

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

Random generator= new Random(); 

Который не является статичным. Поэтому его необходимо заменить на

static Random generator = new Random(); 

Конечно, следующая строка повторяет ту же ошибку.

int turn= generator.nextInt(2); 

должен быть

static int turn = generator.nextInt(2); 

И так далее. Статический липкий. Статические вещи могут иметь доступ только к другим статическим вещам.

Другой, вероятно, лучше альтернатива переместить эти объявления внутри метод main. Поскольку вы не используете какие-либо другие методы, нет причин объявлять их на верхнем уровне, и вам не нужно будет объявлять их static.

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