问候,
自从我上一次关于C ++的问题以来,我实际上学到了很多东西。我现在对课程很满意,对指针和参考文献感到不太满意。
请注意,我不是要求你解决我的问题,我问为什么我没有得到希望的结果。
这里有一些代码片段可以帮助我解释这个问题: 我正在制作一个基于控制台的tic-tac-toe游戏(最近开始学习C ++,这个imo是一个很好的方法)
main.cpp中:
//Here I initalise 1 variable and an array
int move;
char board[9] = {' ',' ',' ',' ',' ',' ',' ',' ',' '};
第一个问题:是否有更好的方法在char数组中定义空格? 我这样做的原因是,我希望我的tictactoe板在X或O尚未设置时包含空格。
main.cpp中:
if(referee.validateMove(board, move))
{
board[move] = player2.getToken();
displayBoard(board);
}
这里发生的事情很容易理解,但无论如何我都会解释;
从对象裁判员调用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;
}
}
这是主要问题所在,我的最后一个问题出现了。 如前所述,我传递了一个大小为9的字符数组。
对move变量的引用效果很好(我应该使用引用还是指针?)并且它包含了所希望的结果。
此时,玩家1表示移动并在第2位放置了一个令牌 我现在想把我的令牌作为第2位的玩家2
当我使用visual studio进行调试时,我得到以下内容:
0x0024faa8 " O ÌÌÌÌÌÌÌÌÌÌÌ"
这是我在电路板参数上按住鼠标的时候。 所以董事会知道,它已被占用。
为什么validateMove方法总是返回true,并且board [move]永远不会等于O或X?
感谢您抽出宝贵时间阅读我的问题。如果您有疑问,或者我在愚蠢的事情中解释了某些内容,您会看到无效的命名约定,请通知我。我是学生,我想尽可能多地接受。
此问题已解决。感谢那些已经回答的人。非常感谢。
答案 0 :(得分:5)
你的情况归结为:
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
答案 1 :(得分:2)
你最后显示额外垃圾的原因是你的 “board”不是一个nul终止字符串。如果你也想使用 它用于显示目的,你需要声明它[10], 并在末尾添加'\ 0'。从设计的角度来看, 但是,我建议不要这样做。事实上,我会 定义一个Board类,其中&lt;&lt;操作员显示它,这样 我可以随意更改表示,而不必 修改框架。如果在董事会内表示 class是char [9],板值是实际值 字符,然后你可以简单地将电路板记入 一个char [10],追加缺少的'\ 0',然后输出。做好准备 然而,如果你发现,后来采用更复杂的解决方案 char [3] [3]是一个更好的表示,或者它是 最好使用,比方说0,-1和1作为一个位置的状态 在板上。 (我可能有董事会负责人 确定移动的合法性。)
当我在它时:你的validateMove函数应该是:
return board[move] == 'X' || board[move] == '0';
或者甚至更简单:
return board[move] == ' ';
你正在使用'0',转换为bool,总是如此 真正。并且返回true或false的if是不必要的 并发症和混乱,并建议作者 不理解'bool'的概念,或者是故意的 试图混淆代码。