RSS

 

RSS


トランプゲームのババぬきをプログラムで実験すべく準備中。

ひさびさ、プログラミングの記事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; などと外から入力しようとしてもコンパイルエラー。

以上


  • コメント (0)
  • トラックバック (0)
トラックバックURL :
http://www.iwai-masaka.jp/tb.cgi/56040