[英]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.