有人给我here指出,将板数组传递到tictactoe类的成员函数中是一种不好的做法。将其设置为私有(private)成员变量并在不对其进行任何主要了解的情况下在内部对其进行操作更有意义。
我尝试在代码中实现此更改,现在尝试将板子打印到控制台时收到非常奇怪的字符输出:
输出的图像
我刚刚开始使用类,所以我想我犯了一个基本错误,并且这种错误正在通过这种方式显示出来。有什么想法吗?
主要
//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
显示未初始化数组的内容。您需要具有一个用于初始化该类成员的类构造函数。