У меня написана следующая программа: умереть.ч
class Die {
public:
// Randomly assigns a value to roll_value in the range of 1 to 6
void roll();
// Returns roll_value
int rolled_value() const;
private:
// Stores a randomly assigned value
int roll_value;
// Die sides, initialized to 6
int sides = 6;
};
умереть.cpp
#include "die.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void Die::roll() {
srand(time(0));
roll_value = rand()%sides + 1;
}
int Die::rolled_value() const {
return roll_value;
}
main.cpp
#include "die.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>
using std::cout;
int main() {
srand(time(0));
Die die;
int i = 0;
for(i=1; i<=10; i++)
{
die.roll();
Sleep(1000);
cout << "Roll #"<< i << ", Roll Value: " << die.rolled_value() << "\n";
}
return 0;
}
Что выводит следующее:
Roll #1, Roll Value: 4
Roll #2, Roll Value: 1
Roll #3, Roll Value: 4
Roll #4, Roll Value: 2
Roll #5, Roll Value: 5
Roll #6, Roll Value: 2
Roll #7, Roll Value: 5
Roll #8, Roll Value: 3
Roll #9, Roll Value: 6
Roll #10, Roll Value: 3
Я тестирую следующий тест:
TEST_CASE("Test that die returns a value between 1 and 6") {
Die die;
REQUIRE(die.rolled_value() > 0);
REQUIRE(die.rolled_value() < 7);
}
И получая, что этот тест терпит неудачу со следующим сообщением:
REQUIRE( die.rolled_value() < 7 )
with expansion:
11860256 (0xb4f920) < 7
===============================================================================
test cases: 2 | 1 passed | 1 failed
assertions: 3 | 2 passed | 1 failed
Я никогда не получал число больше 7 при запуске этой программы, но тест, тестирование на вывод больше 7 не работает... Почему это происходит?
вы спрашиваете выпавшее число перед тем, как бросить кубик
Судя по тесту, вы должны установить значение проката в конструкторе, а не как отдельный вызов функции-члена.
Итак, в конструкторе Class Die значение roll_value должно быть: int roll_value = 0; а не int roll_value; Я правильно понимаю? @молбднило
Не в конструкторе, нет. У вас еще нет конструктора. Прочтите о них в вашей любимой книге по C++.
Вы испытываете неопределенное поведение. Недопустимо читать значение до его инициализации.
Ваш тест показывает кое-что интересное: какое значение должно быть у кубика, если вы его еще не бросили?
Может быть, у вас должно быть нулевое значение, или, может быть, кубик нужно бросать при построении.
Как будет выглядеть код «бросать кубик при построении»? Установка "int roll_value = 1;" в конструкторе Class Die в файле die.h мои тесты прошли. Но было бы лучше с точки зрения получения случайного результата при первом «броске» бросить кубик при его построении? @guillaume
Программа по-прежнему генерирует случайные результаты с int roll_value = 1; в конструкторе Class Die. Так что я бы предположил, что проблем не будет
@ Эрин, да, но первый результат никогда не бывает случайным. Конструктор будет выглядеть так: Die() { roll(); }
или даже лучше, сделайте функцию, которая возвращает новое случайное число, и используйте ее как для инициализации первого значения, так и для броска костей.
Звоните
srand(time(0));
только один раз, а не каждый раз, когда вы вытягиваете номер.