int或char枚举到int,而不是ASCII

时间:2011-10-22 19:37:16

标签: c++ pointers enums char int

我正在做一场扑克游戏而已经撞墙了。任何帮助都会很棒。

我有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]; 
}

9 个答案:

答案 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

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