簡體   English   中英

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

[英]int or char enum to int , not ASCII

我在玩撲克游戲,撞牆了。 任何幫助都會很棒。

我有12張卡值。 值是2-9或TJQKA(以下列舉)的char 我需要將它們傳遞給一個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]; 
}

我強烈建議使用地圖而不是枚舉。

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

您將需要一個轉換函數:

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

使用鍵值中的ascii值和值中的enum值制作std::map

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

然后將角色與地圖匹配

通常,您需要將值從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]);

我建議重新考慮使用枚舉來代表卡片。 從長遠來看,僅創建自己的類型或使用整數會更容易。

在運行時,無法將enum符號直接從C ++中的enum符號轉換為相應的整數(顯然,編譯器可以在編譯時執行此操作)。 您可能需要編寫一個小的輔助函數:

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

我建議切換:

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參數(ASCII卡值,例如'J')並返回其數字值。 您可能會發現isdigit函數和switch語句很有用。

如果即時消息正確理解您,則希望將字符串轉換為紙牌值(盡管出於某些原因,您擁有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 },

如果您願意。 順便說一句-我還沒有編譯這段代碼,所以它可能不會建立;)

嘗試構建大小為256的靜態數組,以使以下給出正確的答案:

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

那是,

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

等等,但所有無效條目均為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM