简单地说出长代码行
Simplyfing long code lines
此代码是用整数(0 从 51 开始)的字符串(Kh,6c,5h 等)列出一副牌,反之亦然。
我已经为它编写了代码,但它似乎很长。有没有更有效的方法来写这个?
我也想以两种方式执行此操作,将字符串发送到函数并获取 int。
std::string Card::getString(int card) {
std::string cardstring;
switch (card) {
case 0:
return "2c";
case 1:
return "3c";
case 2:
return "4c";
case 3:
return "5c";
case 4:
return "6c";
case 5:
return "7c";
case 6:
return "8c";
case 7:
return "9c";
case 8:
return "Tc";
case 9:
return "Jc";
case 10:
return "Qc";
case 11:
return "Kc";
case 12:
return "Ac";
case 13:
return "2d";
case 14:
return "3d";
case 15:
return "4d";
case 16:
return "5d";
case 17:
return "6d";
case 18:
return "7d";
case 19:
return "8d";
case 20:
return "9d";
case 21:
return "Td";
case 22:
return "Jd";
case 23:
return "Qd";
case 24:
return "Kd";
case 25:
return "Ad";
case 26:
return "2h";
case 27:
return "3h";
case 28:
return "4h";
case 29:
return "5h";
case 30:
return "6h";
case 31:
return "7h";
case 32:
return "8h";
case 33:
return "9h";
case 34:
return "Th";
case 35:
return "Jh";
case 36:
return "Qh";
case 37:
return "Kh";
case 38:
return "Ah";
case 39:
return "2s";
case 40:
return "3s";
case 41:
return "4s";
case 42:
return "5s";
case 43:
return "6s";
case 44:
return "7s";
case 45:
return "8s";
case 46:
return "9s";
case 47:
return "Ts";
case 48:
return "Js";
case 49:
return "Qs";
case 50:
return "Ks";
case 51:
return "As";
}
return cardstring;}
谢谢
std::string get_card_string(int card)
{
if (card >= 0 && card < 52)
{
std::string s(2,' ');
s[0] = "23456789TJQKA"[card % 13];
s[1] = "cdhs"[card / 13];
return s;
}
return "";
}
相反的过程稍微复杂一些。如果我考虑一段时间,我可能会想出一个更聪明的方法,但显而易见的选择是这样的:
std::unordered_map<std::string, int> initialize_card_map()
{
std::unordered_map<std::string, int> m;
for (int i=0; i<52; ++i)
m[get_card_string(i)] = i;
return m;
}
int get_card_number(std::string const & card_string)
{
static std::unordered_map<std::string, int> const m = initialize_card_map();
auto it = m.find(card_string);
if (it != m.end())
return it->second;
return ??? value not found
}
使用std::array
或std::vector
:
std::vector<std::string> cards{
"2c", // index 0
"3c", // index 1
"4c"...
};
std::string Card::getString(int card) { return cards[card]; }
assert(getString(0) == "2c");
Benjamin Lindley的上述答案很棒,但是如果你首先要像原始帖子一样编写代码,你需要问自己更多关于你的设计选择的问题:
为什么您必须通过 int 访问卡值?
用元组来表示卡片值怎么样?
Peter Norvig关于Udacity的"计算机程序设计"课程.com的第一堂课/讲座似乎与您非常相关。我建议看看它。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 一个非常简单的win32套接字代码,但工作错误
- boost::spirit--试图编译大多数简单代码的编译器错误
- 奇怪的 G++ 错误,带有关于左值和赋值的简单代码
- 运行简单的.oct文件时Octave崩溃,我的代码出了什么问题?
- 为什么 for 循环只接受这个简单代码中的最后一个字符串?
- 一个简单的 win32 多线程代码.这能行吗?
- 为什么括号在这个简单的代码中会有所不同
- 这段简单的代码有什么问题?
- 如何在C++编写简单的启动代码?
- 使用简单的 Indy 服务器代码进行访问冲突
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- C++ 使用简单的代码同时写入文件和控制台输出
- 程序告诉我初始化在编写简单的C ++代码时不需要初始化的变量
- 请解释为什么这个简单的C++(Qt)代码如此奇怪
- 需要帮助识别简单多线程代码中的错误
- 我写了这个简单的代码,应该计算一系列数组元素的最高数量,但结果很奇怪
- 代码简单