我正在做一场扑克游戏而已经撞墙了。任何帮助都会很棒。
我有12张卡片值。值char
为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];
}
答案 0 :(得分:7)
我强烈建议使用map而不是枚举。
map<char,int> myCardMap;
myCardMap['T'] = 10;
...
val[i] = myCardMap[value[i]];
答案 1 :(得分:4)
您需要转换功能:
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]);
答案 2 :(得分:3)
使用值
中的键和枚举值中的ascii值创建std::map
std::map<char, int> asciiMap;
asciiMap['T'] = 10;
asciiMap['J'] = 11;
//etc....
然后将字符与地图匹配
答案 3 :(得分:3)
通常,您需要将值从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]);
我建议重新考虑使用枚举代表卡片。从长远来看,只需制作自己的类型或使用整数就会更容易。
答案 4 :(得分:2)
在运行时无法直接从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;
}
}
}
答案 5 :(得分:2)
我建议转换:
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");
}
答案 6 :(得分:1)
创建一个带有char参数的函数(ASCII卡值,例如'J')并返回其数值。您可能会发现isdigit函数和switch语句很有用。
答案 7 :(得分:1)
如果我正确理解你,你想把字符串转换成卡片值(虽然由于某种原因你有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 },
如果您愿意。顺便说一句 - 我还没有编译这段代码所以它可能不会构建;)
答案 8 :(得分:1)
尝试构建一个大小为256的静态数组,以便下面给出正确的答案:
for (int i = 0; i < 5; i++)
{
val[i] = AsciiToInt[value[i]];
}
即,
AsciiToInt['2'] == 2
AsciiToint['T'] == 10,
AsciiToInt['J'] == 11
等,但所有无效条目都为零。