c++ - 如何简化多 switch case 语句?
问题描述
我正在尝试简化 switch 语句,这样它就不会占用太多空间。我觉得我只是有太多重复的代码。我不知道是否有更好的语句可以使用或清理此代码的方法。我对 C++ 也很陌生,所以任何提示都会有所帮助。
这是我为绘制模具而制作的
void Dice::DrawDie()
{
switch (LastRoll)
{
case 1: cout << "\n ------- \n| |\n| |\n| o |\n| |\n| |\n ------- \t";
break;
case 2: cout << "\n ------- \n| |\n| o |\n| |\n| o |\n| |\n ------- \t";
break;
case 3: cout << "\n ------- \n| |\n| o |\n| o |\n| o |\n| |\n ------- \t";
break;
case 4: cout << "\n ------- \n| |\n| o o |\n| |\n| o o |\n| |\n ------- \t";
break;
case 5: cout << "\n ------- \n| |\n| o o |\n| o |\n| o o |\n| |\n ------- \t";
break;
case 6: cout << "\n ------- \n| |\n| o o |\n| o o |\n| o o |\n| |\n ------- \t";
}
switch (LastRoll2)
{
case 1: cout << "\n ------- \n| |\n| |\n| o |\n| |\n| |\n ------- \t";
break;
case 2: cout << "\n ------- \n| |\n| o |\n| |\n| o |\n| |\n ------- \t";
break;
case 3: cout << "\n ------- \n| |\n| o |\n| o |\n| o |\n| |\n ------- \t";
break;
case 4: cout << "\n ------- \n| |\n| o o |\n| |\n| o o |\n| |\n ------- \t";
break;
case 5: cout << "\n ------- \n| |\n| o o |\n| o |\n| o o |\n| |\n ------- \t";
break;
case 6: cout << "\n ------- \n| |\n| o o |\n| o o |\n| o o |\n| |\n ------- \t";
}
switch (LastRoll3)
{
case 1: cout << "\n ------- \n| |\n| |\n| o |\n| |\n| |\n ------- \t";
break;
case 2: cout << "\n ------- \n| |\n| o |\n| |\n| o |\n| |\n ------- \t";
break;
case 3: cout << "\n ------- \n| |\n| o |\n| o |\n| o |\n| |\n ------- \t";
break;
case 4: cout << "\n ------- \n| |\n| o o |\n| |\n| o o |\n| |\n ------- \t";
break;
case 5: cout << "\n ------- \n| |\n| o o |\n| o |\n| o o |\n| |\n ------- \t";
break;
case 6: cout << "\n ------- \n| |\n| o o |\n| o o |\n| o o |\n| |\n ------- \t";
}
switch (LastRoll4)
{
case 1: cout << "\n ------- \n| |\n| |\n| o |\n| |\n| |\n ------- \t";
break;
case 2: cout << "\n ------- \n| |\n| o |\n| |\n| o |\n| |\n ------- \t";
break;
case 3: cout << "\n ------- \n| |\n| o |\n| o |\n| o |\n| |\n ------- \t";
break;
case 4: cout << "\n ------- \n| |\n| o o |\n| |\n| o o |\n| |\n ------- \t";
break;
case 5: cout << "\n ------- \n| |\n| o o |\n| o |\n| o o |\n| |\n ------- \t";
break;
case 6: cout << "\n ------- \n| |\n| o o |\n| o o |\n| o o |\n| |\n ------- \t";
}
switch (LastRoll5)
{
case 1: cout << "\n ------- \n| |\n| |\n| o |\n| |\n| |\n ------- \t";
break;
case 2: cout << "\n ------- \n| |\n| o |\n| |\n| o |\n| |\n ------- \t";
break;
case 3: cout << "\n ------- \n| |\n| o |\n| o |\n| o |\n| |\n ------- \t";
break;
case 4: cout << "\n ------- \n| |\n| o o |\n| |\n| o o |\n| |\n ------- \t";
break;
case 5: cout << "\n ------- \n| |\n| o o |\n| o |\n| o o |\n| |\n ------- \t";
break;
case 6: cout << "\n ------- \n| |\n| o o |\n| o o |\n| o o |\n| |\n ------- \t";
}
}
然后我使用一个单独的区域为每个骰子滚动骰子。我为每个人制作一个新模具。
void Dice::Dice1()
{
int RollNum;
LastRoll = 0;
TotalRolls++;
//Gens Rand Num 1-6
RollNum = (rand() % 6) + 1;
LastRoll = RollNum;
}
解决方案
您可以仅将骰子面存储在std::map<int,std::array<const char*,5>>
单独的字符串文字中,以提高可读性:
const std::map<int,std::array<const char*,5>> die_faces = {
{ 1, { "+---+",
"| |",
"| o |",
"| |",
"+---+" } },
{ 2, { "+---+",
"|o |",
"| |",
"| o|",
"+---+" } },
{ 3, { "+---+",
"|o |",
"| o |",
"| o|",
"+---+" } },
{ 4, { "+---+",
"|o o|",
"| |",
"|o o|",
"+---+" } },
{ 5, { "+---+",
"|o o|",
"| o |",
"|o o|",
"+---+" } },
{ 6, { "+---+",
"|o o|",
"|o o|",
"|o o|",
"+---+" } }
};
并访问这些像
void output_dies(int roll1, int roll2) {
std::cout << "\n";
for(int i = 0; i < 5; ++i) {
std::cout << die_faces.at(roll1)[i] << "\t" << die_faces.at(roll2)[i] << "\n";
}
std::cout << "\n";
}
和
output_dies(LastRoll,LastRoll2);
根本不需要更多的开关。