オブジェクトじゃんけん
- 勝手にじゃんけん祭り (やじゅ@アプリケーション・ラボ わんくま支局)
- オブジェクトじゃんけん (東方算程譚)
エピさんのコードにインスパイアされて、 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 」はエピさん同様省略しました。(スンマセン)