使用虚函数在C ++中制作猜谜游戏

时间:2017-04-28 03:39:23

标签: c++

我正在做我的c ++课程的最后一项功课,我很困惑。

说明:

下面列出了玩猜谜游戏的代码,其中两个玩家试图猜测一个数字。您的任务是使用代表人类玩家或计算机播放器的对象扩展程序。

播放功能将两个Player对象作为输入。使用名为getGuess()的虚函数定义Player类。 Player :: getGuess()的实现可以简单地返回0.接下来,定义一个名为HumanPlayer的类,该类派生自Player。 HumanPlayer :: getGuess()的实现应该提示用户输入一个数字并返回从键盘输入的值。接下来,定义一个名为ComputerPlayer的类,该类派生自Player。 ComputerPlayer :: getGuess()的实现应该随机选择一个从0到100的数字。最后,构造一个主函数调用play(Player& player1,Player& player2)和两个HumanPlayer实例(人类与人类) ),HumanPlayer和ComputerPlayer(人与计算机)的实例,以及ComputerPlayer的两个实例(计算机与计算机)。

#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>

using namespace std;

class Player {
   public:
      virtual int getGuess();
      int guess;
};

class ComputerPlayer : public Player {
   public:
      ComputerPlayer() : Player(){}
      int getGuess() {
         return rand() % 100 + 1;
      }
};

class HumanPlayer : public Player {
   public:
      HumanPlayer() : Player() {}
      int getGuess() {
         cout << "Please enter your guess: ";
         cin >> guess;
         return guess;
      }
};


bool checkForWin(int guess, int answer)
{
  if (answer == guess)
  {
     cout << "You're right! You win!" << endl;
     return true;
  }
  else if (answer < guess)
     cout << "Your guess is too high." << endl;
  else
     cout << "Your guess is too low." << endl;
  return false;
}

void play(Player &player1, Player &player2)
{
  int answer = 0, guess = 0;
  answer = rand() % 100;
  bool win = false;

  while (!win)
  {
   cout << "Player 1's turn to guess." << endl;
   guess = player1.getGuess();
   win = checkForWin(guess, answer);
   if (win) return;

   cout << "Player 2's turn to guess." << endl;
   guess = player2.getGuess();
   win = checkForWin(guess, answer);
  }
}

int main()
{
    srand(1);
    HumanPlayer humanPlayer1, humanPlayer2;
    ComputerPlayer computerPlayer1, computerPlayer2;

    cout << "Human vs Human\n";
    cout << "Press a key to continue...";
    char c;
    cin >> c;
    play(humanPlayer1, humanPlayer2);

    cout << "Human vs Computer\n";
    cout << "Press a key to continue...";
    cin >> c;
    play(humanPlayer1, computerPlayer1);

    cout << "Computer vs Computer\n";
    cout << "Press a key to continue...";
    cin >> c;
    play(computerPlayer1, computerPlayer2);

    return 0;
}

我一直收到以下编译错误:

/tmp/cctJstdH.o: In function `Player::Player()':
main.cpp:(.text._ZN6PlayerC2Ev[_ZN6PlayerC5Ev]+0x9): undefined reference to `vtable for Player'
/tmp/cctJstdH.o:(.rodata._ZTI11HumanPlayer[_ZTI11HumanPlayer]+0x10): undefined reference to `typeinfo for Player'
/tmp/cctJstdH.o:(.rodata._ZTI14ComputerPlayer[_ZTI14ComputerPlayer]+0x10): undefined reference to `typeinfo for Player'
collect2: error: ld returned 1 exit status

2 个答案:

答案 0 :(得分:1)

没有Player::getGuess()虚拟方法的实现。通过添加= 0

添加实现或将类声明为纯虚拟
class Player
{
    // ...
    virtual int getGuess() = 0;
};

答案 1 :(得分:0)

仔细阅读说明书。

“Player :: getGuess()的实现只能返回0。”

您的class Player根本没有实现Player::getGuess()

这应该解决它:

class Player {
   public:
      virtual int getGuess() { return 0; } // implement this function
      int guess;
};