Making a 3D Tic Tac Toe game using class inheritance. Compiler error as follows.
line:
43 [Error] 'void CPUClass::cpu()' is private
190 [Error] within this context
Looking at my code, I've clearly defined cpu() as public. Any ideas what I'm overlooking?
#include <iostream>
#include <time.h> //seeding random
#include <windows.h>
using namespace std;
class TTT {
public:
void setup();
void display();
void cpu();
void player();
void check(int);
protected:
int cp; //comp points
int pp; //player points
char board[9]; //board
char board2[9];
char board3[9];
char xo[2];
int rn; //random who goes first
int won;//checks for win or stalemate
int turn;//keeps track of current player
int rc;//random comp move
int full;//see if board is full
int b1f;
int b2f;
int b3f;
};
class CPUClass : public TTT{
void cpu();
};
int main(int argc, char *argv[])
{
TTT ttt;
cout << "Newfangled 3D TicTacToe!" << endl;
cout << "~~play as though all three boards are stacked as a cube. Same rules apply.~~" << endl;
ttt.setup();
}
void TTT::setup(){ //sets up gamespace
won = 0; //game not won
full = 0; //board is full at 9
cp = 0;
pp =0;
b1f = 0;
b2f = 0;
b3f=0;
//the three boards:
board[0] = '1';
board[1] = '2';
board[2] = '3';
board[3] = '4';
board[4] = '5';
board[5] = '6';
board[6] = '7';
board[7] = '8';
board[8] = '9';
board2[0] = '1';
board2[1] = '2';
board2[2] = '3';
board2[3] = '4';
board2[4] = '5';
board2[5] = '6';
board2[6] = '7';
board2[7] = '8';
board2[8] = '9';
board3[0] = '1';
board3[1] = '2';
board3[2] = '3';
board3[3] = '4';
board3[4] = '5';
board3[5] = '6';
board3[6] = '7';
board3[7] = '8';
board3[8] = '9';
srand(time(NULL));
rn = (rand() %2);
if (rn == 0){
turn = 0; // comp goes first
xo[0] = 'x'; //comp = x
xo[1] = 'o'; //human = o
cout << "\nYou are 'O'" << endl;
}else{
turn = 1; //player goes first
xo[0] = 'o'; //comp = o
xo[1] = 'x'; // human = x
cout << "\nYou are 'X'" << endl;
}
display(); //send this info to display function
}
void TTT::display(){/******you left off revising right here at 2:10******/
cout << "" << endl;
for (int i = 0; i < 9; i++)
{
if ( (i+1) % 3 == 0 )
{
cout << board[i] << endl;
}
else
{
cout << board[i] << " | ";
}
}
cout << "" << endl;
cout << "\t";
for (int i = 0; i < 9; i++)
{
if ( (i+1) % 3 == 0 )
{
cout << board2[i] << endl;
cout << "\t";
}
else
{
cout << board2[i] << " | ";
}
}
cout << "" << endl;
cout << "\t\t";
for (int i = 0; i < 9; i++)
{
if ( (i+1) % 3 == 0 )
{
cout << board3[i] << endl;
cout << "\t\t";
}
else
{
cout << board3[i] << " | ";
}
}
cout << "" << endl;
CPUClass cc;
if (full == 27){ //if board is full
check(won); //check if game has been won or tiedtied
}
else{
if (turn%2 == 0){
player();
}else{
cc.cpu();
}
}
}
void TTT::player(){
int w;
int p;
while (won != 1) //if no one has won
{
cout << "Make your move: Choose a layer [top=1 middle=2 bottom=3]" << endl;
cin>> p;
if (p == 1){
cout << "Make your move: Choose a space" << endl;
cin>>w;
if ((board[w-1] == 'x') || (board[w-1] == 'o')){ //checks if spot is open
cout << "\nSpace occupied, Invalid move\n";
player();
}else{
board[w-1] = xo[1];//draws current players move
turn ++;
full ++;
b1f++;
display(); //go to display
}
}
else if (p == 2){
cout << "Make your move: Choose a space" << endl;
cin>>w;
if ((board2[w-1] == 'x') || (board2[w-1] == 'o')){ //checks if spot is open
cout << "\nSpace occupied, Invalid move\n";
player();
}else{
board2[w-1] = xo[1];
turn ++;
full ++;
b2f++;
display();
}
}
else if (p == 3){
cout << "Make your move: Choose a space" << endl;
cin>>w;
if ((board3[w-1] == 'x') || (board3[w-1] == 'o')){ //checks if spot is open
cout << "\nSpace occupied, Invalid move\n";
player();
}else{
board3[w-1] = xo[1];
turn ++;
full ++;
b3f;
display();
}
}
else{
cout <<"Please select one of the options!\n\n" ;
player();
}
}
}
void TTT::cpu(){
srand(time(NULL)); //seeds with clock
rc = (rand() %9);
int bc;
if (b1f == 9){ //if a board is filled go one of the opthers
bc = 1+(rand() %2);
}
else if (b3f == 9){
bc = (rand() %2);
}
else if (b2f == 9){
bc = (rand() %2);
if (bc == 1){
bc = 2;
}
}
else {
bc = (rand() %3); //randomly pick one if none are full
}
if (bc == 0){
if ((board[rc] == 'x' ) || ( board[rc] == 'o')){
cpu(); //loops and finds a new spot
}else{
turn++;
full ++;
b1f++;
board[rc] = xo[0];
display();
}
}
else if (bc == 1){
if ((board2[rc] == 'x' ) || ( board2[rc] == 'o')){
cpu(); //loops and finds a new spot
}else{
turn++;
full ++;
b1f++;
board[rc] = xo[0];
display();
}
}
else if (bc == 2){
if ((board3[rc] == 'x' ) || ( board3[rc] == 'o')){
cpu(); //loops and finds a new spot
}else{
turn++;
full ++;
b1f++;
board[rc] = xo[0];
display();
}
}
}
void TTT::check(int wo)// check wins
{
//horizontal win
if ((board[0] == 'x') && (board[1] == 'x') && (board[2] == 'x')){
if (rn == 0){
cp++;
}else{
pp++;
}
}
if ((board[6] == 'x') && (board2[4] == 'x') && (board3[2] == 'x')){
if (rn == 0){
cp++;
}else{
pp++;
}
}
wo =1;
cout << "\nGame Over!\n" ;
cout << "\nScore: Player - "<<pp<<" Computer - "<<cp<<"\n" ;
if (pp == cp){ //if points are =
cout << "STALEMATE\n" ;
}
else if (pp > cp){
cout << "YOU WIN\n" ;
}
else if (pp < cp){
cout << "The computer wins\n" ;
}
int c;
cout<<"\nPlay again? [1] for yes anything else to exit\n" ;
cin >> c;
if (c == 1){ //if user enters 1, reset the game
setup();
}
else{
exit(0);
}
}
If you would like to use a member function of a class in another member function you can call the function like so:
It is not clear from your code what purpose the CPUClass serves. What you are currently doing is you are creating a new class that inherits everything from the base class. Then you are overriding the cpu() method of the base class with a new empty method and changing its access to private.
methods in classes are themselves private by default unless you specify otherwise
By default, class access is private. If you want to call
CPUClass::cpu()
function through aCPUClass
object, you need to makecpu()
public: