抽象クラスでジャンケンの判定

C++/CLI で抽象クラスを使った、ジャンケンの勝ち負けを調べるクラスです。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. ジャンケンの勝ち負けを調べるクラスを抽象クラスを使って作成してみましょう。
    抽象クラスの説明は 純粋仮想関数と抽象クラス を参照して下さい。
  2. クラスの元になる Hand 抽象クラスです。
    Hand Object Class は4個の純粋仮想関数を持っています。
    Check() は、ジャンケンの勝ち負けを相手に問い合わせる関数です。
    GuNiKachi() は、自分のクラス(グー, チョキ, パー)が、グーに勝てるかどうかを調べる関数です。
    ChokiNiKachi() は、自分のクラス(グー, チョキ, パー)が、チョキに勝てるかどうかを調べる関数です。
    PaNiKachi() は、自分のクラス(グー, チョキ, パー)が、パーに勝てるかどうかを調べる関数です。
    //純粋仮想関数を持っている抽象クラス
    class  Hand
    {
      public:
        virtual void  Check(Hand *) = 0;    //相手に問い合わせる
        virtual void  GuNiKachi() = 0;      //グーに勝てるかどうかを返す
        virtual void  ChokiNiKachi() = 0;   //チョキに勝てるかどうかを返す
        virtual void  PaNiKachi() = 0;      //パーに勝てるかどうかを返す
    };
    
  3. 純粋仮想関数は、クラスを継承したクラスでオーバーライドされることが前提で、このままでは実行出来ません。
    Hand Object Class を継承して Gu Object Class を作成してみましょう。
    自分が「グークラス」なので、チョキに勝ってパーに負け、グーのときはあいこです。
    class  Gu : public Hand
    {
      public:
        void  Check(Hand * h)   {  h->GuNiKachi();  }
        void  GuNiKachi()       {  cout << "あいこです!\n";  }
        void  ChokiNiKachi()    {  cout << "グーの勝ちです!\n";  }
        void  PaNiKachi()       {  cout << "グーの負けです!\n";  }
    };
    
  4. 同じ要領で Hand Object Class を継承して Choki Object Class を作成します。
    class  Choki : public Hand
    {
      public:
        void  Check(Hand * h)   {  h->ChokiNiKachi();  }
        void  GuNiKachi()       {  cout << "チョキの負けです!\n";  }
        void  ChokiNiKachi()    {  cout << "あいこです!\n";  }
        void  PaNiKachi()       {  cout << "チョキの勝ちです!\n";  }
    };
    
  5. 同じ要領で Hand Object Class を継承して Pa Object Class を作成します。
    class  Pa : public Hand
    {
      public:
        void  Check(Hand * h)   {  h->PaNiKachi();  }
        void  GuNiKachi()       {  cout << "パーの勝ちです!\n";  }
        void  ChokiNiKachi()    {  cout << "パーの負けです!\n";  }
        void  PaNiKachi()       {  cout << "あいこです!\n";  }
    };
    
  6. Object Class を呼び出すメインプログラムです。
    int main()
    {
        Gu      g;
        Choki   c;
        Pa      p;
    
        //グーとチョキの対戦
        cout << "グー vs. チョキ・・・";
        c.Check(&g);
    
        //グーとパーの対戦
        cout << "グー vs. パー・・・";
        p.Check(&g);
    
        //グーとグーの対戦
        cout << "グー vs. グー・・・";
        g.Check(&g);
    
        return 0;
    }
    
  7. プログラムを実行して正しく判定されることを確かめて下さい。
    どのように実行されるのかを考えて下さい。
  8. このプログラムを改造して、乱数でジャンケンの相手をするプログラムを作成して下さい。
    人間側の手は、キーボードから「1:グー 2:チョキ 3:パー」をタイプします。
    これ以外のキーがタイプされたらプログラムを終了します。

超初心者のプログラム入門(C/C++)