fork(2) download
  1. #include <iostream>
  2. #include <ostream>
  3. #include <random>
  4. #include <vector>
  5.  
  6. namespace
  7. {
  8. std::random_device rd;
  9. std::mt19937 gen(rd());
  10. std::uniform_int_distribution<> attack_dist(20, 50);
  11. }
  12.  
  13. class LifeForm
  14. {
  15. protected:
  16. int level;
  17. int exp;
  18. int req_EXP;
  19. int max_health;
  20. int health;
  21.  
  22. LifeForm(int level, int exp, int req_EXP, int max_health)
  23. : level(level)
  24. , exp(exp)
  25. , req_EXP(req_EXP)
  26. , max_health(max_health)
  27. , health(max_health)
  28. {}
  29.  
  30. void level_up()
  31. {
  32. level++;
  33. exp = 0;
  34. req_EXP += level * 100;
  35. max_health += 50 * level;
  36. health = max_health;
  37. }
  38.  
  39. public:
  40. bool health_depleted() const { return health <= 0; }
  41.  
  42. void attack(LifeForm& attacked_lifeform)
  43. {
  44. attacked_lifeform.health -= level * attack_dist(gen);
  45. }
  46.  
  47. void add_EXP(LifeForm const& life_form)
  48. {
  49. exp += life_form.level * 50;
  50.  
  51. if (exp >= req_EXP)
  52. {
  53. level_up();
  54. }
  55. }
  56.  
  57. friend std::ostream& operator<<(std::ostream& out, LifeForm const& lifeform)
  58. {
  59. out << "Level: " << lifeform.level;
  60. out << "\nHP : (" << lifeform.health << '/' << lifeform.max_health << ')';
  61. out << "\nEXP : (" << lifeform.exp << '/' << lifeform.req_EXP << ')';
  62. return out;
  63. }
  64. };
  65.  
  66. class Player : public LifeForm
  67. {
  68. public:
  69. Player() : LifeForm(1, 0, 100, 200) {}
  70. };
  71.  
  72. class Monster : public LifeForm
  73. {
  74. public:
  75. Monster() : LifeForm(1, 50, 0, 100) {}
  76. };
  77.  
  78. class Game
  79. {
  80. private:
  81. Player player;
  82. std::vector<Monster> monsters;
  83.  
  84. void battle();
  85. Monster current_monster() { return monsters.back(); }
  86. bool all_monsters_dead() const { return monsters.empty(); }
  87.  
  88. public:
  89. Game();
  90. void play();
  91. };
  92.  
  93. Game::Game() : monsters(50) {}
  94.  
  95. void Game::play()
  96. {
  97. std::cout << "Number of monsters: " << monsters.size() << "\n\n";
  98.  
  99. while (!player.health_depleted() && !monsters.empty())
  100. {
  101. std::cout << "\nPlayer\n" << player;
  102. battle();
  103.  
  104. if (all_monsters_dead())
  105. {
  106. std::cout << "\n\n> All monsters killed!!!";
  107. }
  108.  
  109. if (player.health_depleted())
  110. {
  111. std::cout << "> Player dead...\n\n";
  112. }
  113. }
  114. }
  115.  
  116. void Game::battle()
  117. {
  118. std::cout << "\n\n> Player attacks!\n";
  119. player.attack(monsters.back());
  120.  
  121. if (current_monster().health_depleted())
  122. {
  123. std::cout << "> Monster killed!\n";
  124. player.add_EXP(current_monster());
  125. monsters.pop_back();
  126. }
  127.  
  128. std::cout << "\nMonster " << monsters.size() << "\n" << current_monster();
  129. std::cout << "\n\n> Monster attacks!\n";
  130. current_monster().attack(player);
  131. }
  132.  
  133. int main()
  134. {
  135. Game game;
  136. game.play();
  137. }
Success #stdin #stdout 0s 3436KB
stdin
Standard input is empty
stdout
Number of monsters: 50


Player
Level: 1
HP   : (200/200)
EXP  : (0/100)

> Player attacks!

Monster 50
Level: 1
HP   : (59/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 1
HP   : (166/200)
EXP  : (0/100)

> Player attacks!

Monster 50
Level: 1
HP   : (19/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 1
HP   : (144/200)
EXP  : (0/100)

> Player attacks!
> Monster killed!

Monster 49
Level: 1
HP   : (100/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 1
HP   : (118/200)
EXP  : (50/100)

> Player attacks!

Monster 49
Level: 1
HP   : (76/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 1
HP   : (75/200)
EXP  : (50/100)

> Player attacks!

Monster 49
Level: 1
HP   : (50/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 1
HP   : (52/200)
EXP  : (50/100)

> Player attacks!
> Monster killed!

Monster 48
Level: 1
HP   : (100/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (267/300)
EXP  : (0/300)

> Player attacks!

Monster 48
Level: 1
HP   : (50/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (239/300)
EXP  : (0/300)

> Player attacks!
> Monster killed!

Monster 47
Level: 1
HP   : (100/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (208/300)
EXP  : (50/300)

> Player attacks!

Monster 47
Level: 1
HP   : (38/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (160/300)
EXP  : (50/300)

> Player attacks!
> Monster killed!

Monster 46
Level: 1
HP   : (100/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (120/300)
EXP  : (100/300)

> Player attacks!

Monster 46
Level: 1
HP   : (16/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (92/300)
EXP  : (100/300)

> Player attacks!
> Monster killed!

Monster 45
Level: 1
HP   : (100/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (69/300)
EXP  : (150/300)

> Player attacks!

Monster 45
Level: 1
HP   : (10/100)
EXP  : (50/0)

> Monster attacks!

Player
Level: 2
HP   : (23/300)
EXP  : (150/300)

> Player attacks!
> Monster killed!

Monster 44
Level: 1
HP   : (100/100)
EXP  : (50/0)

> Monster attacks!
> Player dead...