2011-10-22 78 views
1

我正在做一個撲克遊戲,並打了一堵牆。任何幫助都會很棒。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

回答

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

創建,將採取一個char參數的函數(ASCII碼卡值,例如作爲'J')並返回其數值。您可能會發現isdigit函數和switch語句很有用。

7

我強烈推薦使用map而不是枚舉。

map<char,int> myCardMap; 
myCardMap['T'] = 10; 
... 
val[i] = myCardMap[value[i]]; 
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; 
     } 
    } 
} 
3

請與鍵和枚舉值的ASCII值的std::map價值

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

,然後與地圖

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

我會建議使用枚舉來表示卡反思,雖然。從長遠來看,製作自己的類型或使用整數會更容易。

+0

與其他人相比,這看起來像是一個簡單的版本。也許不如使用地圖,但。 –

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

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

+0

猜猜我過度複雜;)開關會更容易,因爲你不太可能想要更改/添加到列表。雖然我會選擇使用開關的功能,因爲您可能會在幾個地方想要這個功能。有一個需要一個字符並返回值,另一個需要一個值並給出適當的字符。這樣,如果你決定將王牌移動到1的值,那麼在整個代碼中只有幾個變化而不是很多 –

+0

這是C++。一個'std :: map'完成你在O(1)中所要求的一切。 –

1

嘗試建立大小的靜態數組256,使得下面給出正確的答案:

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

也就是說,

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

等,但所有無效的條目都是零。