int или char enum для int, а не ASCII - PullRequest
       33

int или char enum для int, а не ASCII

1 голос
/ 22 октября 2011

Я играю в покер и врезался в стену. Любая помощь будет великолепна.

У меня 12 значений карт. Значения char s либо 2-9, либо TJQKA (перечислено ниже). Мне нужно передать их в массив int таким образом, чтобы вместо значения ASCII передавалось их значение (будь то значение int или значение enum).

для примера ниже, я хочу:

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 ]

7 голосов
/ 22 октября 2011

Я бы настоятельно рекомендовал использовать карту вместо перечисления.

map<char,int> myCardMap;
myCardMap['T'] = 10;
...
val[i] = myCardMap[value[i]];
4 голосов
/ 22 октября 2011

Вам понадобится функция преобразования:

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]);
3 голосов
/ 22 октября 2011

Обычно вам нужно преобразовать значения из 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]);

Я бы предложил пересмотреть использование перечислений для представления карт.В конечном итоге вам будет проще создать собственный тип или использовать целые числа.

3 голосов
/ 22 октября 2011

Создайте std::map со значениями ascii в ключе и перечислите значения в значении

std::map<char, int> asciiMap;
asciiMap['T'] = 10;
asciiMap['J'] = 11;
//etc....

и затем сопоставьте символы с картой

2 голосов
/ 22 октября 2011

Я предлагаю переключатель:

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");
}
2 голосов
/ 22 октября 2011

Нет способа напрямую преобразовать символ 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;
        }
    }
}
1 голос
/ 23 октября 2011

Попробуйте построить статический массив размером 256, чтобы следующий ответ дал правильный ответ:

for (int i = 0; i < 5; i++)
{
    val[i] = AsciiToInt[value[i]]; 
}

То есть

AsciiToInt['2'] == 2
AsciiToint['T'] == 10,
AsciiToInt['J'] == 11

и т. Д., Но все недопустимые записи равны нулю.

1 голос
/ 22 октября 2011

Если я вас правильно понимаю, вы хотите преобразовать строку в значения карты (хотя по какой-то причине у вас туз в качестве 13-id, вы можете сказать, что используйте 1 в качестве туза, хотя я вижу вашу логику для этого вигра в покер).

Простое использование enum не поможет, так как во время выполнения у вас действительно нет нужной информации.Перечисление - это концепция времени компиляции, предназначенная главным образом для помощи программисту и выполнения проверки.

Есть много способов сделать то, что вы хотите, вы можете иметь массив index для 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 голос
/ 22 октября 2011

Создайте функцию, которая будет принимать аргумент типа char (значение карты ASCII, например, 'J') и возвращать его числовое значение. Вам могут пригодиться функция isdigit и инструкция switch.

...