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