2016-06-22 9 views
1

hereボード配列をtictactoeクラスのメンバー関数に渡すのは悪いことです。プライベートメンバ変数にして、それを知っていることがなくても内部的に操作する方が理にかなっています。TicTacToeクラスの文字配列を使用すると予期しない出力が発生する

私は私のコードでは、この変更を実装しようとしたとコンソールにボードを印刷しようとしたときに、今私は非常に奇妙な文字の出力を受けています。出力

Strange Character Output

イメージ

私はちょうどクラスを使い始めましたので、私は初歩的な間違いをしたと想像しています。何かご意見は?

メイン

//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); 

} 
+0

あなたのクラスのcharArray []を初期化していません。 .cppファイルの先頭にあるものは、グローバル変数です。あなたのクラスの変数と同じ名前ですが、それは違うものです。 – MaciekGrynda

答えて

4

それはあなたの0ということは表示されません。クラスには、ゲームのボードであるsquareArrayのクラスメンバーを初期化するコンストラクタがあります。

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

これはグローバルスコープで、squareArrayと呼ばれるいくつかの変数を宣言します。同じ名前のクラスメンバーを初期化しません。これはクラスのメンバーとは関係ありません。

このように、クラスメンバの初期内容は、ランダムなガベージを持つ初期化されていないメモリで構成されています。定義されていない動作の結果が表示され、初期化されていない配列の内容がstd::coutに表示されます。

したがって、クラスメンバーを初期化するクラスコンストラクターが必要です。

+0

こんにちはサム。私はこれを追加しようとしており、苦労しています。手伝ってくれる?私はchar TicTacToe()を使ってみました:squareArray {'1'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '8'、 '9'} {}シンボルsquar配列が解決できなかったというエラーが表示されます。 – StormsEdge

+0

ヘッダーファイル内のクラス定義内にデフォルトのコンストラクタ "TicTacToe();"を宣言し、変換単位で定義する必要があります。 "TicTacToe :: TicTacToe():squareArray {'1'、 '2 '、' 3 '、' 4 '、' 5 '、' 6 '、' 7 '、' 8 '、' 9 '} {} '"クラスコンストラクタの追加の例については、このトピックに関する好きなC++の本を読んでください。 –

+0

ええ、私は実際にそれを行い、正しい構文を見つけました。それは間違っていた。ありがとう! – StormsEdge

3

あなたは何

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

用途であるTicTacToesquareArrayを初期化することはありません。実行したときに、実装ファイルに

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

の文字列をsquareArrayという名前でグローバルに作成します。クラスメンバ変数squareArrayを初期化しません。メンバー変数を初期化するデフォルトコンストラクタを記述する必要があります。あなたは使用できます

TicTacToe() : squareArray{'1','2', '3', '4', '5', '6', '7', '8', '9'} {} 
関連する問題