Использование C++ rand() для получения случайных направлений (вверх/вниз/влево/вправо) - всегда вставать

Я делаю текстовую игру Battleship на С++. Я использую функцию rand() для случайного размещения кораблей компьютера. Я задаю генератор чисел один раз в начале main() строкой ниже:

srand(static_cast<unsigned>(time(0)));

Позже я использую функцию rand(), чтобы выбрать места, куда пойдет каждый отдельный корабль. (Координаты, где будет начинаться один конец корабля). Затем я использую rand() в приведенной ниже функции, которая определяет направление, в котором они будут расширяться (в зависимости от длины корабля):

char randDirection()
{
    int randNumber = rand();
    int x = (randNumber % 4) + 1;

    if (x = 1)
        return 'u';
    else if (x = 2)
        return 'd';
    else if (x = 3)
        return 'l';
    else
        return 'r';
}

Он случайным образом получает число от 1 до 4 и возвращает направление (представленное символом) в зависимости от числа. В то время как я успешно выбирал места для фигур случайным образом, эта функция всегда устанавливает фигуры вертикально. Они всегда идут вверх. Кто-нибудь может сказать мне, почему?


person Community    schedule 29.05.2015    source источник
comment
if (x = 1) Включите предупреждения компилятора. Это задание, а не сравнение. Ваш компилятор должен предупредить вас об этом.   -  person dyp    schedule 30.05.2015


Ответы (3)


Твоя проблема в каждом "если", ты делаешь задание, а не тест. Более того, в тесте присваивание всегда будет возвращать результат присваивания. Например:

if (x = 0) // will never be here because 0 is false in a test else if (x = 42) // will always end up here else // will never be here

person Karskrin    schedule 29.05.2015

Ваша проблема, кажется, в утверждении x = 1, вы должны изменить его на x == 1, потому что присваивание всегда будет истинным.

Надеюсь, это поможет!

person Damián Montenegro    schedule 29.05.2015
comment
Присваивание не всегда будет истинным, например, x = 0 в тесте ложно. - person Karskrin; 30.05.2015

Попробуйте это, чтобы избежать опечатки == ;-) :

char randDirection()
{
    return "udlr"[rand() % 4];
};
person Christophe    schedule 29.05.2015
comment
Это слишком умно, чтобы быть полезным. +1 в любом случае. - person Mark Ransom; 30.05.2015
comment
@MarkRansom Извините, я не мог удержаться ;-) я должен напомнить себе известную цитату Б. Кернигана: Прежде всего, отладка в два раза сложнее, чем написание кода. Следовательно, если вы пишете код максимально умно, вы по определению недостаточно умны, чтобы его отлаживать - person Christophe; 30.05.2015
comment
Вау, это действительно крутая строка кода. То есть он обрабатывает набор символов udlr как своего рода четырехэлементный контейнер? - person ; 01.06.2015
comment
@warranpenner спасибо! Вот и все. Буквенная строка понимается как указатель, и я просто индексирую ее, как в массиве. - person Christophe; 01.06.2015