2015-09-22 4 views
4

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

Это задание просит меня сделать мошенничество. Три человека играть в игру, и каждый из них имеет специфические требования, чтобы выиграть:

  • один выигрывает, если есть 2 результаты головы и общее количество бросков даже
  • побеждает, если есть 2 результатов хвостики и общее количество бросков даже
  • побеждает, если есть 2 результатов хвостики или головки, а общее число бросаний нечетного

Что я должен сделать, это запустить эксперимент в 300 раз. Каждый раз я должен определить, кто из трех выиграл и сколько раз. И я действительно застрял. У меня почти нет кода, но у меня есть очень общее представление о том, каким должен быть код, но я не могу поместить его на язык Java.

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

Моя идея:

  1. Инициализировать счетчик (1, 2, 3) для каждого человека, так что я могу отслеживать, сколько раз они выигрывают
  2. Инициализировать подсчитывать голову и подсчитывать а хвосты отслеживать случайно сгенерированную последовательность
  3. Используйте цикл for для практически всего эксперимента. Должен быть внешний цикл, который определяет эксперимент, который должен запускаться 300 раз, а внутренний цикл должен содержать инструкции if, которые проверяют, кто выиграл. В каждом операторе if должен быть счетчик, чтобы я мог обновить его для каждого человека. И мне нужен System.out.println(); для печати каждого результата эксперимента.
  4. Распечатать окончательный результат эксперимента, используя ранее установленные счетчики

EDIT: Я попытался изменить то, что все говорили, и он будет выглядеть лучше, спасибо! Но он все еще не делает то, что он должен делать, и мне интересно, почему. Я запускаю код, и я получаю только один вывод; не 300 раз, я хочу, чтобы он бежал. Кроме того, счетчики в конце не содержат информацию о том, кто выиграл, они перезагружаются каждый раз. И иногда выигрывают два человека, а это невозможно. Может ли кто-нибудь прояснить это?

EDIT: Это еще одно обновление кода. Я считаю, что он работает 300 раз! Теперь проблема заключается в выходе. Иногда это говорит; 1 Берни выигрывает, хотя вам, очевидно, нужно как минимум 2 результата для победы Берни. Кроме того, он говорит, что 1 Пенни побеждает, в то время как это также не должно быть возможным. Я что-то испортил в своих заявлениях if?

import java.util.Random; 

public class Assignment3e 
{ 
public static void main(String[] args) 
{     
    int counter1 = 0; 
    int counter2 = 0; 
    int counter3 = 0; 

    Random coin = new Random(); 


    for(int i = 0; i <= 300; i++){ 
     int headCount = 0; 
     int tailsCount = 0; 
     for(int coinToss = 0; coinToss <= 3; coinToss++){ 
      int random = (int) (Math.random() * 6) + 1; 
      String binary = Integer.toBinaryString(random); 

      boolean result = coin.nextBoolean(); 
      if(result){ 
       headCount++; 
       } 
       else{ 
        tailsCount++; 
        } 
     if(headCount == 2 && binary.length() % 2 ==0){ 
       //Amy wins 
       counter1 = counter1 + 1; 
       System.out.println(binary + " Amy wins."); 
      } 
      else if(tailsCount == 2 && binary.length() % 2 == 0){ 
       //Penny wins 
       counter2 = counter2 + 1; 
       System.out.println(binary + " Penny wins."); 
      } 
      else if(headCount == 2 || tailsCount == 2 && binary.length() % 2 != 0){ 
       //Bernie wins 
       counter3 = counter3 + 1; 
       System.out.println(binary + " Bernie wins."); 
      } 
     } 
     } 
     System.out.println("Amy wins " + counter1 + " times."); 
     System.out.println("Penny wins " + counter2 + " times."); 
     System.out.println("Bernie wins " + counter3 + " times."); 
} 

} 
+1

Итак, вы хотите в основном остановить циклы 'for'? Вы можете использовать break для этого –

+0

, вы не «Случайные кости», если используете 'Math.random()' и никогда не используете 'dice' –

+0

Удалите эту бесполезную двоичную строку. И используйте значение 'coinToss', а не' binary.length() ', что не имеет смысла – jhamon

ответ

4

Вы почти все поняли.

Эта часть больше не актуальна, так как OP добавляет требование в комментарии.

Ваш второй for цикл нужно только запустить максимум 3 раза будет по крайней мере, 2 головки или 2 хвостами, а не 10.

Edit: вы можете сделать это с Maximun из 2 подбрасывает: если есть один руководитель и один хвост, победитель является третьим игроком (Bernie)

Теперь на каждой итерации, вы можете сделать случайное десятичное число между 0 и 1, и предположим, если это более 0.5 это голова, чтобы вы увеличивали headCount, иначе вы увеличиваете tailCount. Затем вы можете выполнить тест на счетчиках (и количестве бросков).

Это проще, чем использование двоичной строки.

Edit: Чтобы ответить на ваш комментарий: Посмотрите, где вы инициализирован headCount и tailCount. Помните, что как только один выиграл, эти счетчики должны быть сброшены.

Как это домашнее задание, я не буду размещать код :)

Edit: OP добавить этого нужно просто комментарий о том, что он должен напечатать последовательность, которая приведет к результату каждой игры.

Мы предполагаем, что двоичный код 1 - это голова, а 0 - это хвост. Вам нужно бросить монету 3 раза, чтобы узнать последовательность, если победит Bernie. Поэтому целочисленное значение random, которое преобразуется в двоичную строку, должно быть выполнено только из 3 бит (1 бит = 1 бросок).

random может принимать только значения между 0 и 7.

Как получить все значения в одном кадре, вам не нужен coinToss для цикла больше. Все, что вам нужно сделать, это проверить, соответствует ли начало двоичной строки любому шаблону выигрыша (11 для 2-х головок, 00 для 2-х хвостов, в другом случае выигрывает Берни)

+0

Спасибо, я изменил комментарий и 0.5! Теперь у меня все еще есть проблема, что в моей программе все еще говорят, что кто-то выиграл, даже если он выводит только один 1, в то время как этого не должно быть. И я не могу заставить его работать в течение 300 раз, на которых я собирался; теперь это всего лишь 3 случая. – Wren

+0

Поскольку я не знаю, как вы внедрили модификации, я больше не могу вам помочь. – jhamon

+0

Я загрузил код, который я изменил, извините, я забыл это сделать! – Wren

0

Итак, есть несколько вещей, которые я вижу здесь :

  • Вы не обновляют headCount или tailCount в любом месте. Это должно быть то, что вы используете, чтобы отслеживать количество переводов монет.

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

  • Вы используете очень широкий диапазон для вашего результата, когда будет достаточно простого nextBoolean. Вы можете использовать его как это в цикле:

    boolean result = coin.nextBoolean(); // this renames dice to coin 
    if(result) { 
        headCount++; 
    } else { 
        tailCount++; 
    } 
    
  • Общее количество бросков является всегда текущее значение текущей итерации (плюс 1). Итак, в вашем случае вы можете просто заменить sum на j, но вы бы хотели дать ему более содержательное имя, например coinTosses.

+0

Спасибо, я редактировал свой код. У меня все еще есть проблемы с этим, потому что это позволяет более чем одному человеку выиграть за один раунд. Он также говорит, что 1 действителен для победы, в то время как я думал, что я установил, что это не так. Никто не сможет выиграть с одним флип. Я зациклился на том, как сделать эту работу. – Wren

0

Если вы используете Random() объекта, в любом случае для монет nextBoolean(), почему бы не заменить int random = (int) (Math.random() * 6) + 1; с int random = coin.nextInt([range here])?

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