Joe*_*ing 1 c++ arrays reference
问候,
自从我上一次关于C++的问题以来,我实际上学到了很多东西.我现在对课程很满意,对指针和参考文献感到不舒服.
请注意,我不是要求你解决我的问题,我问为什么我没有得到希望的结果.
这里有一些代码片段可以帮助我解释这个问题:我正在制作一个基于控制台的井字游戏(最近开始学习C++,这个imo是一个很好的方法)
main.cpp中:
//Here I initalise 1 variable and an array
int move;
char board[9] = {' ',' ',' ',' ',' ',' ',' ',' ',' '};
Run Code Online (Sandbox Code Playgroud)
第一个问题:有没有更好的方法来定义char数组中的空格?我这样做的原因是,我希望我的tictactoe板在X或O尚未设置时包含空格.
main.cpp中:
if(referee.validateMove(board, move))
{
board[move] = player2.getToken();
displayBoard(board);
}
Run Code Online (Sandbox Code Playgroud)
这里发生的事情很容易理解,但无论如何我都会解释;
从对象裁判员调用validateMove方法,并传递2个参数,即玩家选择的移动(在0-8之间).和tictactoe板.
Referee.cpp
bool Referee::validateMove(const char (&board)[9], int& move)
{
if(board[move] != 'X' || 'O')
{
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这是主要问题所在,我的最后一个问题就出现了.如前所见,我传递了一个大小为9的字符数组.
对move变量的引用效果很好(我应该使用引用还是指针?)并且它包含了希望的结果.
在这一点上,假设玩家1刚刚移动并在第2位放置了一个令牌,我现在想将我的令牌作为第二个位置放置在第二个位置
当我使用visual studio进行调试时,我得到以下内容:
0x0024faa8 " O ÌÌÌÌÌÌÌÌÌÌÌ"
Run Code Online (Sandbox Code Playgroud)
这是我把鼠标放在board参数上的时候.所以董事会确实知道,它已被占用.
然而,为什么validateMove方法总是返回true,并且board [move]永远不会等于O或X?
感谢您抽出宝贵时间阅读我的问题.如果您有疑问,或者我在愚蠢的事情中解释了某些内容,您会看到无效的命名约定,请通知我.我是学生,我想尽可能多地接受.
此问题已得到解决.感谢那些已经回答的人.非常感谢它.
你的病情归结为:
if((board[move] != 'X') || ('O'))
Run Code Online (Sandbox Code Playgroud)
'O'true在这种情况下总会评估,所以你总是通过这个条件.你想要的是这个:
if((board[move] != 'X') && (board[move] != 'O'))
Run Code Online (Sandbox Code Playgroud)
要验证,此代码对我来说运行正常:
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
True
False
False
Run Code Online (Sandbox Code Playgroud)