我正在做我的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
答案 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;
};