hdu1107武林采用小型项目式解决方案

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;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值