首页 > 解决方案 > 如何简化多 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;

}

标签: c++

解决方案


您可以仅将骰子面存储在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);

根本不需要更多的开关。

现场演示


推荐阅读