From b68542a9ffa71c51a7481df8fa12e7fc41c7ab77 Mon Sep 17 00:00:00 2001 From: Stoycho Kyosev <68247567+stoychoX@users.noreply.github.com> Date: Wed, 6 Apr 2022 16:36:40 +0300 Subject: Add files via upload --- pract KN/week7/solution/Source.cpp | 10 +++ pract KN/week7/solution/betType.h | 14 ++++ pract KN/week7/solution/game.cpp | 154 +++++++++++++++++++++++++++++++++++++ pract KN/week7/solution/game.h | 25 ++++++ pract KN/week7/solution/player.cpp | 142 ++++++++++++++++++++++++++++++++++ pract KN/week7/solution/player.h | 54 +++++++++++++ 6 files changed, 399 insertions(+) create mode 100644 pract KN/week7/solution/Source.cpp create mode 100644 pract KN/week7/solution/betType.h create mode 100644 pract KN/week7/solution/game.cpp create mode 100644 pract KN/week7/solution/game.h create mode 100644 pract KN/week7/solution/player.cpp create mode 100644 pract KN/week7/solution/player.h (limited to 'pract KN') diff --git a/pract KN/week7/solution/Source.cpp b/pract KN/week7/solution/Source.cpp new file mode 100644 index 0000000..d28893f --- /dev/null +++ b/pract KN/week7/solution/Source.cpp @@ -0,0 +1,10 @@ +#include +#include"player.h" +#include"game.h" + +int main() { + /*player p("Ivan", "1111", 19, 100); + + game g; + g.play(p);*/ +} \ No newline at end of file diff --git a/pract KN/week7/solution/betType.h b/pract KN/week7/solution/betType.h new file mode 100644 index 0000000..e540d6d --- /dev/null +++ b/pract KN/week7/solution/betType.h @@ -0,0 +1,14 @@ +#ifndef BET_TYPE_HEADER +#define BET_TYPE_HEADER + +enum class betType { + isEven, + isNotEven, + isPrime, + isPowerOfTwo, + isBiggerThan, + isSmallerThan, + isTheSameAs +}; + +#endif // !BET_TYPE_HEADER diff --git a/pract KN/week7/solution/game.cpp b/pract KN/week7/solution/game.cpp new file mode 100644 index 0000000..7adc45c --- /dev/null +++ b/pract KN/week7/solution/game.cpp @@ -0,0 +1,154 @@ +#include "game.h" +#include +#include +#include + +void game::generateNumber() { + srand(time(NULL)); + + number = rand() % 100 + 1; +} + +void game::validateBet(double& bet, double currentMoney) const { + std::cout << "How much money would you like to bet? " << std::endl + << "Your money now: " << currentMoney << std::endl; + + bool fail = false; + + do { + if (fail) + std::cout << "Invalid input" << std::endl; + + std::cin >> bet; + + fail = true; + + // Проверява дали сме въвели текстов низ вместо число + // и поправя потока. + if (!(bool)(std::cin)) { + std::cin.clear(); + std::cin.ignore(255, '\n'); + } + + } while (bet > currentMoney || bet < 0); +} + +void game::validateNumber(int& num) const { + std::cout << "Enter your number: "; + + bool fail = false; + + do { + if (fail) + std::cout << "Try again" << std::endl; + + std::cin >> num; + + if (!(bool)(std::cin)) { + std::cin.clear(); + std::cin.ignore(255, '\n'); + } + + fail = true; + + } while (num < 20 || num > 60); +} + +double game::getRate(betType currentBet) const { + double rate = 0; + int myNumber = 0; + + switch (currentBet) { + case betType::isEven: + rate = !(number % 2) ? 0.2 : -1; + break; + case betType::isNotEven: + rate = !(number % 2) ? -1 : 0.2; + break; + case betType::isPrime: + rate = isPrime(number) ? 0.5 : -1; + break; + case betType::isPowerOfTwo: + rate = isPowerOfTwo(number) ? 1 : -1; + break; + case betType::isBiggerThan: + validateNumber(myNumber); + rate = (myNumber > number) ? 0.25 : -1; + break; + case betType::isSmallerThan: + validateNumber(myNumber); + rate = (myNumber < number) ? 0.25 : -1; + break; + case betType::isTheSameAs: + validateNumber(myNumber); + rate = (myNumber == number) ? 10 : -1; + break; + } + + return rate; +} + +void game::play(player& p) { + if (p.getAge() < 18) { + std::cout << "You are too young" << std::endl; + return; + } + + char buff[20]; + std::cout << "Enter your password, " << p.getName() << ": "; + std::cin.getline(buff, 20, '\n'); + + if (!p.comparePassword(buff)) { + std::cout << "Wrong password. Goodbye."; + return; + } + + while (!p.isBroke()) { + double myBet = 0; + + betType currentBet = p.makeBet(); + + generateNumber(); + + validateBet(myBet, p.getMoney()); + + p.updateMoney(myBet, getRate(currentBet)); + + std::cout << "The number was: " << number << std::endl; + } + + std::cout << "You lost all your money!" << std::endl; +} + +// Bonus -> Newton's method for finding square root +// https://math.mit.edu/~stevenj/18.335/newton-sqrt.pdf +// Formula: a_n = 0.5 * (a_{n-1} + number / a_{n-1}) +double newtonSquareRoot(double num, int l = 100) { + double result = 1; + double temp = 1; + + for (int i = 0; i < l; i++) { + temp = 0.5 * (result + num / result); + + if (temp == result && result != 1) + return result; + + result = temp; + } + + return result; +} + +bool isPrime(int num) { + // int border = sqrt(num); is perfectly fine! + int border = newtonSquareRoot(num); + + for (int i = 2; i <= border; i++) + if (num % i == 0) + return false; + return true; +} + +bool isPowerOfTwo(int num) { + return num != 0 && ((num & (num - 1)) == 0); +} \ No newline at end of file diff --git a/pract KN/week7/solution/game.h b/pract KN/week7/solution/game.h new file mode 100644 index 0000000..a2a4ed0 --- /dev/null +++ b/pract KN/week7/solution/game.h @@ -0,0 +1,25 @@ +#ifndef GAME_HEADER +#define GAME_HEADER + +#include"player.h" + +double newtonSquareRoot(double, int); +bool isPrime(int number); +bool isPowerOfTwo(int number); + +class game { +private: + size_t number; + + void generateNumber(); + + void validateBet(double& bet, double cMoney) const; + void validateNumber(int& number) const; + + double getRate(betType currentBet) const; +public: + void play(player& p); +}; + + +#endif diff --git a/pract KN/week7/solution/player.cpp b/pract KN/week7/solution/player.cpp new file mode 100644 index 0000000..4d56462 --- /dev/null +++ b/pract KN/week7/solution/player.cpp @@ -0,0 +1,142 @@ +#include "player.h" +#include + +void player::free() { + delete[] name; + delete[] password; +} + +void player::copy(const player& other) { + name = copyDynamic(other.name); + password = copyDynamic(other.password); + + money = other.money; + age = other.age; +} +void player::showHelp() const { + std::cout << + "0 for even" << std::endl << + "1 for not even" << std::endl << + "2 for prime" << std::endl << + "3 for power of two" << std::endl << + "4 for is less than " << std::endl << + "5 for is bigger than" << std::endl << + "6 for is equals" << std::endl; +} + +char* player::copyDynamic(const char* arg) const { + char* toReturn = new char[strlen(arg) + 1]; + strcpy(toReturn, arg); + return toReturn; +} + +player::player(const char* name, const char* pass, int age, double money) { + this->name = copyDynamic(name); + password = copyDynamic(pass); + + setAge(age); + this->money = money; +} + +player::player(const player& other) { + copy(other); +} + +player& player::operator=(const player& other) { + if (this != &other) { + free(); + copy(other); + } + return *this; +} + +void player::setName(const char* newName) { + delete[] name; + name = copyDynamic(newName); +} + +void player::setAge(int newAge) { + if (newAge <= 0 || newAge >= 100) { + age = 0; + return; + } + age = newAge; +} + +const char* player::getName() const { + return name; +} + +void player::changePassword(const char* newPass, const char* oldPass) { + if (comparePassword(oldPass)) { + delete[] password; + password = copyDynamic(newPass); + } +} + +void player::updateMoney(double bet, double rate) { + money += bet * rate; +} + +int player::getAge() const { + return age; +} + +double player::getMoney() const { + return money; +} + +bool player::isBroke() const { + return money <= 0; +} + +bool player::comparePassword(const char* pwd) const { + return pwd != nullptr && (strcmp(password, pwd) == 0); +} + +betType player::makeBet() const { + std::cout << name << ", what is your bet? Press h for help and m to view money.\n"; + + while (true) { + std::cout << ">"; + char ch; + + std::cin >> ch; + + switch (ch) { + case 'h': + showHelp(); + break; + case 'm': + std::cout << "Money: " << money << std::endl; + break; + case '0': + return betType::isEven; + break; + case '1': + return betType::isNotEven; + break; + case '2': + return betType::isPrime; + break; + case '3': + return betType::isPowerOfTwo; + break; + case '4': + return betType::isSmallerThan; + break; + case '5': + return betType::isBiggerThan; + break; + case '6': + return betType::isTheSameAs; + break; + default: + break; + } + } +} + +player::~player() { + free(); +} diff --git a/pract KN/week7/solution/player.h b/pract KN/week7/solution/player.h new file mode 100644 index 0000000..134e0d6 --- /dev/null +++ b/pract KN/week7/solution/player.h @@ -0,0 +1,54 @@ +#ifndef PLAYER_HEADER +#define PLAYER_HEADER +#include"betType.h" + +#pragma warning(disable : 4996) + +class player { +private: + char* name; + char* password; + int age; + double money; + + void free(); + + void copy(const player& other); + + void showHelp() const; + + char* copyDynamic(const char* arg) const; + +public: + player() : name(nullptr), password(nullptr), age(0), money(0) {} + + player(const char* name,const char* pass, int age, double money); + + player(const player& other); + + player& operator=(const player& other); + + void setName(const char* newName); + + void setAge(int newAge); + + const char* getName() const; + + void changePassword(const char* newPass, const char* oldPass); + + void updateMoney(double bet, double rate); + + int getAge() const; + + double getMoney() const; + + bool isBroke() const; + + bool comparePassword(const char* pwd) const; + + betType makeBet() const; + + ~player(); +}; + +#endif -- cgit v1.3.1-23-gd82d