diff options
Add files via upload
6 files changed, 400 insertions, 0 deletions
| -rw-r--r-- | pract KN/week7/solution/Source.cpp | 10 | ||||
| -rw-r--r-- | pract KN/week7/solution/betType.h | 14 | ||||
| -rw-r--r-- | pract KN/week7/solution/game.cpp | 155 | ||||
| -rw-r--r-- | pract KN/week7/solution/game.h | 25 | ||||
| -rw-r--r-- | pract KN/week7/solution/player.cpp | 144 | ||||
| -rw-r--r-- | pract KN/week7/solution/player.h | 52 |
diff --git a/pract KN/week7/solution/Source.cpp b/pract KN/week7/solution/Source.cpp new file mode 100644 index 0000000..4540240 --- /dev/null +++ b/pract KN/week7/solution/Source.cpp @@ -0,0 +1,10 @@ +#include<iostream>
+#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..18833f4 --- /dev/null +++ b/pract KN/week7/solution/game.cpp @@ -0,0 +1,155 @@ +#include "game.h"
+#include<iostream>
+#include<time.h>
+#include<cmath>
+#include<windows.h>
+
+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:
+// https://math.mit.edu/~stevenj/18.335/newton-sqrt.pdf
+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 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..c898b6a --- /dev/null +++ b/pract KN/week7/solution/player.cpp @@ -0,0 +1,144 @@ +#include "player.h"
+#include<iostream>
+
+void player::free() {
+ delete[] name;
+ delete[] password;
+}
+
+void player::copy(const player& other) {
+ name = new char[strlen(other.name) + 1];
+ strcpy(name, other.name);
+
+ password = new char[strlen(other.password) + 1];
+ strcpy(password, 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;
+}
+
+player::player(const char* newName, const char* newPass, int age, double money) {
+ name = new char[strlen(newName) + 1];
+ strcpy(name, newName);
+
+ password = new char[strlen(newPass) + 1];
+ strcpy(password, newPass);
+
+ 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 = new char[strlen(newName) + 1];
+ strcpy(name, 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 = new char[strlen(newPass) + 1];
+ strcpy(password, 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..4c197df --- /dev/null +++ b/pract KN/week7/solution/player.h @@ -0,0 +1,52 @@ +#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;
+
+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
|
