Link:http://acm.hdu.edu.cn/showproblem.php?pid=1107
分析得到以下类图:
Person.h (基类)
#ifndef CPERSON_H_INCLUDED
#define CPERSON_H_INCLUDED
class Person
{
public:
void Set(char _v,int _x,int _y,int _MP,int _DP,int _HP);//设置门派等数据
void SetF(int i); //设置战斗状态
bool GetF();
int GetX();
int GetY();
int GetHP();
void SetHP(int K);
protected:
char v; //门派
int x,y; //坐标
int MP,DP,HP; //内力,体力,武力
int dir; //方向
bool IsF; //战斗状态
};
#endif // CPERSON_H_INCLUDED
EMei.h (派生)
#ifndef EMEI_H_INCLUDED
#define EMEI_H_INCLUDED
#include"Cperson.h"
class EMei:public Person
{
public:
void Init(int x,int y);
void Move(); //移动
int GetDPS(); //获取攻击力
};
#endif // EMEI_H_INCLUDED
ShaoLin.h (派生)
#ifndef SHAOLIN_H_INCLUDED
#define SHAOLIN_H_INCLUDED
#include"Cperson.h"
class ShaoLin:public Person
{
public:
void Init(int x);
void Move(); //移动
int GetDPS(); //获得攻击力
};
#endif // SHAOLIN_H_INCLUDED
WuDang.h (派生)
#ifndef WUDANG_H_INCLUDED
#define WUDANG_H_INCLUDED
#include"Cperson.h"
class WuDang:public Person
{
public:
void Init(int y);
void Move(); //移动
int GetDPS(); //获取攻击力
};
#endif // WUDANG_H_INCLUDED
main()
#include<iostream>
#include"Cperson.h"
#include"EMei.h"
#include"ShaoLin.h"
#include"WuDang.h"
using namespace std;
int n,pace,NumOfEM,NumOfWD,NumOfSL,x,y,HP,DP,MP;
char v;
int map[15][15],a[10]; //地图
ShaoLin S[1000];
EMei E[1000];
WuDang W[1000];
void Fight();
void Move();
void ShowRest();
int main()
{
cin>>n;
while(n--)
{
NumOfEM=NumOfSL=NumOfWD=0;
for(int i=0;i<13;i++) //地图初始化
for(int j=0;j<13;j++)
map[i][j]=0;
cin>>pace;
while(1)
{
cin>>v;
if(v=='0') break;
cin>>x>>y>>MP>>DP>>HP;
switch(v)
{
case 'S': S[NumOfSL].Set(v,x,y,MP,DP,HP);S[NumOfSL++].Init(x,y);break;
case 'E': E[NumOfEM].Set(v,x,y,MP,DP,HP);E[NumOfEM++].Init(x,y);break;
case 'W': W[NumOfWD].Set(v,x,y,MP,DP,HP);W[NumOfWD++].Init(x,y);break;
}
map[x][y]++;
}
Fight();
ShowRest();
}
return 0;
}
void Move()
{
for(int i=0;i<NumOfEM;i++)
{
E[i].SetF(0);
map[E[i].GetX()][E[i].GetY()]--;
E[i].Move();
map[E[i].GetX()][E[i].GetY()]++;
}
for(int i=0;i<NumOfSL;i++)
{
S[i].SetF(0);
map[S[i].GetX()][S[i].GetY()]--;
S[i].Move();
map[S[i].GetX()][S[i].GetY()]++;
}
for(int i=0;i<NumOfWD;i++)
{
W[i].SetF(0);
map[W[i].GetX()][W[i].GetY()]--;
W[i].Move();
map[W[i].GetX()][W[i].GetY()]++;
}
}
void Fight()
{
int DPS1,DPS2;
while(pace--)
{
for(int i=0;i<NumOfEM;i++)
{
if( map[E[i].GetX()][E[i].GetY()]==2 && !E[i].GetF() && E[i].GetHP()>0 )
{
for(int j=0;j<NumOfSL;j++)
if( !S[j].GetF() && S[j].GetHP()>0 && E[i].GetX()==S[j].GetX() && E[i].GetY()==S[j].GetY() )
{
DPS1=E[i].GetDPS();
DPS2=S[j].GetDPS();
E[i].SetHP(DPS2);
S[j].SetHP(DPS1);
E[i].SetF(1);
S[j].SetF(1);
}
for(int j=0;j<NumOfWD;j++)
if( !W[j].GetF() && W[j].GetHP()>0 && E[i].GetX()==W[j].GetX() && E[i].GetY()==W[j].GetY() )
{
DPS1=E[i].GetDPS();
DPS2=W[j].GetDPS();
E[i].SetHP(DPS2);
W[j].SetHP(DPS1);
E[i].SetF(1);
W[j].SetF(1);
}
}
}
for(int i=0;i<NumOfWD;i++)
{
if( map[W[i].GetX()][W[i].GetY()]==2 && !W[i].GetF() && W[i].GetHP()>0 )
{
for(int j=0;j<NumOfSL;j++)
if( !S[j].GetF() && S[j].GetHP()>0 && W[i].GetX()==S[j].GetX() && W[i].GetY()==S[j].GetY() )
{
DPS1=W[i].GetDPS();
DPS2=S[j].GetDPS();
W[i].SetHP(DPS2);
S[j].SetHP(DPS1);
W[i].SetF(1);
S[j].SetF(1);
}
for(int j=0;j<NumOfEM;j++)
if( !E[j].GetF() && E[j].GetHP()>0 && W[i].GetX()==E[j].GetX() && W[i].GetY()==E[j].GetY() )
{
DPS1=W[i].GetDPS();
DPS2=E[j].GetDPS();
W[i].SetHP(DPS2);
E[j].SetHP(DPS1);
W[i].SetF(1);
E[j].SetF(1);
}
}
}
for(int i=0;i<NumOfSL;i++)
{
if( map[S[i].GetX()][S[i].GetY()]==2 && !S[i].GetF() && S[i].GetHP()>0 )
{
for(int j=0;j<NumOfEM;j++)
if( !E[j].GetF() && E[j].GetHP()>0 && S[i].GetX()==E[j].GetX() && S[i].GetY()==E[j].GetY() )
{
DPS1=S[i].GetDPS();
DPS2=E[j].GetDPS();
S[i].SetHP(DPS2);
E[j].SetHP(DPS1);
S[i].SetF(1);
E[j].SetF(1);
}
for(int j=0;j<NumOfWD;j++)
if( !W[j].GetF() && W[j].GetHP()>0 && S[i].GetX()==W[j].GetX() && S[i].GetY()==W[j].GetY() )
{
DPS1=S[i].GetDPS();
DPS2=W[j].GetDPS();
S[i].SetHP(DPS2);
W[j].SetHP(DPS1);
S[i].SetF(1);
W[j].SetF(1);
}
}
}
Move();
}
}
void ShowRest()
{
int NumS,NumE,NumW,HPS,HPE,HPW;
NumS=NumE=NumW=HPS=HPE=HPW=0;
for(int i=0;i<NumOfEM;i++)
if(E[i].GetHP()>0)
{
NumE++;
HPE+=E[i].GetHP();
}
for(int i=0;i<NumOfWD;i++)
if(W[i].GetHP()>0)
{
NumW++;
HPW+=W[i].GetHP();
}
for(int i=0;i<NumOfSL;i++)
if(S[i].GetHP()>0)
{
NumS++;
HPS+=S[i].GetHP();
}
cout<<NumS<<" "<<HPS<<endl; //少林
cout<<NumW<<" "<<HPW<<endl; //武当
cout<<NumE<<" "<<HPE<<endl; //峨眉
cout<<"***"<<endl;
}
EMei.cpp
#include"EMei.h"
void EMei::Move()
{
if( (x==12 && y==1) || (x==1 && y==12) )
return ;
if( dir==0 && x<12 && y<12)
{
x++;
y++;
}
else if(dir==1 && x>1 && y>1)
{
x--;
y--;
}
else if( x==12 || y==12)
{
dir=1;
x--;
y--;
}
else if(x==1 || y==1)
{
x++;
y++;
dir=0;
}
}
int EMei::GetDPS()
{
return (0.2 * MP + 0.8 * DP) * (HP + 10) / 100;
}
void EMei::Init(int x,int y)
{
if(x==12 || y==12)
dir=1;
else
dir=0;
IsF=false;
}
Person.cpp
#include"Cperson.h"
void Person::Set(char _v,int _x,int _y,int _MP,int _DP,int _HP)
{
v=_v;
x=_x;
y=_y;
MP=_MP;
DP=_DP;
HP=_HP;
}
bool Person::GetF()
{
return IsF;
}
void Person::SetF(int i)
{
if(i==1)
IsF=true;
else
IsF=false;
}
int Person::GetX()
{
return x;
}
int Person::GetY()
{
return y;
}
int Person::GetHP()
{
return HP;
}
void Person::SetHP(int K)
{
HP-=K;
}
ShaoLin.cpp
#include"ShaoLin.h"
void ShaoLin::Move()
{
if(dir==0 && x<12)
x++;
else if(dir==1 && x>1)
x--;
else if(x==1)
{
dir=0;
x++;
}
else if(x==12)
{
x--;
dir=1;
}
}
int ShaoLin::GetDPS()
{
return (0.5 * MP + 0.5 * DP) * (HP + 10) / 100;
}
void ShaoLin::Init(int x)
{
if(x==12)
dir=1;
else
dir=0;
IsF=false;
}
WuDang.cpp
#include"WuDang.h"
void WuDang::Move()
{
if(dir==0 && y<12)
y++;
else if(dir==1 && y>1)
y--;
else if(y==12)
{
dir=1;
y--;
}
else if(y==1)
{
dir=0;
y++;
}
}
int WuDang::GetDPS()
{
return (0.8 * MP + 0.2 * DP) * (HP + 10) / 100;
}
void WuDang::Init(int y)
{
if(y==12)
dir=1;
else
dir=0;
IsF=false;
}