Lexicon
Lexicon

Reputation: 2627

int or char enum to int , not ASCII

I'm doing a poker game and have hit a wall. Any help would be great.

I have 12 card values. The values are chars either 2-9 or TJQKA (enumed below). I need to pass them to an int array such that their value is what gets passed (whether int value or enum value) instead of their ASCII.

for the example below, I want:

val[5] = {2,5,10,12,11}

instead of:

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

Upvotes: 1

Views: 2993

Answers (9)

Robᵩ
Robᵩ

Reputation: 168626

Try building a static array of size 256 such that the following gives the right answer:

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

That is,

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

etc, but all invalid entries are zero.

Upvotes: 1

OmnipotentEntity
OmnipotentEntity

Reputation: 17131

I suggest a switch:

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");
}

Upvotes: 2

Adrian Brown
Adrian Brown

Reputation: 466

If im understanding you correctly, you want to convert the string into card values (although for some reason you have the ace as 13 - id be tempted to say use 1 as the ace, although i can see you logic for it in a poker game).

Just using an enum wont help as at runtime you dont really have the information you need. An enum is a compile time concept mainly to assist the programmer and to handle checking.

There are many way to do what you want, you could have an array of index to char or a two entry array of char and value. For ease of alterations i would go with the following

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]);
}

There are better ways with STL, and you should have more error checking and length of array detections, but hopefully you get the idea. You could use the enum in the lookup such as

{  "T", T },

If you preferred. Btw - i havent compiled this code so it probably wont build ;)

Upvotes: 1

Brian Roach
Brian Roach

Reputation: 76898

I would highly recommend using a map rather than an enum.

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

Upvotes: 7

notrick
notrick

Reputation: 227

Generally you would need to convert the values from char to int. Here's the easiest way.

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);
     }
   }
}

Then change your loop

for (int i = 0; i < 5; ++i)  
   val[i] = convert_from_char(value[i]);

I would suggest reconsidering using enums to represent cards, though. It will be easier in the long run just to make your own type, or use integers.

Upvotes: 3

Neel Basu
Neel Basu

Reputation: 12904

Make an std::map with ascii values in key and enum values in value

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

and then match the characters with the map

Upvotes: 3

Greg Hewgill
Greg Hewgill

Reputation: 992955

There is no way to directly convert from an enum symbol to the corresponding integer in C++ at runtime (obviously the compiler can do this at compile time). You may need to write a small helper function:

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;
        }
    }
}

Upvotes: 2

Chad
Chad

Reputation: 19032

You'll need a conversion function:

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...
}

Then in your loop:

val[i] = to_card(value[i]);

Upvotes: 4

zvrba
zvrba

Reputation: 24546

Create a function that will take a char argument (the ASCII card value, such as 'J') and return its numerical value. You might find the isdigit function and switch statement helpful.

Upvotes: 1

Related Questions