2015-11-06 2 views
-3

Я пытаюсь запустить мою программу, чтобы запустить пользователя с 20 жизнями, а в то время как Lives больше 0, переверните монету (генератор случайных чисел 0 (хвосты) или 1 (главы)). Каждый раз, когда пользователь получает Heads, он добавляет 1 к счетчику Heads и 1 к Flips counter. Каждый раз, когда пользователь получает Tails, он получает 1 из Lives и добавляет 1 к счетчику Flips. Я думаю, что моя единственная проблема - мой генератор случайных чисел !? Пожалуйста, будь добр, общая n00b :)Генератор случайных чисел C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Coin_Flip_2015 
{ 
    public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private Random r = new Random(1); 
    private void cmdFlipCoin_Click(object sender, EventArgs e) 
    { 

     int rand = r.Next(1); 
     int Heads; 
     int counterFlips; 
     int Lives; 

     Lives = 20; 
     Heads = 0; 
     counterFlips = 0; 

     while (Lives > 0) 
      if (rand == 0) 
      { 
       Lives = Lives -= 1; 
       counterFlips++; 
      } 

      else if (rand == 1) 
      { 
       Heads = Heads += 1; 
       counterFlips++; 
      } 

     lblFlips.Text = "Flips = " + counterFlips.ToString(); 
     lblHeads.Text = "Heads = " + Heads.ToString(); 
     lblLivesLeft.Text = "Lives Left = " + Lives.ToString(); 
     MessageBox.Show("sorry you are out of lives m8"); 
     } 
    } 
} 

Form.png

+2

В чем проблема? Как это не работает по сравнению с тем, как вы ожидаете? – Dai

+0

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

+0

Начиная с 20 и имея вероятность 50/50, вы никогда не достигнете нуля. – jdweng

ответ

1

Random.Next(int) метод

Возвращает неотрицательное случайное целое число, которое меньше указанного максимума.

Так r.Next(1) всегда 0. Используйте r.Next(2), чтобы получить 0 или 1.

Вы также должны переместить rand = r.Next(1); внутри цикла while. Теперь он назначается только один раз, в начале метода.

+1

fyi, всегда будет то, что было установлено, и не изменяется, поскольку оно находится вне времени loop – Sorceri

+0

@Sorceri Правильно, как только я прочитал «random 0/1» в вопросе, я быстро просмотрел код для «Next (1)», игнорируя все остальное. Благодаря! –

1

Я возьму качели на фиксируя все вопросы:

public partial class Form1 : Form 
{ 
    int Heads, counterFlips, Lives; 

    public Form1() 
    { 
     InitializeComponent(); 
     Lives = 20; 
     Heads = 0; 
     counterFlips = 0; 
    } 

    private Random r = new Random(); 

    private void cmdFlipCoin_Click(object sender, EventArgs e) 
    { 
     int rand = r.Next(2); 

     if (Lives > 0) 
     { 
      if (rand == 0) 
      { 
       Lives -= 1; 
       counterFlips++; 
      } 
      else 
      { 
       Heads += 1; 
       counterFlips++; 
      } 
     } 
     else 
      MessageBox.Show("sorry you are out of lives m8"); 

     lblFlips.Text = "Flips = " + counterFlips.ToString(); 
     lblHeads.Text = "Heads = " + Heads.ToString(); 
     lblLivesLeft.Text = "Lives Left = " + Lives.ToString(); 
    } 
} 

Вопросы:

  • Heads, counterFlips и Lives переменные хранятся локально, они должны быть глобальными
  • Код был изменен так, что вы переворачиваете монету каждый раз, когда вы нажимаете кнопку (изменили while на if). while Петли, которые имеют возможность никогда не выходить, не должны использоваться в потоках пользовательского интерфейса.
  • private Random r = new Random() Извещение удалено 1, используйте конструктор по умолчанию, чтобы правильно его засеять.
  • Добавлен «еще», чтобы показать, когда были использованы жизни, он показывает сообщение
  • изменившие Lives = Lives -= 1 (то же самое с главами) для правильного кода
  • Используется r.Next(2) получить либо 0 или 1, так как верхняя граница является эксклюзивным.

Кроме того, я не уверен, что вы делаете с Lives и Heads номера, поэтому я оставлю это до вас, чтобы исправить.

+0

Большое спасибо всем парням с обратной связью, только что начал программировать несколько недель назад, и я просто прорабатываю книгу, прося меня выполнять определенные задачи. Это не лучшая книга. Очевидно, мне нужно потратить гораздо больше времени на это. Спасибо, парни. – Canine

1

Здесь немного отличается .. snap избили меня на несколько секунд!

public partial class Form1 : Form 
{ 
    // Leave the seed alone on this line 
    private readonly Random _r = new Random(); 

    // these need to be outside of your Click event 
    private int _counterFlips; 
    private int _heads; 
    private int _lives = 20; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void cmdFlipCoin_Click(object sender, EventArgs e) 
    { 
     // x = starting number, y = ending number + 1 
     // This should be either a zero or one: 
     int rand = _r.Next(0, 2); 

     switch (rand) 
     { 
      default: 
       _lives --; 
       _counterFlips++; 
       break; 
      case 1: 
       _heads ++; 
       _counterFlips++; 
       break; 
     } 

     if (_lives < 1) 
     { 
      MessageBox.Show(@"sorry you are out of lives m8"); 
      button1.Enabled = false; 
      return; 
     } 


     lblFlips.Text = @"Flips = " + _counterFlips; 
     lblHeads.Text = @"Heads = " + _heads; 
     lblLivesLeft.Text = @"Lives Left = " + _lives; 

    } 
}