読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

オブジェクトじゃんけん

C# わんくま

エピさんのコードにインスパイアされて、 C# で書いてみました。

using System;

namespace Jp.Mkns.Wankuma.Yaju {
  enum HandName {
    G,
    C,
    P
  }

  enum Result {
    Win,
    Lose,
    Even,
    None = -1
  }

  static class Extention {
    public static String ToValue(this Result e) {
      switch (e) {
        case Result.Win:
          return "かち";
        case Result.Lose:
          return "まけ";
        case Result.Even:
          return "あいこ";
      }
      return "None";
    }

    public static String Name(this HandName h) {
      switch (h) {
        case HandName.G:
          return "G";
        case HandName.C:
          return "C";
        case HandName.P:
          return "P";
      }
      return "None";
    }
  }

  class Hand {
    public HandName Name { get; set; }

    public Hand(HandName name) {
      this.Name = name;
    }

    public static Result operator* (Hand h1, Hand h2) {
      if (
        (h1.Name == HandName.G && h2.Name == HandName.C)
        || (h1.Name == HandName.C && h2.Name == HandName.P)
        || (h1.Name == HandName.P && h2.Name == HandName.G)
      ) {
        return Result.Win;
      } else if (
        (h1.Name == HandName.G && h2.Name == HandName.P)
        || (h1.Name == HandName.C && h2.Name == HandName.G)
        || (h1.Name == HandName.P && h2.Name == HandName.C)
      ) {
        return Result.Lose;
      }
      return Result.Even;
    }
  }

  class test {
    static void Main() {
      var hand = new Hand[] { new Hand(HandName.G), new Hand(HandName.C), new Hand(HandName.P) };
      foreach (Hand h1 in hand) {
        foreach (Hand h2 in hand) {
          Console.WriteLine("{0} x {1} : {2}", h1.Name.Name(), h2.Name.Name(), (h1 * h2).ToValue());
        }
      }
    }
  }
}

演算子のオーバーロードを使って掛け算でじゃんけんをする」がコンセプト。
本当は Hand 自体を enum にしたかったんですが、列挙体の演算子のオーバーロードが出来なくて断念。
そのせいで、ちょっと汚くなってます。(が、コンセプトは伝わるだろう、たぶん)
なお、やじゅさんの要件にある「 COM 」はエピさん同様省略しました。(スンマセン)