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

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

オセロのデータ構造 in C#

program

マイミクにサンプルを見せようと思ったけど、mixiのメッセージにファイルが添付できないのでココにはっつけておく。
どっかのサービスで、コードをはっつけると色を付けてくれて、urlで参照できるようにしてくれるのがあったんだけど、どこだったか忘れちゃった。

namespace Othello
{
    class Board
    {
        public enum State { None, Black, White };

        private ColorBoard black = new ColorBoard();
        private ColorBoard white = new ColorBoard();

        public State this[int x, int y]
        {
            get
            {
                if (black[x,y]) return State.Black;
                if (white[x,y]) return State.White;
                return State.None;
            }
            set
            {
                if (value == State.Black) {
                    black[x,y] = true;
                    white[x,y] = false;
                }
                if (value == State.White) {
                    black[x,y] = false;
                    white[x,y] = true;
                }
            }
        }

        public int Count(State s) {
            if (s == State.Black) return black.num;
            if (s == State.White) return white.num;
            return 64 - black.num  - white.num;
        }

        //1色だけの状態を表す.
        private struct ColorBoard {
            public ulong state;
            public int num;
            bool this[int x, int y] {
                get {
                    ulong pos = (ulong)1 << (y * 8 + x);
                    return (state & pos) != 0;
                }
                set {
                    ulong pos = (ulong)1 << (y * 8 + x);
                    if (value && !this[x, y]) {
                        state |= pos;
                        count++;
                    }
                    if (!value && this[x, y]) {
                        state &= ~pos;
                        count--;
                    }
                }
            }
            int Count { get { return count; } }
            private int count;
        }
    }

    class Rule
    {
        public static Board NewBoard()
        {
            Board b = new Board();
            b[3, 3] = Board.State.Black;
            b[4, 4] = Board.State.Black;
            b[3, 4] = Board.State.White;
            b[4, 3] = Board.State.White;
            return b;
        }
        //...その他オセロのルールはココに書いていく...
    }
}