有人给我here指出,将板数组传递到tictactoe类的成员函数中是一种不好的做法。将其设置为私有(private)成员变量并在不对其进行任何主要了解的情况下在内部对其进行操作更有意义。

我尝试在代码中实现此更改,现在尝试将板子打印到控制台时收到非常奇怪的字符输出:

输出的图像

c++ - TicTacToe类中使用char数组的意外输出-LMLPHP

我刚刚开始使用类,所以我想我犯了一个基本错误,并且这种错误正在通过这种方式显示出来。有什么想法吗?

主要

    //implementation of TicTacToe
//Using classes this time

#include <iostream>
#include "TicTacToeClass.h"


int main()
{

    //Assumes no play unless user decides they want to play and initializes game variable to TicTacToe class
    bool play = false;
    TicTacToe game;

    play = game.getUserWantToPlay();

    //allows for multiple games to be played
    while(play == true)
    {

        char playerWinner = 'n';
        char player = 'X';

        //single game iteration
        while(playerWinner == 'n')
        {

            game.drawBoard();
            game.getPlayerMove(player);
            playerWinner = game.checkForWin(player);

            if(playerWinner == 'n')
            {
                player = game.togglePlayer(player);
            }
        }

        game.drawBoard();

        play = game.getUserWantToPlay();

    }

    return(0);
}

类标题
* TicTacToeClass.h
 *
 *  Created on: Jun 15, 2016
 *
 */

#ifndef TICTACTOECLASS_H_
#define TICTACTOECLASS_H_


class TicTacToe
{

    public:
        bool getUserWantToPlay();
        void drawBoard();
        void getPlayerMove(char player);
        char togglePlayer(char player);
        char checkForWin(char player);

    private:
        char squareArray[9];

};

#endif /* TICTACTOECLASS_H_ */

类的实现
//TicTacToe class implementation
//Leeroy Jenkins

#include "TicTacToeClass.h"
#include <iostream>

char squareArray[9] = {'1','2', '3', '4', '5', '6', '7', '8', '9'};

bool TicTacToe::getUserWantToPlay()
{

    char response;
    bool invalidResponse = true;
    bool play = false;

    while(invalidResponse == true)
    {

        std::cout << "Would you like to play a new game of TicTacToe? (y/n) " << std::endl;
        std::cin >> response;

        if(response == 'y')
        {
            invalidResponse = false;

            play = true;
        }
        else if(response == 'n')
        {
            std::cout << "No Problem!";
            invalidResponse = false;
        }
        else
        {
            std::cout << "Please input a proper response (y/n)" << std::endl;
        }

    }

    return play;
}
void TicTacToe::drawBoard()
{

    //draws the game board with updated characters for each player

        std::cout << "Player 1 (X) - Player 2 (O)" << std::endl << std::endl << std::endl;

        std::cout << "    |     |" << std::endl;
        std::cout << " " << squareArray[0] << "  |  " << squareArray[1] << "  |  " << squareArray[2] << std::endl;

        std::cout << "____|_____|____" << std::endl;
        std::cout << "    |     |    " << std::endl;

        std::cout << " " << squareArray[3] << "  |  " << squareArray[4] << "  |  " << squareArray[5] << std::endl;

        std::cout << "____|_____|____" << std::endl;
        std::cout << "    |     |    " << std::endl;

        std::cout << " " << squareArray[6] << "  |  " << squareArray[7] << "  |  " << squareArray[8] << std::endl;

}

void TicTacToe::getPlayerMove(char player)
{
    //Gets player move and stores in board array for display through next iteration

    bool playerMoveFound = false;
    char playerTurn = '0';
    char playerMove = '0';

    if(player == 'X')
    {
        playerTurn = '1';
    }
    else
    {
        playerTurn = '2';
    }


    while(playerMoveFound == false)
    {
        std::cout << "Player " << playerTurn << " please make a move" << std::endl;
        std::cin >> playerMove;

        for(int x = 0; x < 9; x++)
        {
            //If finds the array number makes the change to the iteration...prevents x or o movement
            if(playerMove == squareArray[x] && playerMove != 'X' && playerMove != 'O' && playerMove != 'x' && playerMove != 'o')
            {
                squareArray[x] = player;

                playerMoveFound = true;
            }

        }
        if(playerMoveFound == false)
        {
            std::cout << "Invalid player move..." << std::endl;
        }
    }
}

char TicTacToe::checkForWin(char player)
{
    char playerWin = 'n';
    int testForTie = 0;

    //Tests winning combinations
    if(squareArray[0] == squareArray[1] && squareArray[1] == squareArray[2])
        {
            playerWin = player;
        }
        else if(squareArray[0] == squareArray[3] && squareArray[3] == squareArray[6])
        {
            playerWin = player;
        }
        else if(squareArray[0] == squareArray[4] && squareArray[4] == squareArray[8])
        {
            playerWin = player;
        }
        else if(squareArray[1] == squareArray[4] && squareArray[4] == squareArray[7])
        {
            playerWin = player;
        }
        else if(squareArray[2] == squareArray[4] && squareArray[4] == squareArray[6])
        {
            playerWin = player;
        }
        else if(squareArray[2] == squareArray[5] && squareArray[5] == squareArray[8])
        {
            playerWin = player;
        }
        else if(squareArray[3] == squareArray[4] && squareArray[4] == squareArray[5])
        {
            playerWin = player;
        }
        else if(squareArray[6] == squareArray[7] && squareArray[7] == squareArray[8])
        {
            playerWin = player;
        }
        else
        {
            //Tests for a tie game
            for(int x = 0; x < 9; x++)
            {
                if(squareArray[x] == 'x' || squareArray[x] == 'o' || squareArray[x] == 'X' || squareArray[x] == 'O')
                {
                    testForTie++;
                }
            }

            if(testForTie == 9)
            {

                playerWin = 't';
            }
        }

    if(playerWin == player)
    {
        if(player == 'X')
        {
            std::cout << std::endl << "Congratulations player 1!  You Win!" << std::endl;
        }
        else
        {
            std::cout << std::endl << "Congratulations player 2!  You Win!" << std::endl;
        }
    }
    else if(playerWin == 't')
    {
        std::cout << "Tie!  You should play again to settle the duel!" << std::endl;
    }

    return(playerWin);

}

char TicTacToe::togglePlayer(char player)
{

    player = player == 'X' ? 'O':'X';

    return(player);

}

最佳答案

看来TicTacToe类没有构造函数来初始化其squareArray类成员(游戏板)。

char squareArray[9] = {'1','2', '3', '4', '5', '6', '7', '8', '9'};

这将在全局范围内声明一些名为squareArray的变量。它不会初始化您的同名类成员,并且与该类的成员无关。

这样,类成员的初始内容包括未初始化的内存和随机垃圾。您将看到未定义行为的结果,并向std::cout显示未初始化数组的内容。

您需要具有一个用于初始化该类成员的类构造函数。

07-24 13:24