In: Computer Science
C++ question. Need all cpp and header files.
Part 1 - Polymorphism
problem 3-1
You are going to build a C++ program which runs a single game of Rock, Paper, Scissors. Two players (a human player and a computer player) will compete and individually choose Rock, Paper, or Scissors. They will then simultaneously declare their choices and the winner is determined by comparing the players’ choices. Rock beats Scissors. Scissors beats Paper. Paper beats Rock.
The learning objectives of this task is to help develop your understanding of abstract classes, inheritance, and polymorphism.
Your task is to produce a set of classes that will allow a human player to type instructions from the keyboard and interact with a computer player.
Your submission needs to contain the following files, along with their header files:
Part 1: Abstract
Classes
Define and implement an abstract class named
Player that has the following behaviours:
void move();
string getMoves();
char getMove(); //returns the most recent move made
bool win(Player * opponent); //compares players’ moves to see who
wins
Declare the move() and getMoves() functions as pure virtual and set proper access modifiers for the attributes and methods.
If no one wins, the game should output “draw! go again”, and the game continues until a winner is determined.
Part 2: Polymorphism
Computer Class:
Define and implement a class named Computer that inherits from Player. By default, Computer will use Rock for every turn. If it is constructed with another value (Paper or Scissors), it will instead make that move every turn.
The Computer class has the following constructor and behaviours:
Computer(string letter); //set what move the computer will
//make (rock, paper, or scissors)
//if the input is not r, R, p, P, s, S or
//a string starting with one of these letters,
//set the move to the default ‘r’
string getMoves(); //returns all moves stored in a string
void move(); //increments number of moves made
To explain, if the computer was constructed with Computer(‘s’), and it made 3 moves, getMoves() should return:
sss
For advice about testing, please use the debugging manual (Links to
an external site.).
Person Class:
Define and implement a class named Person that inherits from Player. The Person can choose Rock, Paper, or Scissors based on the user’s input.
The Player class has the following behaviours:
void move(); //allow user to type in a single character to
//represent their move. If a move is impossible,
//“Move unavailable” is outputted and the user is
//asked to input a character again.
//Otherwise, their input is stored
string getMoves(); //returns all moves stored in a string
Write a main function that uses Computer and Person to play Rock, Paper, Scissors. The Computer can be made with either constructors, but should set the default move to ‘r’. The player should be asked to input a move which is then compared against the computer’s move to determine who wins.
All the Player’s previous moves should be outputted, followed by all the Computer’s moves outputted on a new line.
cloud plz check the code below
#include <iostream>
#include <string>
using namespace std;
enum choices { ROCK, SPOCK, PAPER, LIZARD, SCISSORS, MX_C
};
enum indexes { PLAYER, COMPUTER, DRAW
};
class stats
{
public:
stats() : _draw( 0 )
{
ZeroMemory( _moves, sizeof( _moves ) );
ZeroMemory( _win, sizeof( _win ) );
}
void draw()
{ _draw++;
}
void win( int p )
{
_win[p]++;
}
void move( int p, int m ) { _moves[p][m]++;
}
int getMove( int p, int m ) { return _moves[p][m];
}
string format( int a )
{
char t[32];
wsprintf( t, "%.3d", a );
string d( t );
return d;
}
void print()
{
string d = format( _draw ),
pw = format( _win[PLAYER] ), cw = format( _win[COMPUTER] ),
pr = format( _moves[PLAYER][ROCK] ), cr=format( _moves[COMPUTER][ROCK] ),
pp = format( _moves[PLAYER][PAPER] ), cp=format( _moves[COMPUTER][PAPER] ),
ps=format( _moves[PLAYER][SCISSORS] ),cs=format( _moves[COMPUTER][SCISSORS] ),
pl = format( _moves[PLAYER][LIZARD] ), cl=format( _moves[COMPUTER][LIZARD] ),
pk = format( _moves[PLAYER][SPOCK] ),ck=format( _moves[COMPUTER][SPOCK] );
system( "cls" );
cout << endl;
cout << "+----------+-------+--------+--------+---------+----------+--------+---------+" << endl;
cout << "| | WON | DRAW | ROCK | PAPER | SCISSORS | LIZARD | SPOCK |"<< endl;
cout << "+----------+" << endl;
cout << "| PLAYER | " << pw << " | | " << pr << " | " << pp << " | " << ps << " | " << pl << " | " << pk << " |" << endl;
cout << "+----------+-------+ " << d << " +--------+---------+----------+--------+---------+" << endl;
cout << "| COMPUTER | " << cw << " | | " << cr << " | " << cp << " | " << cs << " | " << cl << " | " << ck << " |" << endl;
cout << "+------+" << endl;
cout << endl << endl;
system( "pause" );
}
private:
int _moves[2][MX_C], _win[2], _draw;
};
class rps
{
private:
int makeMove()
{
int total = 0, r, s;
for( int i = 0; i < MX_C; total += statistics.getMove( PLAYER, i++ ) );
r = rand() % total;
for( int i = ROCK; i < SCISSORS; i++ )
{
s = statistics.getMove( PLAYER, i );
if( r < s ) return ( i + 1 );
r -= s;
}
return ROCK;
}
void printMove( int p, int m )
{
if( p == COMPUTER ) cout << "My move: ";
else cout << "Your move: ";
switch( m )
{
case ROCK: cout << "ROCK\n"; break;
case PAPER: cout << "PAPER\n"; break;
case SCISSORS: cout << "SCISSORS\n"; break;
case LIZARD: cout << "LIZARD\n"; break;
case SPOCK: cout << "SPOCK\n";
}
}
public:
rps()
{
checker[ROCK][ROCK] = 2;
checker[ROCK][PAPER] = 1;
checker[ROCK][SCISSORS] = 0;
checker[ROCK][LIZARD] = 0;
checker[ROCK][SPOCK] = 1;
checker[PAPER][ROCK] = 0;
checker[PAPER][PAPER] = 2;
checker[PAPER][SCISSORS] = 1;
checker[PAPER][LIZARD] = 1;
checker[PAPER][SPOCK] = 0;
checker[SCISSORS][ROCK] = 1;
checker[SCISSORS][PAPER] = 0;
checker[SCISSORS][SCISSORS] = 2;
checker[SCISSORS][LIZARD] = 0;
checker[SCISSORS][SPOCK] = 1;
checker[LIZARD][ROCK] = 1;
checker[LIZARD][PAPER] = 0;
checker[LIZARD][SCISSORS] = 1;
checker[LIZARD][LIZARD] = 2;
checker[LIZARD][SPOCK] = 0;
checker[SPOCK][ROCK] = 0;
checker[SPOCK][PAPER] = 1;
checker[SPOCK][SCISSORS] = 0;
checker[SPOCK][LIZARD] = 1;
checker[SPOCK][SPOCK] = 2;
}
void play()
{
int p, r, m;
while( true )
{
cout << "What is your move (1)ROCK (2)SPOCK (3)PAPER (4)LIZARD (5)SCISSORS (0)Quit ? ";
cin >> p;
if( !p || p < 0 ) break;
if( p > 0 && p < 6 )
{
p--;
cout << endl;
printMove( PLAYER, p );
statistics.move( PLAYER, p );
m = makeMove();
statistics.move( COMPUTER, m );
printMove( COMPUTER, m );
r = checker[p][m];
switch( r )
{
case DRAW:
cout << endl << "DRAW!" << endl << endl;
statistics.draw();
break;
case COMPUTER:
cout << endl << "I WIN!" << endl << endl;
statistics.win( COMPUTER );
break;
case PLAYER:
cout << endl << "YOU WIN!" << endl << endl;
statistics.win( PLAYER );
}
system( "pause" );
}
system( "cls" );
}
statistics.print();
}
private:
stats statistics;
int checker[MX_C][MX_C];
};
int main( int argc, char* argv[] )
{
srand( GetTickCount() );
rps game;
game.play();
return 0;
}
#include <iostream>
#include <string>
using namespace std;
enum choices { ROCK, SPOCK, PAPER, LIZARD, SCISSORS, MX_C
};
enum indexes { PLAYER, COMPUTER, DRAW
};
class stats
{
public:
stats() : _draw( 0 )
{
ZeroMemory( _moves, sizeof( _moves ) );
ZeroMemory( _win, sizeof( _win ) );
}
void draw()
{ _draw++;
}
void win( int p )
{
_win[p]++;
}
void move( int p, int m ) { _moves[p][m]++;
}
int getMove( int p, int m ) { return _moves[p][m];
}
string format( int a )
{
char t[32];
wsprintf( t, "%.3d", a );
string d( t );
return d;
}
void print()
{
string d = format( _draw ),
pw = format( _win[PLAYER] ),
cw = format( _win[COMPUTER] ),
pr = format(
_moves[PLAYER][ROCK] ), cr=format( _moves[COMPUTER][ROCK] ),
pp = format( _moves[PLAYER][PAPER] ), cp=format(
_moves[COMPUTER][PAPER] ),
ps=format( _moves[PLAYER][SCISSORS] ),cs=format(
_moves[COMPUTER][SCISSORS] ),
pl = format( _moves[PLAYER][LIZARD] ), cl=format(
_moves[COMPUTER][LIZARD] ),
pk = format( _moves[PLAYER][SPOCK] ),ck=format(
_moves[COMPUTER][SPOCK] );
system( "cls" );
cout << endl;
cout <<
"+----------+-------+--------+--------+---------+----------+--------+---------+"
<< endl;
cout << "| | WON | DRAW | ROCK | PAPER | SCISSORS | LIZARD |
SPOCK |"<< endl;
cout << "+----------+" << endl;
cout << "| PLAYER | " << pw << " | |
" << pr << " | " << pp << " | " << ps
<< " | " << pl << " | " << pk << " |"
<< endl;
cout << "+----------+-------+ " << d
<< " +--------+---------+----------+--------+---------+"
<< endl;
cout << "| COMPUTER | " << cw << " |
| " << cr << " | " << cp << " | " <<
cs << " | " << cl << " | " << ck << "
|" << endl;
cout << "+------+" << endl;
cout << endl << endl;
system( "pause" );
}
private:
int _moves[2][MX_C], _win[2], _draw;
};
class rps
{
private:
int makeMove()
{
int total = 0, r, s;
for( int i = 0; i < MX_C; total +=
statistics.getMove( PLAYER, i++ ) );
r = rand() % total;
for( int i = ROCK; i < SCISSORS; i++ )
{
s = statistics.getMove( PLAYER, i );
if( r < s ) return ( i + 1 );
r -= s;
}
return ROCK;
}
void printMove( int p, int m )
{
if( p == COMPUTER ) cout << "My move: ";
else cout << "Your move: ";
switch( m )
{
case ROCK: cout << "ROCK\n"; break;
case PAPER: cout << "PAPER\n"; break;
case SCISSORS: cout << "SCISSORS\n";
break;
case LIZARD: cout << "LIZARD\n"; break;
case SPOCK: cout << "SPOCK\n";
}
}
public:
rps()
{
checker[ROCK][ROCK] = 2;
checker[ROCK][PAPER] = 1;
checker[ROCK][SCISSORS] = 0;
checker[ROCK][LIZARD] = 0;
checker[ROCK][SPOCK] = 1;
checker[PAPER][ROCK] = 0;
checker[PAPER][PAPER] = 2;
checker[PAPER][SCISSORS] = 1;
checker[PAPER][LIZARD] = 1;
checker[PAPER][SPOCK] = 0;
checker[SCISSORS][ROCK] = 1;
checker[SCISSORS][PAPER] = 0;
checker[SCISSORS][SCISSORS] = 2;
checker[SCISSORS][LIZARD] = 0;
checker[SCISSORS][SPOCK] = 1;
checker[LIZARD][ROCK] = 1;
checker[LIZARD][PAPER] = 0;
checker[LIZARD][SCISSORS] = 1;
checker[LIZARD][LIZARD] = 2;
checker[LIZARD][SPOCK] = 0;
checker[SPOCK][ROCK] = 0;
checker[SPOCK][PAPER] = 1;
checker[SPOCK][SCISSORS] = 0;
checker[SPOCK][LIZARD] = 1;
checker[SPOCK][SPOCK] = 2;
}
void play()
{
int p, r, m;
while( true )
{
cout << "What is your move (1)ROCK (2)SPOCK
(3)PAPER (4)LIZARD (5)SCISSORS (0)Quit ? ";
cin >> p;
if( !p || p < 0 ) break;
if( p > 0 && p < 6 )
{
p--;
cout << endl;
printMove( PLAYER, p );
statistics.move( PLAYER, p );
m = makeMove();
statistics.move( COMPUTER, m
);
printMove( COMPUTER, m );
r = checker[p][m];
switch( r )
{
case DRAW:
cout << endl << "DRAW!"
<< endl << endl;
statistics.draw();
break;
case COMPUTER:
cout <<
endl << "I WIN!" << endl << endl;
statistics.win(
COMPUTER );
break;
case PLAYER:
cout <<
endl << "YOU WIN!" << endl << endl;
statistics.win(
PLAYER );
}
system( "pause" );
}
system( "cls" );
}
statistics.print();
}
private:
stats statistics;
int checker[MX_C][MX_C];
};
int main( int argc, char* argv[] )
{
srand( GetTickCount() );
rps game;
game.play();
return 0;
}
plz understand the above if you queries let me know i will help you
in that