#1 Petr
Noo tohle se neda napsat na pár řádků.. prostě jak už ted máš, tak každá věc by měla mít svůj objekt (třídu) a tohle celý by mělo běžet v nějakým objektu "Game" a v herní smyčce řeši tyhle rozhodování (gameLoop bude uvnitř třídy).
zkusilt jsem narychlo udělat ukázku jak by to mohlo vypadat, bylo by třeba tam dodat nějaky stavy, vylepšit logiku rozhodovaní a náhodných událostí, ale to už nechám na tobě.. ;)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <time.h>
#include <stdlib.h>
using namespace std;
enum PlayerRace
{
HUMAN,
UNDEAD
};
class Player
{
public:
Player() {}
Player(string name) : name(name) {}
void setName(string name) { this->name = name; }
string Name() const { return name; }
void setRace(PlayerRace race) { this->race = race; }
PlayerRace Race() const { return race; }
void addMoney(int money) { this->money += money; }
void removeMoney(int money) { this->money -= money; }
void setMoney(int money) { this->money = money; }
int Money() const { return money; }
private:
string name;
PlayerRace race;
int money;
};
class Treasure
{
public:
Treasure() {}
Treasure(int money) : money(money) {}
int Money() const { return money; }
private:
int money;
};
class GameUtil
{
public:
static bool selectYes()
{
const char yes[] = { 'a', 'A', 'y', 'Y', '1' };
string input;
getline(cin, input);
char c = (input.size() > 0) ? input.at(0) : '\0';
for (int i = 0; i < strlen(yes); i++) { if (*(yes + i) == c) return true; }
return false;
}
static void pressAnyKey()
{
string input;
cout << "Stiskni klavesu pro pokracovani...";
getline(cin, input);
}
static int randomNumber(int min, int max)
{
return min + (rand() % (int) (max - min + 1));
}
static string getRaceName(PlayerRace race)
{
switch (race) {
case HUMAN: return "Clovek";
case UNDEAD: return "Nemrtvy";
}
}
};
class Game
{
public:
Game(string gameName) : gameName(gameName) {}
void newGame(string playerName, PlayerRace race, int startMoney)
{
player.setName(playerName);
player.setRace(race);
player.setMoney(startMoney);
running = true;
gameLoop();
}
private:
string gameName;
Player player;
bool running;
void gameLoop()
{
cout << "Vitej ve hre: " << gameName << endl;
cout << "Tva postava:\n Jmeno: " << player.Name() << "\n Rasa: " << GameUtil::getRaceName(player.Race()) << "\n Zlato: " << player.Money() << "\n\n";
while (running) {
int rand = GameUtil::randomNumber(0, 100);
if (rand > 60) {
findTreasure();
} else if (rand > 40) {
// neco...
} else if (rand > 20) {
findRoadCross();
} else if (rand > 5) {
findThieves();
} else {
cout << "Jdes po ceste\n";
}
if (player.Money() == 0) {
running = false;
} else {
this_thread::sleep_for(chrono::milliseconds(200));
}
}
exit();
}
void findTreasure()
{
Treasure t(GameUtil::randomNumber(20, 200));
cout << "Nasli jste poklad, chcete ho otevrit?\n";
if (GameUtil::selectYes()) {
player.addMoney(t.Money());
cout << "Nasli jste " << t.Money() << " zlata! Nyni mate u sebe " << player.Money() << " zlata!\n";
} else {
cout << "Tvoje smula.. v truhle bylo " << t.Money() << " zlata!\n";
}
GameUtil::pressAnyKey();
}
void findRoadCross()
{
cout << "Nasli jste rozcesti, kudy se chcete vydat?\n[CHYBI IMPLEMENTACE]\n";
// doplnit...
GameUtil::pressAnyKey();
}
void findThieves()
{
int steal = GameUtil::randomNumber(0, player.Money());
player.removeMoney(steal);
cout << "Narazil jsi na zlodeje a ukradli ti " << steal << " zlata :( Nyni mate u sebe " << player.Money() << " zlata!\n";
GameUtil::pressAnyKey();
}
void exit()
{
cout << "Jste uplne na mizine! Chcete zacit novou hru?";
if (GameUtil::selectYes()) {
newGame(player.Name(), player.Race(), 1000);
} else {
cout << "Dekuji za zahrani hry...";
GameUtil::pressAnyKey();
}
}
};
int main()
{
srand(time(NULL));
Game game("My Game");
game.newGame("Ingiraxo", HUMAN, 1000);
return EXIT_SUCCESS;
}