Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+的21点程序+;。如何在switch语句中添加多个char值?_C++ - Fatal编程技术网

C++ C+的21点程序+;。如何在switch语句中添加多个char值?

C++ C+的21点程序+;。如何在switch语句中添加多个char值?,c++,C++,编写一个程序,在21点手牌上得分。在21点游戏中,玩家可以得到2到5张牌。(玩家决定有多少张牌,但这对本练习没有影响。)2到10张牌的得分为每张2到10分。脸牌、杰克牌、皇后牌和国王牌得分为10分。目标是在不超过21分的情况下尽可能接近21分。因此,任何超过21的分数都被称为“busted”。ace可以计算为1或11,以对用户更好的为准。例如,a和10的得分可以是11分或21分。因为21分更好,所以这手牌的得分是21分。一张A和两张8分可以得分为17分或27分。因为27是一个“失败”分数,所以这

编写一个程序,在21点手牌上得分。在21点游戏中,玩家可以得到2到5张牌。(玩家决定有多少张牌,但这对本练习没有影响。)2到10张牌的得分为每张2到10分。脸牌、杰克牌、皇后牌和国王牌得分为10分。目标是在不超过21分的情况下尽可能接近21分。因此,任何超过21的分数都被称为“busted”。ace可以计算为1或11,以对用户更好的为准。例如,a和10的得分可以是11分或21分。因为21分更好,所以这手牌的得分是21分。一张A和两张8分可以得分为17分或27分。因为27是一个“失败”分数,所以这只手的分数是17。
询问用户有多少张卡,用户用整数2、3、4或5中的一个来回答。然后要求用户输入卡值。 卡值为2到10,杰克、皇后、国王和王牌。处理输入的一个好方法是使用char类型,例如,将卡输入2读取为字符“2”,而不是数字2。输入值2到9,作为字符“2”到“9”。输入值10、jack、queen、king和ace作为字符“t”、“j”、“q”、“k”和“a”。ace也可以输入为“1”。确保允许输入大小写字母。
读入数值后,程序应将其从字符值转换为数字卡分数,特别注意ACE。输出为介于2和21(含)之间的数字或字Busted。在适当的地方使用函数。使用switch语句确定卡的正确值。你的程序应该包括一个循环,让用户重复这个计算,直到用户说她或他完成为止

示例输出: 输入卡片数量:3
输入卡片:a78
你手的价值是16

你想另一手得分(Y还是N)?:Y
输入卡片数量:4
输入卡片:354K
你被捕了

我被卡的价值加在一起了

#include <iostream>
#include <string>
using namespace std;

int main()
{
int cards_in_hand;
int value, total_value = 0;
std::string card_value;


cout << "Enter the number of cards: ";
cin >> cards_in_hand;


cout << "Enter cards: ";
cin >> card_value;


for (int i = 0; i < card_value.size(); i++)
{

    switch (card_value[i])
    {
    case'2':
        value = 2;
        total_value = value + total_value;
        break;
    case '3':
        value = 3;
        total_value = value + total_value;
        break;
    case '4':
        value = 4;
        total_value = value + total_value;
        break;
    case '5':
        value = 5;
        total_value = value + total_value;
        break;
    case '6':
        value = 6;
        total_value = value + total_value;
        break;
    case '7': {
        value = 7;
        total_value = value + total_value;
        break; }
    case '8': {
        value = 8;
        total_value = value + total_value;
        break; }

    case '9':
        value = 9;
        total_value = value + total_value;
        break;
    case 't':
    case 'T':
    case 'j':
    case 'J':
    case 'q':
    case 'Q':
    case 'k':
    case 'K':
        value = 10;
        total_value = value + total_value;
        break;
    case 'a':
    case 'A': {
        if (total_value <= 10)
        {
            value = 11;
        }
        else
        {
            value = 1;
        }
        total_value = total_value + value;
    }

        if (total_value <= 21)
        {
            cout << "The value of your hand is: " << total_value << endl;
        }
        else
            cout << "YOU ARE BUSTED!\n";
    }


}
#包括
#包括
使用名称空间std;
int main()
{
int卡在手上;
整数值,总数值=0;
std::字符串卡_值;
手中的卡片;
卡片价值;
对于(int i=0;i如果(total_value我试图从您的代码中删除一些bug(在注释中提到过),但为了获得预期的输出,您仍然需要进行一些额外的计算。因此,您可能希望使用贪婪方法来找到可以获得的最大总值。
所以对于输入
卡片数量:4张
卡值:a666
您的代码将输出“您完蛋了!”
但正确的输出是>
你手的价值是:19
原因是第一个“a”您将直接将11添加到总计中,而无需查看字符串。因此,为了避免第一次遍历字符串中的所有卡片,如果您发现一个“a”,请不要执行任何操作(不要将1或11添加到总计值)只需增加您以前见过的“a”的计数,如果它不是“a”,则直接将卡的价值添加到总价值中,因为没有办法(您必须添加它们)。现在在结束时检查所有的“a”,并检查其中有多少可以转换为11而不会被破坏。(参见代码,太简单了!!!) 现在尝试组合两个代码片段,您将得到您想要的

int value, total_value = 0;
string card_value;  //card_value should be string

cout << "Enter the number of cards: ";
cin >> cards_in_hand;


cout << "Enter cards: ";
cin >> card_value;

//Strings are 0 based indexed,so n must be initially 0
for (int n = 0; n < cards_in_hand; n++)
{

    switch (card_value[n])
    {
    case'2':
        value = 2;
        total_value = value + total_value;
        break;
    case '3':
        value = 3;
        total_value = value + total_value;
        break;
    case '4':
        value = 4;
        total_value = value + total_value;
        break;
    case '5':
        value = 5;
        total_value = value + total_value;
        break;
    case '6':
        value = 6;
        total_value = value + total_value;
        break;
    case '7':
        value = 7;
        total_value = value + total_value;
        break;
    case '8':
        value = 8;
        total_value = value + total_value;
        break;

    case '9':
        value = 9;
        total_value = value + total_value;
        break;
    case 't':
    case 'T':
        value = 10;
        total_value = value + total_value;
        break;

    case 'j':
    case 'J':
        value = 10;
        total_value = value + total_value;
        break;
    case 'q':
    case 'Q':
        value = 10;
        total_value = value + total_value;
        break;
    case 'k':
    case 'K':
        value = 10;
        total_value = value + total_value;
        break;
    case 'a':
    case 'A':
        if (total_value <= 10)
        {
            value = 11;
        }
        else
        {
            value = 1;
        }
        total_value = total_value + value;
       // n++; remove this line as you are doing already incrementing in loop statement
    }


}

if (total_value <= 21)
{
    cout << "The value of your hand is: " << total_value << endl;
}
else
    cout << "YOU ARE BUSTED!\n";
int值,总值=0;
string card_value;//card_value应为string
手中的卡片;
卡片价值;
//字符串是基于0的索引,因此n最初必须为0
对于(int n=0;n<手中的卡片;n++)
{
开关(卡值[n])
{
案例'2':
数值=2;
总价值=价值+总价值;
打破
案例“3”:
数值=3;
总价值=价值+总价值;
打破
案例“4”:
数值=4;
总价值=价值+总价值;
打破
案例“5”:
数值=5;
总价值=价值+总价值;
打破
案例“6”:
数值=6;
总价值=价值+总价值;
打破
案例“7”:
数值=7;
总价值=价值+总价值;
打破
案例“8”:
数值=8;
总价值=价值+总价值;
打破
案例“9”:
数值=9;
总价值=价值+总价值;
打破
案例“t”:
案例“T”:
数值=10;
总价值=价值+总价值;
打破
案例“j”:
案例“J”:
数值=10;
总价值=价值+总价值;
打破
案例‘q’:
案例‘Q’:
数值=10;
总价值=价值+总价值;
打破
案例“k”:
案例“K”:
数值=10;
总价值=价值+总价值;
打破
案例“a”:
案例“A”:
如果(TooToalValueAdvices——考虑<代码> STD::MAP< /Cord>)以获得
//This variable stores how much value you can get only from 'a's without exceeding 21
int max_from_a = 0;

//If all 'a's are converted into 1 and still value goes above 21 then  "YOU ARE BUSTED !"
if(total_value + a_cnt > 21)
{
    cout<<"YOU ARE BUSTED !\n";
    return 0;
}

//Finding max_from_a
for(int used = 1 ; used <= a_cnt ; used++)
{

  //convert 'used' number of 'a's into 11 and remaining 'a's into 1
  int from_used = 11*used + 1*(a_cnt - used);

  //You'll get this....
  if(total_value + from_used > 21)
    break;

  max_from_a = max (max_from_a , from_used);

}

//Add value of a's into total_value
total_value = total_value + max_from_a;

cout << "The value of your hand is: " << total_value << endl;