繁体   English   中英

简单的骰子游戏,错误消息

[英]Simple dice game, error message

我正在尝试使用模拟骰子来构建一个非常简单的第一款游戏。

我在第49行出现错误: if(rollResult>aiRollResult)

我确信这是所有if语句中的一个非常简单的语法错误,但是我无法弄清楚如何解决它,还是不能像我一样在代码中间调用airoll()函数?

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

void airoll();

int main() {
    int b;
    srand(time(0));
    //random die roll
    int rollResult = 1+(rand()%6);

    switch (rollResult) //results options {
        case 1: {
            cout<<"Your Roll: 1"<<endl;
        }
        break;
        case 2: {
            cout<<"Your Roll: 2"<<endl;
        }
        break;
        case 3: {
            cout<<"Your Roll: 3"<<endl;
        }
        break;
        case 4: {
            cout<<"Your Roll: 4"<<endl;
        }
        break;
        case 5: {
            cout<<"Your Roll: 5"<<endl;
        }
        break;
        case 6: {
            cout<<"Your Roll: 6"<<endl;
        }
        break;
    }

    airoll();

    if(rollResult>aiRollResult) {
        cout<<"You win!"<<endl;
    }

    if (aiRollResult>rollResult) {
        cout<<"You lose!"<<endl;
    }

    if (rollResult==aiRollResult) {
        cout<<"It's a tie!"<<endl;
    }
}

void airoll() {
    int aiRollResult=1+(rand()%6);
    cout<<"AI roll: "<<aiRollResult<<endl;
}

您必须声明并初始化一个名为aiRollResult的变量,该变量将来自函数airoll() 因此将函数从返回void更改为返回int 解耦消息显示; main显示它。

函数内部的aiRollResult变量:

void airoll() {
    int aiRollResult=1+(rand()%6);
    cout<<"AI roll: "<<aiRollResult<<endl;
}

是该函数的局部变量。 这意味着当函数运行完毕后,该整数将被释放。 我建议您改为返回整数:

int airoll() {
    int aiRollResult=1+(rand()%6);
    cout<<"AI roll: "<<aiRollResult<<endl;
    return aiRollResult;
}

现在您可以替换:

airoll();

与:

int aiRollResult = airoll();

并且您被设置。

我还注意到在switch语句中您正在执行以下操作:

    case 1: {
        cout<<"Your Roll: 1"<<endl;
    }
    break;

完全不需要封闭支架。 使用这些括号,您可以创建一个内部代码块。仅当在case语句中声明变量时,此块才有用。

您可以将这些行重写为:

case 1: cout << "Your Roll: 1" << endl; break;

最后,不要用以下方法污染当前名称空间:

using namespace std;

习惯于使用std::前缀或将您真正需要的内容包括在内:

using std::cout;
using std::endl;
// ...

您的变量aiRollResult未在main()函数的范围内定义。 它仅存在于airoll()函数的范围内。 更改airoll()

int airoll()
{
    int aiRollResult=1+(rand()%6);
    cout<<"AI roll: "<<aiRollResult<<endl;
    return aiRollResult;
}

注意int返回类型。

现在,您可以在main函数中获得airoll()的结果,如下所示:

int aiRollResult = airoll();

它将调用airoll()函数,然后将结果存储在变量中。 那应该解决您的问题。 在此处了解有关功能的更多信息: http : //www.cplusplus.com/doc/tutorial/functions/

这真的很简单。 aiRollResult变量是一个局部变量,在其函数的括号之外无法看到

为了解决这个问题,您可以声明一个全局变量并将其初始化为aiRollResult

在您的代码中,我看到:

switch (rollResult) //results options {
    [.. bunch of case statements...]
}

airoll();

注意, switch语句的开头{//注释隐藏。

但是您仍然有结束语}

我认为您的括号不匹配。

您认为正在关闭switch语句的最后一个括号实际上是在关闭main。 然后是airoll(); 是任何函数外部的函数调用,从而导致错误。

其他人已经描述了aiRollResult的范围界定问题,但是我不认为这是您所描述的错误的直接原因。

(当然,如果您在原始问题中发布了确切的错误消息 ,我们可能会更有帮助)

总结一下已经说过的所有内容,但实际上没有人一次全部说过:

    switch (rollResult) //results options {

这导致支架不匹配。 将大括号放在评论之前,如下所示:

    switch (rollResult) { // results options

尽管从技术上讲这是正确的,但它很糟糕:

    case 1: {
        cout<<"Your Roll: 1"<<endl;
    }
    break;

更改为此:

    case 1:
        cout<<"Your Roll: 1"<<endl;
        break;

这对后面的if语句没有任何帮助:

    airoll();

使它看起来像这样:

    aiRollResult = airoll();

当然,这意味着您必须在声明部分的上方声明aiRollResult。

最后,此函数输出一个值,但您不能使用该值,因为它会立即将该值直接扔进垃圾箱:

    void airoll() {
        int aiRollResult=1+(rand()%6);
        cout<<"AI roll: "<<aiRollResult<<endl;
    }

使它看起来像这样:

    int airoll() {
        int aiRollResult = 1 + (rand() % 6);
        cout << "AI roll: " << aiRollResult << endl;
        return aiRollResult;
    }

此外,可能会考虑到有关名称空间污染的评论,但我们不要陷入编码风格的斗争中,是吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM