설계 모드 작업 1

4412 단어 디자인 모드
1. 보물 상자 게임 의 기본 적 인 묘 사 는 게임 에 다양한 유형의 인물 (Role) 이 있 는데 예 를 들 어 전사 (Solider), 마법사 (Mage) 등 주인공 의 유형 은 그 중의 한 가지 만 선택 할 수 있 고 게임 에서 변경 되 지 않 습 니 다.게임 에는 다양한 액수 의 돈 이 담 긴 보물 상자, 독물 이 담 긴 보물 상자 등 다양한 보물 상자 (Box) 도 있다.어떤 유형의 주인공 이 돈 이 담 긴 보물 상 자 를 열 면 보물 상자 의 돈 은 주인공 에 게 증가 하고 보물 상자 의 돈 수 는 0 이 된다.워 리 어가 독 극 물이 담 긴 보물 상 자 를 열 면 워 리 어의 생명 치 (HP) 는 10% 감소 하지만, 금전 (Money) 은 20% 증가한다.마법사 가 독 극 물이 담 긴 보물 상 자 를 열 면 마법사 의 생명 치 (HP) 는 30% 감소 하지만, 금전 (Money) 은 40% 증가한다.상기 설명 에 따라 해당 하 는 디자인 을 제시 하고 완전 하 게 실현 하 며 디자인 이 좋 은 확장 성 을 가 져 야 합 니 다. 예 를 들 어 새로운 캐릭터 유형 과 상자 종 류 를 추가 할 때 기 존의 디자인 과 실현 을 수정 할 필요 가 없습니다.
2. 적당 한 디자인 과 해당 하 는 코드 를 제시 합 니 다. 꺼 낼 수 없 는 상자 에 만 넣 을 수 있 고 최대 8 개의 과일 을 넣 을 수 있 으 며 하루 에 넣 을 수 있 는 것 은 아니다.과일 은 사과 와 귤 두 가지 일 뿐 상자 앞 에 넣 은 원 초적 인 무 게 는 각각 50 과 30 으로 상자 에 넣 은 후 수분 을 잃 어 버 려 무게 가 줄 어 들 었 고 사과 와 귤 은 매일 각각 4 와 3 을 줄 여 각자 의 원 초적 인 무게 의 3 / 5 에 이 르 렀 을 때 까지 무 게 를 줄 이지 않 았 다.상자 의 기능 은 다음 과 같다. 상자 에 있 는 사과 의 수 출력 하기;상자 에 있 는 귤 의 수 출력 하기;하루 동안 상자 에 들 어 있 는 과일 이 줄 어 든 총 무 게 를 출력 합 니 다.현재 과일의 총 무 게 를 수출 하 다.
 
1.
class Box;
class Role {
public:
    Role(int theMoney,int theHP):money(theMoney),hp(theHP) { }
    virtual ~Role( ) {}
    int GetMoney( ) const { return money;}
    void SetMoney(int m) { money = m; }
    void Open (Box& aBox) { aBox.BeOpened(*this); }
    virtual void PoisonHurt( ) = 0;
protected:
    int money;
    int hp;
};
class Solider:public Role {
public:
    Solider(int theMoney,int theHP):Role(theMoney,theHP) { }
    virtual void PoisonHurt( ) {
       hp *=0.9;
       money *=1.2;
    }
};
class Mage:public Role {
public:
    Mage (int theMoney,int theHP):Role(theMoney,theHP) { }
    virtual void PoisonHurt( ) {
       hp *=0.7;
       money *=1.4;
    }
};
class Box {
public:
   virtual ~Box( ) {}
   virtual void BeOpened(Role& role) = 0;
};
class MoneyBox:public Box {
public:
   MoneyBox(int m):boxMoney(m) { }
   virtual void BeOpened(Role& role) {
      role.SetMoney(role.GetMoney( ) + boxMoney );
      boxMoney = 0;
   }
protected:
   int boxMoney; 
};
class PoisonBox:public Box {
public:
    virtual void BeOpened(Role& role) { role. PoisonHurt ( ); }
};


 
2.
class Fruit
{
public:
    Fruit(int mMax =0,int mMin=0,int mLose = 0,int mW = 0)
        :mMaxWeight(mMax),mMinWeight(mMin),mLoseWeight(mLose),mWeigth(mW) {}
    virtual ~Fruit() {}

    virtual Fruit * Clone( ) const = 0;
    virtual int ReduceWeight( );
    virtual int  Weight( ) const;
protected:
    int   mMaxWeight;
    int   mMinWeight;
    int   mLoseWeight;
    int   mWeight;
};

int Fruit::ReduceWeight( )
{
        int newWeight = mWeight - mLoseWeight;
        if (newWeight < mMinWeight )
            newWeight = mMinWeight;
        int reduce =  mWeight - newWeight;
        mWeight = newWeight;
        return reduce;
}

int  Fruit::Weight( ) const
{
  return  mWeight;
}

class Apple:public Fruit
{
public:
    Apple():Fruit(50,50*3/5,4,50) { }
    virtual ~Apple( ) {}
    virtual Apple * Clone() const
        { return new Apple(*this); }

    // other
};

class Orange:public Fruit
{
public:
    Orange():Fruit(30,30*3/5,3,30) { }
    virtual ~Orange( ) {}
    virtual Orange * Clone() const
        { return new Orange(*this); }

    // other
};

class Box
{
public:
    Box():count(0) {for(int i=0;i<8;i++) fruit[i]=0;}
    ~Box() {for(int i=0;i<8;i++) delete fruit[i];}
    void AddFruit(Fruit& one)     //      
    {

        if (count<8) 
          fruit[count++]=one.Clone();
    }

    int  ApplesNum() const
    {
        int num=0;
        for(int i=0;i<8;i++) {
            Apple * p=dynamic_cast(fruit[i]);
            if (p)
                ++num;
        }
        return num;
    }
    int  OrangesNum() const
    {
        int num=0;
        for(int i=0;i<8;i++) {
            Orange * p=dynamic_cast(fruit[i]);
            if(p)    
              ++num;
        }
        return num;
    }
    int  PassOneDay()  //         
    {
        int num=0;
        for(int i=0;i<8;i++)
            if(fruit[i])
                num+=fruit[i]->ReduceWeight();
        return num;
    }
    int  TotalWeight() const
    {
        int num=0;
        for(int i=0;i<8;i++)
            if(fruit[i])
                num+=fruit[i]->Weight();
        return num;
    }
    void Show() const
    {
        cout<

좋은 웹페이지 즐겨찾기