136 lines
4.3 KiB
C++
136 lines
4.3 KiB
C++
|
/*
|
||
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||
|
* Click nbfs://nbhost/SystemFileSystem/Templates/cppFiles/file.cc to edit this template
|
||
|
*/
|
||
|
|
||
|
#include <iostream>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
int computerWins = 0; //update it every time the computer wins
|
||
|
int playerWins = 0; ////update it every time the human wins
|
||
|
|
||
|
/**The computer returns * R/r rock, P/p paper, Ss scissors.
|
||
|
* The static var keeps track of how many times this methods was called;
|
||
|
* @return R, P S
|
||
|
*/
|
||
|
char computerPlay() {
|
||
|
static int numberOfTimesPlayed = 0;
|
||
|
numberOfTimesPlayed++;
|
||
|
|
||
|
switch (rand() % 3) {
|
||
|
case 0:
|
||
|
return 'r';
|
||
|
break;
|
||
|
case 1:
|
||
|
return 'p';
|
||
|
break;
|
||
|
case 2:
|
||
|
return 's';
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**The human( user) is prompted to type * R/r rock, P/p paper, Ss scissors.
|
||
|
* or Q/q to stop playing the game.
|
||
|
* @return R, P, S, Q
|
||
|
*/
|
||
|
char humanPlay() {
|
||
|
bool validInput = false;
|
||
|
char userInput;
|
||
|
do {
|
||
|
printf("Let's play Rock Paper Scissors!\n");
|
||
|
printf("Please enter r for rock, p for paper, s for scissors (case insensitive): ");
|
||
|
cin >> userInput;
|
||
|
userInput = std::tolower(userInput, std::locale());
|
||
|
printf("Player entered: %c\n", userInput);
|
||
|
if (userInput == 'r' | userInput == 'p' | userInput == 's') {
|
||
|
validInput = true;
|
||
|
} else {
|
||
|
validInput = false;
|
||
|
printf("Invalid input. Please enter r, p, or s (case insensitive): ");
|
||
|
}
|
||
|
} while (!validInput);
|
||
|
return userInput;
|
||
|
}
|
||
|
|
||
|
/**Displays wins and losses for human and computer.
|
||
|
*
|
||
|
*/
|
||
|
void displayStats() {
|
||
|
printf("CPU: %i\n", computerWins);
|
||
|
printf("Player: %i\n", playerWins);
|
||
|
}
|
||
|
|
||
|
std::string rps(char input) {
|
||
|
std::string output;
|
||
|
switch (input) {
|
||
|
case 'r':
|
||
|
output = "rock";
|
||
|
break;
|
||
|
case 'p':
|
||
|
output = "paper";
|
||
|
break;
|
||
|
case 's':
|
||
|
output = "scissors";
|
||
|
break;
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
std::string determineWinner(char cpu, char player) {
|
||
|
std::string output;
|
||
|
if ((cpu == 'r' && player == 'r') | (cpu == 'p' && player == 'p') | (cpu == 's' && player == 's')) { // ties
|
||
|
std::string beginningString = "You both chose ";
|
||
|
std::string endingString = ". It is a tie.";
|
||
|
std::string result = rps(cpu);
|
||
|
computerWins++;
|
||
|
playerWins++;
|
||
|
return beginningString.append(result).append(endingString);
|
||
|
}
|
||
|
if ((cpu == 'r' && player == 's') | (cpu == 'p' && player == 'r') | (cpu == 's' && player == 'p')) { // CPU Wins
|
||
|
std::string beginningString = "You chose";
|
||
|
std::string middle = "The computer chose";
|
||
|
std::string endingString = "The computer wins.";
|
||
|
std::string cpuResult = " " + rps(cpu) + ". ";
|
||
|
std::string playerResult = " " + rps(player) + ". ";
|
||
|
computerWins++;
|
||
|
return beginningString.append(playerResult).append(middle).append(cpuResult).append(endingString);
|
||
|
}
|
||
|
if ((player == 'r' && cpu == 's') | (player == 'p' && cpu == 'r') | (player == 's' && cpu == 'p')) { // Player Wins
|
||
|
std::string beginningString = "You chose ";
|
||
|
std::string middle = "The computer chose";
|
||
|
std::string endingString = "You win!";
|
||
|
std::string cpuResult = " " + rps(cpu) + ". ";
|
||
|
std::string playerResult = " " + rps(player) + ". ";
|
||
|
playerWins++;
|
||
|
return beginningString.append(playerResult).append(middle).append(cpuResult).append(endingString);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void gameLoop() {
|
||
|
char userInput;
|
||
|
bool continueLoop = true;
|
||
|
bool playGame = true;
|
||
|
do {
|
||
|
if (playGame) {
|
||
|
printf("%s\n", determineWinner(computerPlay(), humanPlay()).c_str());
|
||
|
displayStats();
|
||
|
}
|
||
|
printf("Play again? Y/N (case insensitive):");
|
||
|
cin >> userInput;
|
||
|
userInput = std::tolower(userInput, std::locale());
|
||
|
if (!(userInput == 'y' | userInput == 'n')) {
|
||
|
printf("invalid input! please enter Y/N...\n");
|
||
|
playGame = false;
|
||
|
}
|
||
|
if (userInput == 'y') {
|
||
|
playGame = true;
|
||
|
continueLoop = true;
|
||
|
}
|
||
|
if (userInput == 'n') {
|
||
|
playGame = false;
|
||
|
continueLoop = false;
|
||
|
}
|
||
|
} while (continueLoop);
|
||
|
}
|