2014-03-25 30 views
1

使用类继承制作3D Tic Tac Toe游戏。编译器错误如下。错误说班级定义为公开是私人的

行:

43 [错误] '无效CPUClass :: CPU()' 是私人

190 [错误]在这一范围内

寻找在我的代码,我已经明确定义CPU()为公共。任何想法,我俯瞰?

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

       } 
    } 
+1

注意函数'CPUClass :: cpu()'*隐藏*函数'TTT :: cpu()'。这两个功能是完全无关的。 – aschepler

回答

2

默认情况下,类访问是私人的。如果你想通过CPUClass对象调用CPUClass::cpu()功能,您需要cpu()市民:除非你指定,否则

class CPUClass : public TTT{ 
public: 

    void cpu(); 

    }; 
0

方法的类本身就是私人默认在另一个成员函数中使用类的成员函数,您可以调用如下函数:

TTT::cpu(); //replace for any calls to cc.cpu(); 

不清楚f rom你的代码CPUClass服务的目的是什么。你现在正在做的是你正在创建一个继承基类的所有东西的新类。然后你用一个新的空方法重写基类的cpu()方法并将其访问权限改为private。

+0

我明白了。这确实消除了我的错误,但它创建了一个新的: 未定义的引用'CPUClass :: cpu()' [错误] Id返回1退出状态 – user3461666

+0

您尚未给出CPUClass中的cpu()只有一个声明。 – user3288829

0

如果您想

class CPUClass : public TTT{ 
public:   //<<----- make below functions public 
     void cpu(); 
};