【问题标题】:Appears that no further code executes after break from while loop (c++)从while循环(c ++)中断后似乎没有进一步的代码执行
【发布时间】:2013-12-07 02:49:58
【问题描述】:

我正在学习 c++ 并创建一个小型 rpg 风格的游戏。

我有一个函数可以提供初始统计点,但是一旦添加了所有点,我似乎无法跳出 while 循环并在循环后执行 cout。请注意,所有技能名称和 CharacterName 都是前向声明的,并且技能名称是完整输入的。 RemainingPoints 也是前向声明的。所有继续正确执行。也没有编译器错误。

void CharacterSkillSetup()
{
    std::string SelectedSkill;
    int AssignedPoints;

    while(SelectedSkill != "Muscle" || SelectedSkill != "Focus"
        || SelectedSkill != "Reflexes" || SelectedSkill != "Cogni"
        || SelectedSkill != "Precision" || SelectedSkill != "Resistance"
        || SelectedSkill != "Luck" || SelectedSkill != "Finished")

    {
        std::cout << "\nWell then " << CharacterName
            << ", you seem like you have the capacity for a bit of training. \n \n";
        std::cout << "You can train in the following skills: \n";
        std::cout << "Muscle " << MuscleSkill << " - Increase Physical and Ranged damage. \n";
        std::cout << "Focus " << FocusSkill << " - Increase Magical damage. \n";
        std::cout << "Reflexes " << ReflexesSkill << " - Increase Physical and Ranged speed. \n";
        std::cout << "Cogni " << CogniSkill << " - Increase Magical speed. \n";
        std::cout << "Precision " << PrecisionSkill << " - Increase hit chance. \n";
        std::cout << "Resistance " << ResistanceSkill
            << " - Increase hitpoints and lessen damage received. \n";
        std::cout << "Luck " << LuckSkill << " - Increase value of loot drops. \n \n";
        std::cout << "You currently have " << RemainingPoints << " skillpoints to assign. \n \n";
        std::cout <<
            "Please type the full name of the skill followed by how many points you wish \nto assign to it.\n";
        std::cout << "\nIf you wish to assign some skillpoints at a later time type 'Finished 0'\n";
        std::cin >> SelectedSkill >> AssignedPoints;
        if(std::cin.fail())
        {
            std::cin.clear();
        }

        if(AssignedPoints > 14 || AssignedPoints < 0 || (RemainingPoints - AssignedPoints < 0))
        {
            AssignedPoints = 0;
        }

        if(SelectedSkill == "Muscle")
        {
            MuscleSkill = MuscleSkill + AssignedPoints;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Focus")
        {
            FocusSkill = AssignedPoints + FocusSkill;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Reflexes")
        {
            ReflexesSkill = AssignedPoints + ReflexesSkill;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Cogni")
        {
            CogniSkill = AssignedPoints + CogniSkill;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Precision")
        {
            PrecisionSkill = AssignedPoints + PrecisionSkill;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Resistance")
        {
            ResistanceSkill = AssignedPoints + ResistanceSkill;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Luck")
        {
            LuckSkill = AssignedPoints + LuckSkill;
            RemainingPoints = RemainingPoints - AssignedPoints;
        }

        else if(SelectedSkill == "Finished")
        {
            std::string Choice;

            std::cout << "Are you sure you're finished adding points? \n";
            std::cin >> Choice;

            if(Choice == "Yes")
            {
                break;
            }
            else if(Choice == "No")
            {
                continue;
            }
        }

        if(RemainingPoints = 0)
        {
            break;
        }
    }

    std::cout << "Loop finished";
}

【问题讨论】:

  • 您所要做的就是将SelectedSkill 设置为这些魔术字符串之一,您的while 循环将终止,这在cin 行不会发生吗?
  • 阅读有关您的 while 语句的德摩根定律。 stackoverflow.com/questions/18949375/demorgans-law-and-c
  • @ChrisO cin.fail() 检查和紧随其后的 cin.clear() 确保 SelectedSkill 无法终止循环,以此来阻止滥用函数,从而强制用户使用 Finished 留下剩余点数。至少我认为这就是你所说的。
  • 糟糕,阅读来自@KeithSmith 的链接,并想象如果用户输入Luck 会发生什么(区分大小写的比较顺便说一句),所以当SelectedSkill == "Luck" 时,看看其余的while 条件中的比较,它们将评估为 true,从而确保您的无限循环。
  • 这就是为什么我试图通过 RemainingPoints 或 Choice 打破循环的原因,我确实在括号中尝试了上述所有条件,后跟 && RemainingPoints != 0。所以,while((以前的条件) && RemainingPoints != 0),但是同样的问题是不执行 cout

标签: c++ while-loop break


【解决方案1】:

我假设您指的是这个特定的休息时间。 if 语句将 0 分配给 RemainingPoints,因此永远不会评估为真。您应该使用 ==,这是一个常见的错字。

    if(RemainingPoints = 0)
    {
        break;
    }

【讨论】:

  • 好的,我已经修正了错字,但是“循环完成”仍然没有执行。每当 RemainingPoints == 0 后按 Enter 表示 Luck 14(因为 RemainingPoints 在初始化时被分配给 14),它将允许我继续输入并且不会执行进一步的代码。
【解决方案2】:
if(RemainingPoints = 0)
{
   break;
}

这就是为什么最好写

if(0 = RemainingPoints)

并且有一个编译器错误而不是一个恼人的错误

【讨论】:

  • 或者更好的是,打开抱怨这种情况的编译器警告;-)
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多