じゃんけんゲームで C# のオブジェクト指向プログラミングのお勉強

以前は OOP のお勉強に本のじゃんけんゲームのコードを移植してやっていたのですが、自分で作ってみることにしました。昨日一日で C# のお勉強をした(参照)ので、その試しです。あとで同じのを Ruby で書いてみるつもりです(追記:書きました)。

題材はじゃんけんゲームです。こんな感じ。


C# のコードです。えらく長くなってしまいました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JankenAsobi {
    class Program {
        static void Main(string[] args) {
            Cp  player1 = new Cp();
            Man player2 = new Man();
            Judge judge = new Judge(player1, player2);
            for (int i = 1; i <= 5; i++) {
                judge.Game(i);
            }
            judge.Winner();
            Console.Read();
        }
    }

    abstract class Player {
        public int wincount;
        public String name;
        public String Name {
            get { return name; }
            }
        public Player() {
            this.wincount = 0;
        }
        public abstract int ShowHand();
        public void Count() {
            wincount++;
        }
        public int WinCount {
            get { return wincount; }
        }
    }

    class Cp : Player {
        public Cp() {
            this.name = "Computer";
            }
        public override int ShowHand() {
            Random rnd = new Random();
            return rnd.Next(0, 3);
        }
    }

    class Man : Player {
        public Man() {
            Console.Write("あなたの名前を入力して下さい:");
            this.name = Console.ReadLine();
            if (name == "") {
                name = "名無し";
            }
        }
        public override int ShowHand() {
            int n;
            do {
                Console.Write(this.name + "の手を入力して下さい(0:グー, 1:チョキ, 2:パー):");
                try { 
                    n = int.Parse(Console.ReadLine());
                }
                catch {
                    Console.WriteLine("数字を入れて下さい");
                    n = -1;
                }
            } while (n != 0 && n != 1 && n != 2);
            return n;
        }
    }

    class Judge {
        public Player player1;
        public Player player2;
        public Judge(Player p1, Player p2) {
            this.player1 = p1;
            this.player2 = p2;
            Console.WriteLine(player1.Name + " 対 " + player2.Name + " :じゃんけん開始\n");
        }
        public int hand1, hand2;
        public void Game(int n) {
            Console.WriteLine("*** {0}回戦 ***", n);
            hand1 = player1.ShowHand();
            hand2 = player2.ShowHand();
            Judgement(hand1, hand2);
        }
        private void Judgement(int h1, int h2) {
            Player winner = player1;
            Console.Write(Hand(h1) + " 対 " + Hand(h2) + "で ");
            if (h1 == h2) {
                Console.WriteLine("引き分けです。");
                return;
            } else if ((3 + h1 - h2) % 3 == 1) {
                winner = player2;
            }
            Console.WriteLine(winner.Name + "の勝ちです。");
            winner.Count();
        }
        private string Hand(int h) {
            string[] hs = {"グー", "チョキ", "パー" };
            return hs[h];
        }
        public void Winner() {
            int p1, p2;
            p1 = player1.WinCount;
            p2 = player2.WinCount;
            Player finalwinner = player1;
            Console.Write("\n*** 最終結果 ***\n{0} 対 {1} で ", p1, p2);
            if (p1 == p2) {
                Console.WriteLine("引き分けです。");
                return;
            } else if (p1 < p2) {
                finalwinner = player2;
            }
            Console.WriteLine(finalwinner.Name + "の勝ちです。");
        }
    }
}
  • Program
    • Main(): 最初に呼ばれるメソッドです。
  • Player: 抽象クラスです。
    • ShowHand(): 抽象メソッドです。手を見せます。
    • Count(): 勝ったときに呼ばれて、勝数を 1増やします。
    • Name: プロパティです。プレーヤーの名前を返します。
    • WinCount: プロパティです。プレーヤーの勝った回数を返します。
  • Cp: Playerクラスを継承します。対戦相手のコンピュータ側の処理をします。
  • Man: Playerクラスを継承します。人間側の処理をします。
  • Judge: 審判のクラスです。ゲームを進行させていきます。
    • Game(int n): 第 n 回戦を進行させるメソッドです。
    • Judgement(): private メソッドです。第 n 回戦の勝ち負けの処理をします。
    • Winner(): すべての勝負が終わったあとの処理(最終勝者の処理など)をします。

 
 
 
一応 exe ファイルを添付しておくので、Windows を使っておられる方はダウンロードしてダブルクリックで遊べます(しょうもないものですけれど)。ただ、出所不明のアプリということで、いっぱい警告が出ると思いますが(笑)。
JankenAsobi.exe 直