#include #include #include using namespace std; class Ship { public: Ship(int crew, double sail_area) : crew{crew}, sail_area{sail_area} {} virtual ~Ship() = default; virtual void take_damage(int shots) = 0; virtual int broadside() const { return 0; } virtual void print(ostream& os) const = 0; protected: int crew; double sail_area; }; class Frigate : public Ship { public: Frigate(int crew, double sail_area, int cannons) : Ship{crew, sail_area}, cannons{cannons} {} void take_damage(int shots) override { shots -= shots / 5; if ( shots <= 0 ) return; crew -= 1; shots -= 1; sail_area -= shots/2 * sail_area * 5/100.0; shots -= shots/2; if ( shots >= cannons ) cannons = 0; else cannons -= shots; } int broadside() const override { return cannons/2; } void print(ostream& os) const override { os << "Frigate with " << crew << " crew, " << sail_area << " sq m sails and " << cannons << " cannons." << endl; } private: int cannons; }; class Transport : public Ship { public: Transport(int crew, double sail_area, double capacity, int passengers) : Ship{crew, sail_area}, capacity{capacity}, passengers{passengers} {} void take_damage(int shots) override { shots -= shots / 5; passengers -= shots/2; shots -= shots/2; capacity -= shots/2 * capacity * 5/100.0; shots -= shots/2; sail_area -= shots * sail_area * 10/100.0; } void print(ostream& os) const override { os << "Transport with " << crew << " crew, " << sail_area << " sq m sails, " << capacity << " ton cargo and " << passengers << " passengers." << endl; } private: double capacity; int passengers; }; int main() { cout << setprecision(1) << fixed; // välj datatyp och anpassa push_back vector armada; Frigate enemy{70, 1600, 20}; // crew, sail area, cannons armada.push_back(new Transport{15, 1964.0, 80.0, 65}); // crew, sail area, capacity, passengers armada.push_back(new Transport{30, 2514.0, 101.0, 50}); armada.push_back(new Frigate{100, 3000.0, 10}); armada.push_back(new Frigate{100, 3000.0, 10}); armada.push_back(new Frigate{100, 3000.0, 10}); armada.push_back(new Frigate{100, 3000.0, 10}); while ( enemy.broadside() > 0 ) { // for every ship in the vector for ( auto && ship : armada ) { enemy.take_damage(ship->broadside()); ship->take_damage(enemy.broadside()); ship->print(cout); } enemy.print(cout); } return 0; }