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

コンピュータ=0  対戦相手=0   勝負:あいこです!
コンピュータ=0  対戦相手=1   勝負:グー(コンピュータ)の勝ちです!
コンピュータ=0  対戦相手=2   勝負:グー(コンピュータ)の負けです!
コンピュータ=1  対戦相手=0   勝負:チョキ(コンピュータ)の負けです!
コンピュータ=1  対戦相手=1   勝負:あいこです!
コンピュータ=1  対戦相手=2   勝負:チョキ(コンピュータ)の勝ちです!
コンピュータ=2  対戦相手=0   勝負:パー(コンピュータ)の勝ちです!
コンピュータ=2  対戦相手=1   勝負:パー(コンピュータ)の負けです!
コンピュータ=2  対戦相手=2   勝負:あいこです!

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

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. ジャンケンの勝ち負けを調べるクラスを抽象クラスを使って作成してみましょう。
    抽象クラスの簡単な例は「C/C++/Object Class 演習」から 純粋仮想関数と抽象クラス を参照して下さい。
    クラスの元になる Hand 抽象クラスです。
    Hand Object Class は4個の抽象メソッドを持っています。
    Check() は、ジャンケンの勝ち負けを問い合わせる(判定する)関数です。
    GuNiKachi() は、自分のクラスが、グーに勝てるかどうかを調べる関数です。
    ChokiNiKachi() は、自分のクラスが、チョキに勝てるかどうかを調べる関数です。
    PaNiKachi() は、自分のクラスが、パーに勝てるかどうかを調べる関数です。
    /****************************************************/
    /*★ 抽象(abstract)クラスでジャンケン     前田 稔 ★*/
    /****************************************************/
    using System;
    
    //抽象メソッドを持つ抽象クラスの定義
    abstract class Hand
    {
        public abstract int  Check(Hand h); //抽象メソッド
        public abstract int  GuNiKachi();   //抽象メソッド
        public abstract int  ChokiNiKachi();//抽象メソッド
        public abstract int  PaNiKachi();   //抽象メソッド
    }
    
  2. 抽象メソッドは、クラスを継承したクラスでオーバーライドされることが前提で、このままでは実行出来ません。
    Hand Object Class を継承して Gu Object Class を作成してみましょう。
    自分が「グークラス」なので、チョキに勝ってパーに負け、グーのときはあいこです。
    class  Gu : Hand
    {
        public override int Check(Hand h)
        {   int val = h.GuNiKachi();
            return val;
        }
        public override int GuNiKachi()
        {   Console.WriteLine("あいこです!");
            return 0;
        }
        public override int ChokiNiKachi()
        {   Console.WriteLine("グー(コンピュータ)の勝ちです!");
            return 1;
        }
        public override int PaNiKachi()
        {   Console.WriteLine("グー(コンピュータ)の負けです!");
            return -1;
        }
    };
    
  3. 同じ要領で Hand Object Class を継承して Choki Object Class と Pa Object Class を作成します。
    class  Choki : Hand
    {
        ・・・
    };
    
    class  Pa : Hand
    {
        ・・・
    };
    
  4. Object Class を呼び出すメインプログラムです。
    pHand[] は Hand Object Class の配列ですが、これを継承した Gu(), Choki(), Pa() を格納して、一元的に管理することが出来ます。
    コンピュータと対戦相手がグー, チョキ, パーのそれぞれの組み合わせで調べます。
    class Jyanken
    {
        public static int Main()
        {
            Hand[]  pHand = new Hand[3];
    
            pHand[0] = new Gu();
            pHand[1] = new Choki();
            pHand[2] = new Pa();
            for(int i=0; i<9; i++)
            {
                Console.Write("コンピュータ={0}  対戦相手={1}   勝負:", i/3, i%3);
                pHand[i%3].Check(pHand[i/3]);
            }
            Console.ReadLine();
            return 0;
        }
    }
    
  5. プログラムを実行して正しく判定されることを確かめて下さい。
    どのように実行されるのかを考えて下さい。
  6. このプログラムを改造して、乱数でジャンケンの相手をするプログラムを作成して下さい。
    対戦相手の手は、キーボードから「0:グー 1:チョキ 2:パー」をタイプします。
    これ以外のキーがタイプされたらプログラムを終了します。
    常に対戦成績(勝ちの数, 負けの数, あいこの数)を表示して下さい。

超初心者のプログラム入門(C# Frame Work)