int或char枚举int,而不是ASCII
我正在做一个扑克游戏,并打了一堵墙。任何帮助都会很棒。int或char枚举int,而不是ASCII
我有12个卡片值。数值是char
s 2-9或TJQKA(下文介绍)。我需要将它们传递给一个int数组,使得它们的值是被传递的值(不管是int值还是枚举值)而不是它们的ASCII。
下面的例子中,我想:
val[5] = {2,5,10,12,11}
代替:
val[5] = {50,53,84,81,74}
enum cardvalues {T=10 , J , Q , K , A}
int val[5];
string value = "25TQJ";
for (int i = 0; i < 5; i++)
{
val[i] = value[i];
}
你需要一个转换功能:
int to_card(const char v)
{
switch(v)
{
case '2': return 2;
case '3': return 3:
// etc...
case 'T': return 10;
case 'J': return 11;
// etc...
}
然后在您的循环:
val[i] = to_card(value[i]);
创建,将采取一个char参数的函数(ASCII码卡值,例如作为'J')并返回其数值。您可能会发现isdigit函数和switch语句很有用。
没有办法直接转换从enum
符号对应在运行时C++中的整数(显然,编译器可以在编译时执行此操作)。您可能需要写一个小的辅助功能:
int card_value(char c) {
if (isdigit(c)) {
return c - '0';
} else {
switch (c) {
case 'T': return 10;
case 'J': return 11;
case 'Q': return 12;
case 'K': return 13;
case 'A': return 14;
default:
// whatever error handling here, such as:
return -1;
}
}
}
请与键和枚举值的ASCII值的std::map
价值
std::map<char, int> asciiMap;
asciiMap['T'] = 10;
asciiMap['J'] = 11;
//etc....
,然后与地图
我匹配字符建议开关:
switch (value[i]) {
case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
val[i] = atoi(value[i]);
break;
case 'T':
val[i] = 10;
break;
case 'J':
val[i] = 11;
break;
case 'Q':
val[i] = 12;
break;
case 'K':
val[i] = 13;
break;
case 'A':
val[i] = 14;
break;
default:
printf("Invalid character passed\n");
}
通常您需要将该值从char到int。这是最简单的方法。
int convert_from_char(char c) {
if (c >= '2' && c <= '9') return (int)(c - '0');
else {
switch(c) {
case 'T': return (int)T;
case 'J': return (int)J;
case 'Q': return (int)Q;
case 'K': return (int)K;
case 'A': return (int)A;
default:
/* your program is borked. */
exit(1);
}
}
}
然后改变你的循环
for (int i = 0; i < 5; ++i)
val[i] = convert_from_char(value[i]);
我会建议使用枚举来表示卡反思,虽然。从长远来看,制作自己的类型或使用整数会更容易。
与其他人相比,这看起来像是一个简单的版本。也许不如使用地图,但。 –
如果我正确理解你,你想要将字符串转换为卡片值(虽然由于某种原因,你有ace作为13-id被诱惑说使用1作为ace,但我可以看到你的逻辑在扑克游戏中)。
只是使用枚举不会帮助在运行时,你真的没有你需要的信息。枚举是一个编译时间的概念,主要是为了帮助程序员和处理检查。
有很多方法可以做到你想要的,你可以有一个索引数组到char或两个条目数组的char和value。为了便于改变的,我会用以下
typedef struct
{
char m_cCharacter;
int m_nValue;
} LOOKUP;
LOOKUP lookup_data[] = {
{ "2", 2 },
{ "3", 3 },
{ "4", 4 },
{ "5", 5 },
{ "6", 6 },
{ "7", 7 },
{ "8", 8 },
{ "9", 9 },
{ "T", 10 },
{ "J", 11 },
{ "Q", 12 },
{ "K", 13 },
{ "A", 14 }
};
int GetCharacter(char c)
{
int retval = -1; // Invalid
for(int i = 0; i < 13; i++)
{
if (lookup_data[i].m_cCharacter == c)
{
retval = lookup_data[i].m_nValue;
break;
}
}
return retval;
}
for (int i = 0; i < 5; i++)
{
val[i] = GetCharacter(value[i]);
}
去没有与STL更好的方法,你应该有更多的错误检查和阵列检测的长度,但希望你的想法。您可以在查找中使用枚举,如
{ "T", T },
如果您愿意。顺便说一句 - 我还没有编译此代码,以便它可能不会建立;)
猜猜我过度复杂;)开关会更容易,因为你不太可能想要更改/添加到列表。虽然我会选择使用开关的功能,因为您可能会在几个地方想要这个功能。有一个需要一个字符并返回值,另一个需要一个值并给出适当的字符。这样,如果你决定将王牌移动到1的值,那么在整个代码中只有几个变化而不是很多 –
这是C++。一个'std :: map'完成你在O(1)中所要求的一切。 –
尝试建立大小的静态数组256,使得下面给出正确的答案:
for (int i = 0; i < 5; i++)
{
val[i] = AsciiToInt[value[i]];
}
也就是说,
AsciiToInt['2'] == 2
AsciiToint['T'] == 10,
AsciiToInt['J'] == 11
等,但所有无效的条目都是零。
将字符串转换为枚举几乎是不可能的,没有一些认真的工作,去一个switch语句,它会让你的生活更加快乐。 – Serdalis