public Bead Think(MaruBatsu mb) { var box = boxes[map(mb)]; var bead = box.GetBead(); log.Add(Tuple.Create(box, bead)); return bead; }
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(); } } }
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(); }
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(); }
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(); } }
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; }
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; }
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)); } } } } }
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; }