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]; 
} 
+1

将字符串转换为枚举几乎是不可能的,没有一些认真的工作,去一个switch语句,它会让你的生活更加快乐。 – Serdalis

你需要一个转换功能:

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语句很有用。

我强烈推荐使用map而不是枚举。

map<char,int> myCardMap; 
myCardMap['T'] = 10; 
... 
val[i] = myCardMap[value[i]]; 

没有办法直接转换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]); 

我会建议使用枚举来表示卡反思,虽然。从长远来看,制作自己的类型或使用整数会更容易。

+0

与其他人相比,这看起来像是一个简单的版本。也许不如使用地图,但。 –

如果我正确理解你,你想要将字符串转换为卡片值(虽然由于某种原因,你有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 }, 

如果您愿意。顺便说一句 - 我还没有编译此代码,以便它可能不会建立;)

+0

猜猜我过度复杂;)开关会更容易,因为你不太可能想要更改/添加到列表。虽然我会选择使用开关的功能,因为您可能会在几个地方想要这个功能。有一个需要一个字符并返回值,另一个需要一个值并给出适当的字符。这样,如果你决定将王牌移动到1的值,那么在整个代码中只有几个变化而不是很多 –

+0

这是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 

等,但所有无效的条目都是零。