hereボード配列をtictactoeクラスのメンバー関数に渡すのは悪いことです。プライベートメンバ変数にして、それを知っていることがなくても内部的に操作する方が理にかなっています。TicTacToeクラスの文字配列を使用すると予期しない出力が発生する
私は私のコードでは、この変更を実装しようとしたとコンソールにボードを印刷しようとしたときに、今私は非常に奇妙な文字の出力を受けています。出力
のイメージ
私はちょうどクラスを使い始めましたので、私は初歩的な間違いをしたと想像しています。何かご意見は?
メイン
//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);
}
あなたのクラスのcharArray []を初期化していません。 .cppファイルの先頭にあるものは、グローバル変数です。あなたのクラスの変数と同じ名前ですが、それは違うものです。 – MaciekGrynda