ссылка на массив, не совсем работает, как задумано - PullRequest
1 голос
/ 24 марта 2011

Привет,

Со времени моего последнего вопроса о C ++ я действительно выучил довольно много.Теперь я чувствую себя комфортно с классами, но пока не очень удобен с указателями и ссылками.

Пожалуйста, обратите внимание, я не прошу вас ни разу, чтобы решить мою проблему, я спрашиваю, почему я не получаю желаемый результат.

Вот некоторые фрагменты кода, которые должны помочь мне объяснить проблему: Я делаю консольную игру в крестики-нолики (недавно начал изучать C ++, этот imo - хороший способ для этого)

main.cpp:

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

Первый вопрос: есть ли лучший способ определить пустые места в массиве символов?Причина, по которой я так поступаю, заключается в том, что я хочу, чтобы на моей плате tictactoe было пустое место, когда X или O еще не установлены.

main.cpp:

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

То, что здесь происходит, легко понять, но я все равно объясню;

Вызов метода validateMove от объекта-рефери сделан, и передано 2 параметра, ход, который выбрал игрок (между 0-8).и тиктактое табло.

Referee.cpp

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

Вот где главная проблема, и возникает мой последний вопрос.Как было показано ранее, я передал массив символов размером 9.

Ссылка на переменную перемещения работает хорошо (я должен использовать ссылку или указатель?), И она содержит желаемый результат.

В этот момент, скажем, игрок 1 только что сделал свой ход и поместил токен в позицию 2. Теперь я хочу поместить свой токен в качестве ИГРОКА 2 в позицию 2

Когда я отлаживаю в Visual Studio, я получаюследующее:

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

Это когда я держу мышь на параметре платы.Таким образом, доска знает, что она занята.

Почему, однако, метод validateMove всегда возвращает true, и доска [перемещение] никогда не равна O или X?

Спасибо, что взяливремя прочитать мою проблему.Если у вас есть вопрос или я что-то объяснил по глупости, вы видите недействительные соглашения об именах, пожалуйста, сообщите мне.Я студент, и я хочу забрать как можно больше.

Эта проблема решена.Спасибо за тех, кто ответил.Высоко ценю это.

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

Ваше состояние сводится к следующему:

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
2 голосов
/ 24 марта 2011

Причина, по которой вы выводите лишний мусор в конце, заключается в том, что ваша доска не является строкой с нулевым окончанием.Если вы также хотите использовать его для отображения, вам нужно объявить его board [10] и добавить '\ 0' в конце.Однако с точки зрения дизайна я бы рекомендовал против этого.На самом деле я бы определил класс Board с оператором << для его отображения, чтобы я мог изменять представление по своему желанию, не изменяя структуру.Если представление внутри класса board является char [9], а значения board являются действительными символами, то вы можете просто записать в board плату в char [10], добавить пропущенный '\ 0' и вывести его.Будьте готовы принять более сложное решение позже, однако, если вы обнаружите, что char [3] [3] является лучшим представлением или что его предпочтительно использовать, скажем, 0, -1 и 1 в качестве статуса позиции надоска.(Вероятно, я бы также назначил класс доски, отвечающий за определение законности хода). </p>

И пока я в этом: ваша функция validateMove должна быть:

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

или, может быть, даже проще:

return board[move] == ' ';

Вы имели || 'с' 0 ', что, преобразованное в bool, всегда верно.И если возвращение true или false является ненужным усложнением и беспорядком, и предполагает, что автор либо не понимает концепцию «bool», либо намеренно пытается запутать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...