Игра в кости

Его бросить заявку на кости. Я хочу подвести итоги игры в кости и представить их пользователю. В настоящее время изображение кубика изменится после того, как я нажму кнопку "Нажмите, чтобы бросить кубик".

Однако, когда я бросил кубик 1, результат не будет добавлен (+0), а когда я бросил кубик 2, результат будет только (+1). Я понятия не имею, что не так с моим кодом:

public partial class PigForm : Form
{
    Image[] diceImages;
    int[] dice;
    Random roll;

    private void rollDieBotton_Click(object sender, EventArgs e)
    {
        RollDice();
    }

    private void RollDice()
    {
        for (int i = 0; i < dice.Length; i++)
        {
            var currentRoll = roll.Next(0, 6);
            dice[i] += currentRoll;
            dicePictureBox.Image = diceImages[currentRoll];
            playersTotal.Text = String.Format("{0}", dice[i]);
        }
    }

    private void PigForm_Load(object sender, EventArgs e)
    {
        diceImages = new Image[6];
        diceImages[0] = Properties.Resources.Alea_1;
        diceImages[1] = Properties.Resources.Alea_2;
        diceImages[2] = Properties.Resources.Alea_3;
        diceImages[3] = Properties.Resources.Alea_4;
        diceImages[4] = Properties.Resources.Alea_5;
        diceImages[5] = Properties.Resources.Alea_6;

        dice = new int[1] { 0 };
        roll = new Random();
    }
}

7 ответов

Решение
  • Прежде всего, наличие целочисленного массива для игры в кости бессмысленно, потому что вам нужен только один номер, что также означает, что вам не нужен цикл для него, потому что он никогда не будет повторяться во второй раз.
  • Во-вторых, ваше случайное число включается от нуля до пяти включенных, и вы хотите, чтобы оно было от 1 до 6.

Ваш код с несколькими правками:

var currentRoll = roll.Next(1, 7); 
dice = currentRoll; // there should not be += operator because the result of the next roll will be absurd
dicePictureBox.Image = diceImages[currentRoll - 1]; // -1 because your array is zero-based which means that it starts from 0

Вот как действительно работает случайный класс. Начальное значение, которое в вашем случае равно 1, включено, но в конце нет, поэтому вам нужно 1,7, потому что оно вернет число от 1 до 6.

var currentRoll = roll.Next(0, 6)

Это сгенерирует случайное число от 0 до 5 включительно. Вы, вероятно, хотите сгенерировать от 1 до 6:

var currentRoll = roll.Next(1, 7)

Ссылка: метод Random.Next (Int32, Int32)

Редактировать:

dicePictureBox.Image = diceImages[currentRoll - 1]

Несколько замечаний по вашему коду:

  • Зачем использовать массив, если он всегда будет содержать одно целое число? Это также делает цикл for совершенно бесполезным. Используйте простое целое число и удалите цикл.
  • Next() метод Random класс имеет два параметра. Первый включает в себя нижнюю границу, второй - исключительно верхнюю границу. В вашем случае это означает, что 0 будет возможным числом, а 6 никогда не произойдет. (Страница MSDN: метод Random.Next (Int32, Int32))

Вот небольшая модификация вашего кода:

public partial class PigForm : Form
{
    Image[] diceImages;
    int dice;
    Random roll;

    private void rollDieBotton_Click(object sender, EventArgs e)
    {
        RollDice();
    }

    private void RollDice()
    {
        var currentRoll = roll.Next(1, 7);
        dice += currentRoll;
        dicePictureBox.Image = diceImages[currentRoll-1];
        playersTotal.Text = String.Format("{0}", dice);
    }

    private void PigForm_Load(object sender, EventArgs e)
    {
        diceImages = new Image[6];
        diceImages[0] = Properties.Resources.Alea_1;
        diceImages[1] = Properties.Resources.Alea_2;
        diceImages[2] = Properties.Resources.Alea_3;
        diceImages[3] = Properties.Resources.Alea_4;
        diceImages[4] = Properties.Resources.Alea_5;
        diceImages[5] = Properties.Resources.Alea_6;

        dice = 0;
        roll = new Random();
    }
}

Вы позволяете currentRoll переменная будет что-нибудь между [0, 6], Это включает 0 но исключает 6, Вы, вероятно, должны измениться на var currentRoll = roll.Next(1, 7);

Редактировать для комментария: Затем для доступа к значениям вашего массива (который проиндексирован с нуля) вы должны вычесть одно из результата вашего броска.

Как уже отмечали другие, Random.Next(a, b) генерирует случайное число между включающим и исключающим b.

Хотя было бы просто сделать

var currentRoll = roll.Next(1, 7);

что бы разбить строку доступа к массиву у вас две строки позже.

Вместо этого вам лучше всего изменить строку добавления, чтобы сделать

dice[i] += currentRoll + 1;

Взгляните на документацию по методу Random.Next(int, int):

http://msdn.microsoft.com/en-us/library/2dx6wyd4%28v=vs.110%29.aspx

Там вы увидите, что нижняя граница является включающей, а верхняя - исключительной. Следовательно, Next(0,6) означает, что вы получаете 0, 1, 2, 3, 4 или 5.

Я не совсем понял, в чем ваша проблема, но я заметил что-то, что выглядит неправильно.

Попробуйте изменить:

dice[i] += currentRoll;

С:

dice[i] += currentRoll+1;
Другие вопросы по тегам