通过一个 switch 语句发送不同的变量



我必须为我的第一个 c++ 类创建一个老虎机,并且我必须使用枚举数据类型和卷轴数组。 我的程序目前选择所有三个卷轴随机帧,但对于我的一生,我想不出一种方法来使其更紧凑。我必须保留所有卷轴值,以便我可以使用 if 语句创建输赢结果。 有没有办法通过同一个开关循环每个变量?

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
enum frameType {PETROLEUM=1, COAL, NATURAL_GAS, URANIUM, GLOBAL_WARMING,NUCLEAR_DISASTER, DIRT};
enum outcomeType {PETROLEUM_WIN, COAL_WIN, NATURAL_GAS_WIN, URANIUM_WIN, LOSS, DRAW};
int main()
{
  srand(time(NULL));
  frameType frm1;

  int frameReel1[] =  {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7};
  int frameReel2[] =  {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7};
  int frameReel3[] =  {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7};
  int RandIndex1 = rand() % 25;
  int RandIndex2 = rand() % 25;
  int RandIndex3 = rand() % 25;
  int a = frameReel1[RandIndex1];
  int b = frameReel2[RandIndex2];
  int c = frameReel3[RandIndex3];
  switch (a)
  {
  case PETROLEUM:
    cout << "[petroleum]n";
    break;
  case COAL:
    cout << "[coal]";
    break;
  case NATURAL_GAS:
    cout << "[natural gas]";
    break;
  case URANIUM:
    cout << "[uranium]";
    break;
  case GLOBAL_WARMING:
    cout << "[global warming]";
    break;
  case NUCLEAR_DISASTER:
    cout << "[nuclear disaster]";
    break;
  case DIRT:
    cout << "[dirt]";
    break;
 }
switch (b)
{
case PETROLEUM:
  cout << "[petroleum]";
  break;
case COAL:
  cout << "[coal]";
  break;
case NATURAL_GAS:
  cout << "[natural gas]";
  break;
case URANIUM:
  cout << "[uranium]";
  break;
case GLOBAL_WARMING:
  cout << "[global warming]";
  break;
case NUCLEAR_DISASTER:
  cout << "[nuclear disaster]";
  break;
case DIRT:
  cout << "[dirt]";
  break;
}
switch (c)
{
case PETROLEUM:
  cout << "[petroleum]";
  break;
case COAL:
  cout << "[coal]n";
  break;
case NATURAL_GAS:
  cout << "[natural gas]";
  break;
case URANIUM:
  cout << "[uranium]";
  break;
case GLOBAL_WARMING:
  cout << "[global warming]";
  break;
case NUCLEAR_DISASTER:
  cout << "[nuclear disaster]";
  break;
case DIRT:
  cout << "[dirt]";
  break;
}
} // end main

这是函数非常有用的一件事 - 避免重复代码。这是您的代码,函数中的 switch 语句:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
enum frameType {PETROLEUM=1, COAL, NATURAL_GAS, URANIUM, GLOBAL_WARMING,NUCLEAR_DISASTER, DIRT};
enum outcomeType {PETROLEUM_WIN, COAL_WIN, NATURAL_GAS_WIN, URANIUM_WIN, LOSS, DRAW};

void printFrameType(int a)
{
    switch (a)
    {
    case PETROLEUM:
        cout << "[petroleum]n";
        break;
    case COAL:
        cout << "[coal]";
        break;
    case NATURAL_GAS:
        cout << "[natural gas]";
        break;
    case URANIUM:
        cout << "[uranium]";
        break;
    case GLOBAL_WARMING:
        cout << "[global warming]";
        break;
    case NUCLEAR_DISASTER:
        cout << "[nuclear disaster]";
        break;
    case DIRT:
        cout << "[dirt]";
        break;
    }
}

int main()
{
    srand(time(NULL));
    frameType frm1;
    int frameReel1[] =  {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7};
    int frameReel2[] =  {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7};
    int frameReel3[] =  {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7};
    int RandIndex1 = rand() % 25;
    int RandIndex2 = rand() % 25;
    int RandIndex3 = rand() % 25;
    int a = frameReel1[RandIndex1];
    int b = frameReel2[RandIndex2];
    int c = frameReel3[RandIndex3];
    printFrameType(a);
    printFrameType(b);
    printFrameType(c);
} // end main

还有其他方法可以改进此代码,但您说这是您的第一堂C++课,所以我不会用新信息让您不知所措。既然frameReel1frameReel2frameReel3是一样的,为什么不干脆有一个,叫它frameReel呢?

除了使用函数来缩短代码,您还可以使用如下循环:

for(int i = 0; i < 3; i++)
{
    any code you put in here will run three times, so
    if you put the random choice and the switch statement
    in here, it will print 3 random frame types
}

稍后您将了解for(int i = 0; i < 3; i++)的含义,但您现在可以将其视为魔法。如果您希望它运行不同的次数,请将 3 更改为其他数字。

Tony D和LeonardBlunderbuss的答案更好,但涉及更高级的概念。

试试这段代码:

int outcomes[3] = {frameReel1[RandIndex1], frameReel2[RandIndex2], frameReel3[RandIndex3]};
for(int i=0; i<3; i++)
  switch(outcomes[i])
    // Cases...

您可以编写可重用的支持函数:

std::ostream& operator<<(std::ostream& os, frameType x)
{
    switch (a)
    {
      case PETROLEUM:        return os << "[petroleum]n";
      case COAL:             return os << "[coal]";
      case NATURAL_GAS:      return os << "[natural gas]";
      case URANIUM:          return os << "[uranium]";
      case GLOBAL_WARMING:   return os << "[global warming]";
      case NUCLEAR_DISASTER: return os << "[nuclear disaster]";
      case DIRT:             return os << "[dirt]";
      default:               return os << "<invalid>"; // or throw?
    }
}

然后:

frameType a = static_cast<frameType>(frameReel1[RandIndex1]);
...
std::cout << a << b << c;

(您真的应该将frameType存储在frameReel1/2/3中。

最新更新