トランプゲームのババぬきをプログラムで実験すべく準備中。
ひさびさ、プログラミングの記事w
C#を使ってパーツを用意中。
53枚のカードをシャッフルするマシンをクラスで書いた。
カードと言っても0~52の数字を使って表している。
コンストラクタでnewした時点ではカードは0~52の順番に詰まっているが、Shuffleを呼べばシャッフルされて。
外からはCards[n]の形で参照できる。
外からはCards[n]を書き換えることはできない。
お客さん、見てもいいけど、シャッフルマシンの中はいじんないでね! ということ。
つまりCardsは
「C# インデックス付のgetだけのプロパティ」
になっている。
ちょっと書き方を悩んだので記事にしてみた。
CardsGetOnlyのところがミソ。
他の書き方もあるのかな。
#######################
        class ShuffleMachine
        {
            Random m_rnd;
            const int c_num = 53;
            int[] m_cards;
 
            /// 
            /// 閲覧用のカード
            ///             public CardsGetOnly Cards;
            /// 
            /// 決まりきった状態の初期化
            ///
             public ShuffleMachine()
            {
                m_rnd = new Random();       //  一つのシードにたよるのでいい
                m_cards = new int[c_num];
                for (int i = 0; i < c_num; i++)
                {
                    m_cards[i] = i;
                }
                Cards=new CardsGetOnly(m_cards);
            }
            /// 
            /// 順番に全部のカードをどこかのカードと交換する
            ///
             public void Shuffle()
            {
                for (int i = 0; i < c_num; i++)
                {
                    int me = i;
                    int him = m_rnd.Next(c_num);
                    int mycard = m_cards[me];
                    int himcard = m_cards[him];
                    m_cards[me] = himcard;
                    m_cards[him] = mycard;
                }
            }
            /// 
            /// 閲覧用クラス インデックスを使った getのみ
           ///
             public class CardsGetOnly
            {
                readonly int[] m_cards;
                public CardsGetOnly(int[] cards)
                {
                    m_cards = cards;
                }
                public int this[int index]
                {
                    get
                    {
                        return m_cards[index];
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            ShuffleMachine sm = new ShuffleMachine();
            for (int i=0;i<10 ;i++ )
            {
                sm.Shuffle();
                for (int j = 0; j < 5; j++)
                {
                    Debug.Write(sm.Cards[j].ToString()+" ");
                }
                Debug.WriteLine("");
            }
      //      sm.Cards[3] = 0; //入力しようとするとコンパイルエラー
        
        }
#######################
Mainを動かすと
ShuffleMachineを用意して、
「シャッフルしてカードを上から5枚表示」を10回くりかえす
46 15 1 19 18 
24 4 52 18 28 
7 50 40 4 52 
49 37 2 13 0 
5 20 18 0 36 
23 26 36 44 13 
34 28 18 21 12 
0 9 24 34 23 
0 47 10 21 3 
25 28 34 45 52 
とシャッフルされてるのが見える。
sm.Cards[3] = 0; などと外から入力しようとしてもコンパイルエラー。
以上