【问题标题】:C++ Random string array If statement only outputs one answerC++ 随机字符串数组 If 语句只输出一个答案
【发布时间】:2020-08-10 13:58:40
【问题描述】:

这是我第一次独立开发并遇到问题的代码。我用谷歌搜索了这个问题,但没有占上风。我正在制作一个剪刀石头布游戏,我有一个输入,您可以在其中选择石头布或剪刀,在您选择之后,程序会随机输出石头布或剪刀,现在我的问题是随机输出后的 If 语句,它只选择:

{
   cout << ", you lose! Do you want to play again? (Yes / No)";
}         

然而,这是我的代码:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>
using namespace std;

int main()
{
    // yn = yes / no
    string yn;
    cout << "Do you want to play Rock, Paper, Scissors? (Yes / No) ";
    cin >> yn;
    if (yn == "Yes")
    {
        // rps = rock paper scissors
        string rps;
        cout << "Choose, Rock, Paper, or Scissors\n";
        cin >> rps;

        if (rps == "Rock")
        {
            // Randomizer 
            srand(time(0));
            string rpslist[3] = { "Rock", "Paper", "Scissors " };
            int rpsnumber = rand() % 3;
            cout << "I choose: " << rpslist[rpsnumber];

            if (rpslist[1] == "Rock")
            {
                cout << ", we draw! Do you want to play again? (Yes / No)";
            }
            if (rpslist[2] == "Paper");
            {
                cout << ", you lose! Do you want to play again? (Yes / No)";
            }         
            if (rpslist[3] == "Scissors")
            {
                cout << ", you win! Do you want to play again? (Yes / No)";
            }
        }

【问题讨论】:

  • if 检查“纸张”后有一个分号。 (无关,在检查获胜者时,您没有与正确的事物进行比较。)
  • 这不是问题,但对stand(time(0)); 的调用应该在程序执行任何实际工作之前进行。在这种情况下,这无关紧要,但想法是您只调用一次,并且随着代码的开发使其可以玩多轮游戏,您必须移动它。跨度>

标签: c++ arrays string random


【解决方案1】:

我想指出几点。可能解决您的问题的最重要部分是第三和第四部分。但是请务必阅读所有这些内容,我认为了解这些内容很重要。

1) 当你检查一个数组的元素时,你总是从索引 0 开始。所以在这种情况下,“Rock”将对应于 rpsList[0],Paper 将对应于 rpsList[1],以此类推等等。所以当你说 if(rpsList[1] == "Rock") 这显然是错误的,因为 rpsList[1] 是纸。

2) 1201ProgramAlarm 指出了这一点,你在纸的 if 语句后面有一个分号。

3) 您的 if 语句应该替换为 if-else-if 语句。 if(rpList[0] == " Rock) ... else if(rpList[1] == "Paper"). 如果你有单独的 if 语句,它会检查每个 if 语句,即使条件是false。在您的第一个 if 语句之后执行 else if 语句将允许您在发现任何语句为真后立即跳过冗余检查。

4) 您的 if 语句不会对先前生成的随机数做任何事情。相反,您正在检查第一个元素是否为 Rock,第二个元素是否为 Paper,或者您的第三个元素是否为 Scissors,在这种情况下,它们在该序列中,因为这就是您排列字符串数组的方式。改为这样做:

if (rpList[rpsNumber] == "Rock")
{
...
}
else if (rpList[rpsNumber] == "Paper")
{
...
}
else if (rpList[rpsNumber] == "Scissors")
{
...
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2020-05-24
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多