【问题标题】:reference to array, not quite working as intended对数组的引用,没有按预期工作
【发布时间】:2011-03-24 17:56:20
【问题描述】:

您好,

自从我上一个关于 C++ 的问题以来,我实际上学到了很多东西。我现在对类很满意,只是对指针和引用不太满意。

请注意,我并不是要求你解决我的问题,我是在问为什么我没有得到想要的结果。

这里有一些代码 sn-ps 可以帮助我解释问题: 我正在制作一个基于控制台的井字游戏(最近开始学习 C++,这个 imo 是一个很好的方法)

main.cpp:

//Here I initalise 1 variable and an array
int move;
char board[9] = {' ',' ',' ',' ',' ',' ',' ',' ',' '};

第一个问题:有没有更好的方法来定义 char 数组中的空格? 我这样做的原因是,当尚未设置 X 或 O 时,我希望我的 tictactoe 板包含一个空白空间。

main.cpp:

if(referee.validateMove(board, move))
{
   board[move] = player2.getToken();
   displayBoard(board);
}

这里发生的事情很容易理解,但我还是会解释一下;

从对象裁判发出对 validateMove 方法的调用,并传递了 2 个参数,即玩家选择的移动(在 0-8 之间)。还有tictactoe板。

裁判.cpp

bool Referee::validateMove(const char (&board)[9], int& move)
{
    if(board[move] != 'X' || 'O')
    {
        return true;
    } 
    else 
    {
        return false;
    }
}

这是主要问题所在,我的最后一个问题出现了。 如前所述,我传递了一个大小为 9 的字符数组。

对 move 变量的引用效果很好(我应该使用引用还是指针?)并且它包含希望的结果。

此时,假设玩家 1 刚刚移动并在位置 2 放置了一个标记 我现在想将我的代币作为 PLAYER 2 放在位置 2

当我使用 Visual Studio 进行调试时,我得到以下信息:

0x0024faa8 "  O      ÌÌÌÌÌÌÌÌÌÌÌ"

这是我将鼠标放在板参数上的时候。 所以董事会确实知道,它被占用了。

为什么 validateMove 方法总是返回 true,并且 board[move] 永远不会等于 O 或 X?

感谢您花时间阅读我的问题。如果您有问题,或者我解释了一些愚蠢的事情,您看到无效的命名约定,请通知我。我是一名学生,我想尽可能多地学习。

此问题已解决。感谢那些已经回答的人。非常感谢。

【问题讨论】:

    标签: c++ arrays reference


    【解决方案1】:

    您的情况归结为:

    if((board[move] != 'X') || ('O'))
    

    'O' 在这种情况下将始终评估为 true,因此您始终通过条件。你想要的是这样的:

    if((board[move] != 'X') && (board[move] != 'O'))
    

    为了验证,这段代码对我来说运行良好:

    #include <iostream>
    
    bool validateMove(const char (&board)[9], int move)
    {
        if((board[move] != 'X') && (board[move] != 'O'))
        {
            std::cout << "True" << std::endl;
            return true;
        } 
        else 
        {
            std::cout << "False" << std::endl;
            return false;
        }
    }
    
    
    int main()
    {
        char board[9] = {' ',' ','O',' ','X',' ',' ',' ',' ',};
    
        validateMove(board, 0);
        validateMove(board, 2);
        validateMove(board, 4);
    }
    

    输出是:

    True
    False
    False
    

    【讨论】:

    • 使用德摩根定律,您可以稍微优化一下:if(!((board[move] == 'X') &amp;&amp; (board[move] == 'O'))) :)
    • ((board[move] != 'X') || (board[move] != 'O')) 也将始终评估为 true,使用 ((board[move] != 'X') &amp;&amp; (board[move] != 'O'))
    • @Micheal:谢谢,已解决。
    • 修复了我的代码,这是另一个愚蠢的小事。非常感谢。 :)
    • 哈。不小心删了一条评论。只是为了澄清我的,它应该使用||。 @Joey,你到底用了什么?我们已经发布了四个不同的版本。大声笑。
    【解决方案2】:

    您在最后显示额外垃圾的原因是您的 "board" 不是一个以 nul 结尾的字符串。如果你也想使用 出于显示目的,您需要将其声明为 board[10], 并在末尾添加一个 '\0'。从设计的角度来看, 但是,我建议不要这样做。事实上,我会 定义一个 Board 类,用

    当我这样做时:您的 validateMove 函数应该是:

    return board[move] == 'X' || board[move] == '0';
    

    或者甚至更简单:

    return board[move] == ' ';
    

    你是 ||' '0',转换为布尔值,总是 真的。并且返回 true 或 false 的 if 是不必要的 复杂和混乱,并建议作者要么 不理解 'bool' 的概念,或者是故意的 试图混淆代码。

    【讨论】:

    • 您的第一个版本需要否定:!(board[move] == 'X' || board[move] == '0'); - 但您的第二个版本更优雅。
    • 我做这件事的方式,是我强迫自己去做的方式。所以也许你是对的。不过,您的答案非常清晰易懂。所以我从中学到了。 :) 谢谢。
    • @Space_C0wb0y 你对我的第一个建议是正确的,但我会重写它return board[move] != 'X' &amp;&amp; board[move] != '0'。对我来说似乎更简单。 (但我仍然认为,如果您要检查广场是否无人居住,则应该测试无人居住,而不是所有可能的有人居住。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多