Возвращает целое число, чтобы определить, какой оператор switch показывать

Я создаю настольную игру (Stratego) на C ++, и мне было интересно, считает ли это плохой практикой возвращать целое число из метода класса, чтобы определить, какой случай в операторе switch показывать пользователю.

Пример:
В Stratego вы не можете атаковать части доски, которые являются частью вашей собственной армии, поэтому у меня появляется сообщение «Вы не можете атаковать свою собственную армию», когда пользователь пытается это сделать.

То же самое, если выполняется движение, которое приведет к тому, что игрок прыгнет с доски, переместится слишком много мест и т. Д.

Каждое из этих недопустимых движений имеет свое уникальное сообщение, но чтобы не печатать их из файла Class.cpp, в котором проверяются ходы игрока, у меня есть файл Class.cpp, возвращающий целое число в оператор switch в main ( ) что это было вызвано.
Каков наиболее рекомендуемый способ обработки сообщений?

class Test
{
public:
Test()
{

}
int Validate_Move(int valid)
{
if (valid > 0 && valid < 5)
{
return 1;
}
else if (valid > 5)
{
return 2;
}
}
};

int main()
{
int entry;
std::cout << "Enter move: ";
std::cin >> entry;

Test obj;

switch (obj.Validate_Move(entry))
{
case 1:
std::cout << "Move is valid" << std::endl;
case 2:
std::cout << "Move is invalid" << std::endl;
default:
std::cout << "Error occured" << std::endl;
}

return 0;
}

1

Решение

Нет ничего плохого в этой технике. Если вы хотите быть более явным, вы всегда можете сделать enum

class Test
{
public:
Test() = default;

enum EValidity {eError, eValid, eInvalid};

EValidity Validate_Move(int valid)
{
if (valid > 0 && valid < 5)
{
return eValid;
}
else if (valid > 5)
{
return eInvalid;
}
else
{
return eError;
}
}
};

int main()
{
int entry;
std::cout << "Enter move: ";
std::cin >> entry;

Test obj;

switch (obj.Validate_Move(entry))
{
case Test::eValid:
std::cout << "Move is valid" << std::endl;
break;
case Test::eInvalid:
std::cout << "Move is invalid" << std::endl;
break;
case Test::eError:
std::cout << "Error occured" << std::endl;
break;
default:
assert(false);
}

return 0;
}
3

Другие решения


По вопросам рекламы [email protected]