トランプゲームのババぬきをプログラムで実験すべく準備中。
ひさびさ、プログラミングの記事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; などと外から入力しようとしてもコンパイルエラー。
以上