2024-09-01 23:26:25 -06:00
|
|
|
#include "hands.h"
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <memory>
|
|
|
|
#include <random>
|
2024-09-01 23:31:56 -06:00
|
|
|
|
2024-09-01 23:26:25 -06:00
|
|
|
#include <cstdlib>
|
|
|
|
|
|
|
|
std::unique_ptr<Hand> Hand::fromChar(const char letter) {
|
2024-09-19 22:06:16 -06:00
|
|
|
switch (letter) {
|
|
|
|
case 'R':
|
|
|
|
case 'r':
|
|
|
|
return std::make_unique<Rock>();
|
|
|
|
case 'P':
|
|
|
|
case 'p':
|
|
|
|
return std::make_unique<Paper>();
|
|
|
|
case 'S':
|
|
|
|
case 's':
|
|
|
|
return std::make_unique<Scissors>();
|
|
|
|
case 'L':
|
|
|
|
case 'l':
|
|
|
|
return std::make_unique<Lizard>();
|
|
|
|
case 'O':
|
|
|
|
case 'o':
|
|
|
|
return std::make_unique<Spock>();
|
|
|
|
default:
|
|
|
|
std::cout << "Invalid choice" << std::endl;
|
|
|
|
std::exit(1);
|
|
|
|
}
|
2024-09-01 23:26:25 -06:00
|
|
|
}
|
|
|
|
|
2024-09-19 22:06:16 -06:00
|
|
|
std::unique_ptr<Hand>
|
|
|
|
Hand::generateRandom(std::mt19937 &mt,
|
|
|
|
std::uniform_int_distribution<int> &intDist) {
|
|
|
|
switch (intDist(mt)) {
|
|
|
|
case 0:
|
|
|
|
return std::make_unique<Rock>();
|
|
|
|
case 1:
|
|
|
|
return std::make_unique<Paper>();
|
|
|
|
case 2:
|
|
|
|
return std::make_unique<Scissors>();
|
|
|
|
case 3:
|
|
|
|
return std::make_unique<Lizard>();
|
|
|
|
case 4:
|
|
|
|
return std::make_unique<Spock>();
|
|
|
|
default:
|
|
|
|
std::cerr << "An invalid random number was generated, this should "
|
|
|
|
"be impossible"
|
|
|
|
<< std::endl;
|
|
|
|
std::exit(1);
|
|
|
|
}
|
2024-09-01 23:26:25 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// List of function implementations for all of the different types of Hand
|
|
|
|
|
|
|
|
std::string Rock::getHandName() const { return "rock"; }
|
|
|
|
GameResult Rock::compareAgainst(const Hand &other) {
|
2024-09-19 22:06:16 -06:00
|
|
|
const std::string otherName = other.getHandName();
|
|
|
|
|
|
|
|
if (otherName == "rock") {
|
|
|
|
return GameResult::Tie;
|
|
|
|
}
|
|
|
|
if (otherName == "scissors" || otherName == "lizard") {
|
|
|
|
return GameResult::Win;
|
|
|
|
} else {
|
|
|
|
return GameResult::Loss;
|
|
|
|
}
|
2024-09-01 23:26:25 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Paper::getHandName() const { return "paper"; }
|
|
|
|
GameResult Paper::compareAgainst(const Hand &other) {
|
2024-09-19 22:06:16 -06:00
|
|
|
const std::string otherName = other.getHandName();
|
|
|
|
|
|
|
|
if (otherName == "paper") {
|
|
|
|
return GameResult::Tie;
|
|
|
|
}
|
|
|
|
if (otherName == "rock" || otherName == "spock") {
|
|
|
|
return GameResult::Win;
|
|
|
|
} else {
|
|
|
|
return GameResult::Loss;
|
|
|
|
}
|
2024-09-01 23:26:25 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Scissors::getHandName() const { return "scissors"; }
|
|
|
|
GameResult Scissors::compareAgainst(const Hand &other) {
|
2024-09-19 22:06:16 -06:00
|
|
|
const std::string otherName = other.getHandName();
|
|
|
|
|
|
|
|
if (otherName == "scissors") {
|
|
|
|
return GameResult::Tie;
|
|
|
|
}
|
|
|
|
if (otherName == "paper" || otherName == "lizard") {
|
|
|
|
return GameResult::Win;
|
|
|
|
} else {
|
|
|
|
return GameResult::Loss;
|
|
|
|
}
|
2024-09-04 01:01:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Lizard::getHandName() const { return "lizard"; }
|
|
|
|
GameResult Lizard::compareAgainst(const Hand &other) {
|
2024-09-19 22:06:16 -06:00
|
|
|
const std::string otherName = other.getHandName();
|
|
|
|
|
|
|
|
if (otherName == "lizard") {
|
|
|
|
return GameResult::Tie;
|
|
|
|
}
|
|
|
|
if (otherName == "spock" || otherName == "paper") {
|
|
|
|
return GameResult::Win;
|
|
|
|
} else {
|
|
|
|
return GameResult::Loss;
|
|
|
|
}
|
2024-09-04 01:01:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Spock::getHandName() const { return "spock"; }
|
|
|
|
GameResult Spock::compareAgainst(const Hand &other) {
|
2024-09-19 22:06:16 -06:00
|
|
|
const std::string otherName = other.getHandName();
|
|
|
|
|
|
|
|
if (otherName == "spock") {
|
|
|
|
return GameResult::Tie;
|
|
|
|
}
|
|
|
|
if (otherName == "scissors" || otherName == "rock") {
|
|
|
|
return GameResult::Win;
|
|
|
|
} else {
|
|
|
|
return GameResult::Loss;
|
|
|
|
}
|
2024-09-01 23:26:25 -06:00
|
|
|
}
|