コード例 #1
0
 public Bead Think(MaruBatsu mb)
 {
     var box = boxes[map(mb)];
     var bead = box.GetBead();
     log.Add(Tuple.Create(box, bead));
     return bead;
 }
コード例 #2
0
        static void Main(string[] args)
        {
            var boxes = new ThinkingBoxes();

            while (true)
            {
                var mb = new MaruBatsu();
                var turn = MaruBatsu.State.Maru;

                while (!mb.Finished)
                {
                    Show(mb);
                    Console.Write("{0} >", ToStr(turn));

                    // player
                    while (turn == MaruBatsu.State.Maru)
                    {
                        var line = Console.ReadLine().Select(v => (int)(v - '1')).ToList();
                        var x = line[0];
                        var y = line[1];
                        if (x < 0 || y < 0 || x >= 3 || y >= 3 || mb[x, y] != MaruBatsu.State.None)
                        {
                            Console.WriteLine("そこにはおけないよ");
                            continue;
                        }
                        mb[x, y] = turn;
                        break;
                    }

                    // boxes & beads
                    if (turn == MaruBatsu.State.Batsu)
                    {
                        var bead = boxes.Think(mb);
                        Console.WriteLine("{0}{1}", bead.X + 1, bead.Y + 1);
                        mb[bead.X, bead.Y] = turn;
                    }

                    turn = (turn == MaruBatsu.State.Maru) ? MaruBatsu.State.Batsu : MaruBatsu.State.Maru;
                }

                // result
                Show(mb);
                if (mb.MaruWon)
                {
                    Console.WriteLine("あなたの勝ち");
                    boxes.OnLost();
                }
                else if (mb.BatsuWon)
                {
                    Console.WriteLine("箱とビーズの勝ち");
                    boxes.OnWon();
                }
                else
                {
                    Console.WriteLine("引き分け");
                    boxes.OnDrawn();
                }
            }
        }
コード例 #3
0
 static string ToStr(MaruBatsu.State s)
 {
     switch (s)
     {
         case MaruBatsu.State.None: return " ";
         case MaruBatsu.State.Maru: return "○";
         case MaruBatsu.State.Batsu: return "×";
     }
     throw new ArgumentException();
 }
コード例 #4
0
 private int map(MaruBatsu.State s)
 {
     switch (s)
     {
         case MaruBatsu.State.None: return 0;
         case MaruBatsu.State.Maru: return 1;
         case MaruBatsu.State.Batsu: return 2;
     }
     throw new NotImplementedException();
 }
コード例 #5
0
 static void Show(MaruBatsu mb)
 {
     for (var y = 0; y < 3; ++y)
     {
         for (var x = 0; x < 3; ++x)
         {
             Console.Write(ToStr(mb[x, y]));
         }
         Console.WriteLine();
     }
 }
コード例 #6
0
 public MaruBatsu Clone()
 {
     var res = new MaruBatsu();
     for (var y = 0; y < 3; ++y)
     {
         for (var x = 0; x < 3; ++x)
         {
             res[x, y] = this[x, y];
         }
     }
     return res;
 }
コード例 #7
0
 private int map(MaruBatsu mb)
 {
     var res = 0;
     for (var y = 0; y < 3; ++y)
     {
         for (var x = 0; x < 3; ++x)
         {
             res *= 3;
             res += map(mb[x, y]);
         }
     }
     return res;
 }
コード例 #8
0
 public Box(MaruBatsu mb, int initCount)
 {
     Beads = new List<Bead>();
     for (var y = 0; y < 3; ++y)
     {
         for (var x = 0; x < 3; ++x)
         {
             if (mb[x, y] == MaruBatsu.State.None)
             {
                 for (var i = 0; i < initCount; ++i)
                 {
                     Beads.Add(new Bead(x, y));
                 }
             }
         }
     }
 }
コード例 #9
0
 private MaruBatsu unmap(int mapped)
 {
     var res = new MaruBatsu();
     for (var y = 2; y >= 0; --y)
     {
         for (var x = 2; x >= 0; --x)
         {
             res[x, y] = unmapState(mapped % 3);
             mapped /= 3;
         }
     }
     return res;
 }