我必须为我的第一个 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++课,所以我不会用新信息让您不知所措。既然frameReel1
、frameReel2
和frameReel3
是一样的,为什么不干脆有一个,叫它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
中。