#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class failure
{public:
virtual void view()=0;
virtual void Repair()=0;
virtual bool Check()=0;
virtual string GetStatus()=0;
};
class EngineFailed:public failure
{private:
string status;
public:
virtual bool Check(){return status.compare("Engine is OK!")==0;}
virtual string GetStatus(){return status;}
virtual void Repair(){if (rand()%3) status="Engine is OK!";};
virtual void view(){cout<<status<<endl;}
EngineFailed()
{if (rand()%2) status="Engine is OK!";
else status="Engine failed";
};
};
class LockFailed:public failure
{private:
string status;
public:
virtual bool Check(){return status.compare("Lock is OK!")==0;}
virtual string GetStatus(){return status;}
virtual void Repair()
{if (rand()%3)
status="Lock is OK!";
};
virtual void view(){cout<<status<<endl;}
LockFailed()
{if (rand()%2) status="Lock is OK!";
else status="Lock failed";
};
};
class WeaponFailed:public failure
{private:
string status;
public:
virtual bool Check(){return status.compare("Weapon is OK!")==0;}
virtual string GetStatus(){return status;}
virtual void Repair(){if (rand()%3) status="Weapon is OK!";};
virtual void view(){cout<<status<<endl;}
WeaponFailed()
{if (rand()%2) status="Weapon is OK!";
else status="Weapon failed";
};
};
class Weapon
{private:
int Power;
// static
public:
WeaponFailed W;
failure *f;
void SetPower(int P){Power=P%10;}
void Fire()
{if (f->Check())
{if(Power%5>rand()%10)
cout<<"++ No one survive"<<endl;
else
if(Power%7>rand()%10)
cout<<"+ Destroyed!!!"<<endl;
else
cout<<"- Keep alive..."<<endl;
}
else {cout<<"Weapon is broken"<<endl;}
}
Weapon(){
f = new WeaponFailed;
f=&W;
Power=rand()%10;
f->view();
}
~Weapon(){delete f;}
};
class Engine
{private:
int Number;
int Power;
bool started;
public:
EngineFailed E;
failure *f;
void SetNumber(int N){Number=N;}
void SetPower(int P){Power=P;}
Engine(){started=false;
f=new EngineFailed;
f=&E;
Power=rand()%10;
f->view();
}
void Start(){
if (f->Check()){started=true; cout<<"Engine starting"<<endl;}
else {started=false;
cout<<"Engine is broken"<<endl;}
};
void Stop(){ if(started) {started=false; cout<<"Engine stopped"<<endl;}
else cout<<"Engine doesn't started, cannot stop it"<<endl;}
~Engine(){delete f;}
};
class Lock
{private:
int Number;
bool opened;
public:
LockFailed L;
failure *f;
void SetNumber(int N){Number=N;}
Lock(){
f=new LockFailed;
f=&L;
Number=0;
opened=false;
f->view();}
void Open(){
if (f->Check()) {opened=true; cout<<"Lock openning"<<endl;}
else {opened=false; cout<<"Lock is broken"<<endl;}
};
void Close(){
if (opened) {opened=false; cout<<"Lock closed"<<endl;}
else {cout<<"Lock doesn't open"<<endl;}
};
~Lock(){delete f;}
};
class space_ship
{public:
Engine e[4];
Weapon w[3];
Lock l[2];
space_ship();
};
space_ship::space_ship()
{for(int i=0;i<4;i++)
{e[i].SetNumber(i); e[i].SetPower(rand()%10);}
for(int i=0;i<3;i++)
{w[i].SetPower(rand()%10);}
for(int i=0;i<4;i++)
{l[i].SetNumber(i);}
}
int main()
{space_ship SHIP;
int i=1,j,k;
while (i!=0)
{cout<<"1-select engines"<<"\n"<<"2-select weapon"<<"\n"<<"3-select locks"<<"\n"<<"0- exit"<<"\n"<<"type your choise"<<endl;
cin>>i;
switch (i)
{case 1:
cout<<"select engine's number"<<endl;
cin>>j;
cout<<"1- engine's status"<<"\n"<<"2- start engine"<<"\n"<<"3- stop engine"<<"\n"<<"4- repair engine"<<"\n"<<"0- return"<<endl;
cin>>k;
switch (k)
{case 1:SHIP.e[j].f->view();break;
case 2:SHIP.e[j].Start();break;
case 3:SHIP.e[j].Stop();break;
case 4:SHIP.e[j].f->Repair();break;
default: break;
}
break;
case 2:
cout<<"select weapon's number"<<endl;
cin>>j;
cout<<"1- weapon's status"<<"\n"<<"2- fire"<<"\n"<<"3- repair engine"<<"\n"<<"0- return"<<endl;
cin>>k;
switch (k)
{case 1:SHIP.w[j].f->view();break;
case 2:SHIP.w[j].Fire();break;
case 3:SHIP.w[j].f->Repair();break;
default: break;
}
break;
case 3:
cout<<"select lock's number"<<endl;
cin>>j;
cout<<"1- lock's status"<<"\n"<<"2- open lock"<<"\n"<<"3- close lock"<<"\n"<<"4- repair lock"<<"\n"<<"0- return"<<endl;
cin>>k;
switch (k)
{case 1:SHIP.l[j].f->view();break;
case 2:SHIP.l[j].Open();break;
case 3:SHIP.l[j].Close();break;
case 4:SHIP.l[j].f->Repair();break;
}
break;
}
}
return 0;
};