A1/hands.cpp

117 lines
2.9 KiB
C++
Raw Normal View History

#include "hands.h"
#include <chrono>
#include <iostream>
#include <memory>
#include <random>
2024-09-01 23:31:56 -06:00
#include <cstdlib>
std::unique_ptr<Hand> Hand::fromChar(const char letter) {
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);
}
}
std::unique_ptr<Hand> Hand::generateRandom() {
std::mt19937 mt(
std::chrono::steady_clock::now().time_since_epoch().count());
std::uniform_int_distribution<int> intDist(0, 4);
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:
2024-09-01 23:31:56 -06:00
std::cerr << "An invalid random number was generated, this should "
"be impossible"
<< std::endl;
std::exit(1);
}
}
// 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) {
const std::string otherName = other.getHandName();
2024-09-01 23:31:56 -06:00
if (otherName == "rock")
return GameResult::Tie;
if (otherName == "scissors" || otherName == "lizard")
2024-09-01 23:31:56 -06:00
return GameResult::Win;
else
return GameResult::Loss;
}
std::string Paper::getHandName() const { return "paper"; }
GameResult Paper::compareAgainst(const Hand &other) {
const std::string otherName = other.getHandName();
2024-09-01 23:31:56 -06:00
if (otherName == "paper")
return GameResult::Tie;
if (otherName == "rock" || otherName == "spock")
2024-09-01 23:31:56 -06:00
return GameResult::Win;
else
return GameResult::Loss;
}
std::string Scissors::getHandName() const { return "scissors"; }
GameResult Scissors::compareAgainst(const Hand &other) {
const std::string otherName = other.getHandName();
2024-09-01 23:31:56 -06:00
if (otherName == "scissors")
return GameResult::Tie;
if (otherName == "paper" || otherName == "lizard")
return GameResult::Win;
else
return GameResult::Loss;
}
std::string Lizard::getHandName() const { return "lizard"; }
GameResult Lizard::compareAgainst(const Hand &other) {
const std::string otherName = other.getHandName();
if (otherName == "lizard")
return GameResult::Tie;
if (otherName == "spock" || otherName == "paper")
return GameResult::Win;
else
return GameResult::Loss;
}
std::string Spock::getHandName() const { return "spock"; }
GameResult Spock::compareAgainst(const Hand &other) {
const std::string otherName = other.getHandName();
if (otherName == "spock")
return GameResult::Tie;
if (otherName == "scissors" || otherName == "rock")
2024-09-01 23:31:56 -06:00
return GameResult::Win;
else
return GameResult::Loss;
}