Игра в кости
Его бросить заявку на кости. Я хочу подвести итоги игры в кости и представить их пользователю. В настоящее время изображение кубика изменится после того, как я нажму кнопку "Нажмите, чтобы бросить кубик".
Однако, когда я бросил кубик 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;