Я работал над практическими задачами для своего класса по информатике, и один из них гласит следующее:
Пара костей катится многократно. Если появляется «вагончик» (6-6), игрок А выигрывает. Если нет, но 7 появляется дважды подряд (например, один кубик показывает 7, а затем после того, как вы бросите оба кубика снова, появляется еще 7), выигрывает B. Напишите программу на C ++, чтобы бросить пару кубиков 1000 раз и вывести, сколько раз A и B выиграли бы.
Итак, я получил основной костяк программы и протестировал ее несколько раз, но до сих пор каждый раз B-игрок показывал победу 0 раз. Выигрыши игрока A менялись каждый раз, когда я запускал программу, поэтому я считаю, что A правильно закодирован, но любые советы или отладка будут высоко оценены. Программа:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
int die1, die2, store = 0, awin = 0, bwin = 0;
srand(time(NULL));
for(int i = 0; i < 1000; i++)
{
die1 = rand()% 6+1;
die2 = rand()% 6+1;
if(die1 == 6 && die2 == 6)
{
awin++;
}
else if(die1 == 7 || die2 == 7)
{
store = 1;
}
if(store == 1 && die1 == 7)
{
bwin++;
store = 0;
}
else if(store == 1 && die2 == 7)
{
bwin++;
store = 0;
}
store = 0;
}
cout << "A has won " << awin << " times and B has won " << bwin << " times." << endl;
system("pause");
}
rand() % 7
НИКОГДА не даст вам результат 7. Это остаток от числа, разделенного на 7, так что вы получите что-нибудь между 0 и 6.
Имея в виду ваш комментарий, просто проверьте, что die1 + die2 == 7
и вы будете отсортированы.
rand()%6+1
возвращает диапазон от 1 до 6.
store
назначается только при условии, что кубик бросает 7, что никогда не происходит.
bwin
увеличивается только в том случае, если store
равно броску кубика, что также никогда не происходит, поскольку хранилище инициализируется равным 0 и условия для его переназначения (бросок 7) никогда не могут быть выполнены.
Следовательно, bwin
всегда 0 и awin
увеличивается только тогда, когда оба кубика бросают 6.
Все в этой части кажется правильным:
if(die1 == 6 && die2 == 6) {
awin++;
}
После этого все становится на бок.
Сначала проверьте, был ли предыдущий бросок равен 7 и соответствует ли текущий бросок предыдущему броску:
if(store == 7 && store == die1 + die2) {
Если это имеет значение true, b выиграл:
bwin++;
}
Затем сохраните значение текущего броска, чтобы вы знали об этом при следующем броске:
store = die1+die2;
Вы должны проверять не каждый кубик против 7, а сумму двух кубиков.
Попробуй это
for(int i = 0; i < 1000; i++)
{
die1 = rand()% 6+1;
die2 = rand()% 6+1;
if(die1 == 6 && die2 == 6)
{
awin++;
}
else if (store == 7 && (die1 + die2) == 7)
{
bwin++;
}
store = die1 + die2;
}