陽だまりの中で

~香川フリーランスのぼやき~

HelloWorldからのC#入門!!ランダムなトランプカードの表示!

f:id:hidamarinonakade:20150322163831j:plain

はじめに

おひさしぶりですかなたです。
しばらくモバイル版の改造とPC版のサイズ縮小に努めておりました。
まだPC版は表示がおかしい部分がありますが、そのうち改善します。
とりあえずC#の続きを書いていなかったので書かねば・・・ということで本日はC#の続きについてです。

前回までのあらすじ

最初にまず行ったのはforを用いた九九表の計算でしたね。
forを二つ使用することで九九を実現させることができました。
hidamarinonakade.hatenablog.com

しかしこのままでは見づらいということから"{n,0}"を用いて桁数表示を行うことにしました。
これできれいに全ての数字が桁がそろって格段に見やすくなったはずです。
hidamarinonakade.hatenablog.com

その次はRandom random = new Random(); int ransu = random.Next(1.54);を用いて1~54までの乱数を発生させるというものを作りました。
乱数を使った計算などに使えますね。
ただし、同じ数字が出てしまうという欠点もありますが・・・。
hidamarinonakade.hatenablog.com


そして前回行ったのが重複しない乱数です。
コップの中身を入れ替えるという発想を用いて重複しない乱数を生成することができました。
hidamarinonakade.hatenablog.com

これまでが前回までのあらすじです。
それでは今回のレッスンに進みましょう。


JOKERを含めたトランプ54枚の表示

マークを配列に格納

今回はトランプの表示をしていきたいと思います。
まず最初に考えなければいけないことがあります。
それはカードのマークです。
トランプのマークには何がありますか??
まずは♥、そして♦、♤に♧ですね、そして忘れてはいけないのはJOKERです。
そして気を付けてもらわなければいけないのは、C#では特殊記号が使えません。
もし使おうとすると「?」とか出てしまうのです・・・。
そのため今回は略字でそれぞれH・D・S・CとJKRと表示したいと思います。

まずはこれを配列の中に組み込んでみましょう。
前回はint[] number = new int[]; を使用して数字の配列を用意したと思います。
数字の配列があるということは・・・。
もちろん文字の配列もあります!
それがこちらstring[] moji = new string[];です。
それではこれにマークを入れていきたいと思います。

string[] mark = new string[]{ "H" ,"D" ,"S" ,"C", "JKR" };
これで配列の中にそれぞれ♥、♦、♤、♧、JOKERを入れることができました。

表示の仕方を考えてみる

次に考えなければいけないのが同じマークの枚数です。
それぞれのマークには1~13の数が存在しますね?
つまり13枚です。
♥が13枚、♦も♤も♧も13枚、JOKERだけ2枚です。
それでは1~54の数字でこれらを表現するにはどのようにしたら良いでしょうか?
これでは少しイメージがしづらいかもしれないのでforを用いて1~54を表示してみましょう。

for(int i = 0; ,i <= 53; i++){
Console.WriteLine(i + 1);
}
これで1~54までの数字が順番に表示されます。
これをそれぞれトランプのカードに変えるのです。

まず、♥が表示されるようにしてみましょう。

string[] mark = new string[]{ "H" ,"D" ,"S" ,"C" ,"JKR" };
for(int i = 0; i <= 53; i++){
Console.WriteLine( mark[0] + ( i + 1));
}
これでコンソール上に表示されるのはH1などのHを頭文字とした1~54の数字となります。
しかし、ハートは1~13までしかありませんよね?
14以降は別のマークにしたいのです。
要は13の倍数を機にマークを変えるということです。

マークを変えてみる

ここまでで頭の切れる方はお気づきになりましたでしょうか。
簡単に考えれば1~54の数字を13で割ってやればいいのです。
13で割って0であれば♥
1であれば♦といった具合です。
これを形にしてみましょう。

string[] mark = new string[] { "H" ,"D" ,"S" ,"C" ,"JKR" };
for (int i = 0; i <= 53; i++)
{
Console.WriteLine(mark[i / 13] + ( i + 1 ));
}
このようなコードになります。
これを実行すると・・・
f:id:hidamarinonakade:20150322153731j:plain

このようになります。
このなかには問題点が一つあります。
それは数字が1~54のままの表示ということです。
それではこれらの問題を修正してみましょう。

数字を整える

現状では数字が1~54まで出てしまっているので1~13までを4回とJOKER2枚が表示されるように修正していきましょう。

int kazu = 0;
string[] mark = new string[] { "H" ,"D" ,"S" ,"C" ,"JKR" };
for (int i = 0; i <= 53; i++)
{
kazu = i % 13 + 1;
Console.WriteLine(mark[i / 13] + kazu);
}
これを表示するとこうなります。
f:id:hidamarinonakade:20150322154148j:plain
無事1~13の表示となりました。

が、JOKERにも1と2が表示されています。
それはiが52と53の時も数字を表示するようになっているためです。
次にこれを修正します。

int kazu = 0;
string number = "";
string[] mark = new string[] { "H" ,"D" ,"S" ,"C" ,"JKR" };
for (int i = 0; i <= 53; i++)
{
if( i >= 52 ){
number = "";
}else{
kazu = i % 13 + 1;
number = kazu.ToString();
}
Console.WriteLine(mark[i / 13] + number);
}
これを表示してみましょう。
f:id:hidamarinonakade:20150322155216j:plain
無事JKRだけが表示されました。
今回新しくstringを設置したのにはわけがあります。
まず、intには空白(無)というものが存在しません。
今回の場合52と53の場合にはJKRの後ろには何も入れたくなかったため無を入れる必要がありました。
そのためstringを設置しました。
そして、そのあとに出てきた.ToString()は「string型に変更します」という指示です。
この場合intからstringに変えています。
なぜならstring型にint型を入れることができないためです。
.ToString()等はこの先何度か使うことがあると思うので覚えておいてください。


ランダムなカード配列

次は応用としてこのカードをランダムに表示したいと思います。
今までの応用ですので簡単にできるはずです。
まずはランダム生成器を用意します。

Random random = new Random();
int ransu = random.Next(53);
これで0~53の中で一つ乱数を生成します。
次に0~53の重複しない乱数を生成しましょう。
static void Main(string[] args)
{
int[] card = new int[53];
for(int i = 0; i < card.Length; i++){
card[i] = i;
}
Random random = new Random();
for (int i = 0; i < card.Length; i++)
{
int ransu = random.Next(card.Length);
int kari = card[i];
card[i] = card[ransu];
card[ransu] = kari;
Console.Write(card[i] + " ");
}
これは前回作成したので皆さんできていると思います。

次にこの乱数を先ほどの計算に連動させます。

int[] card = new int[53];
for(int i = 0; i < card.Length; i++){
card[i] = i;
}
Random random = new Random();
for (int i = 0; i < card.Length; i++)
{
int ransu = random.Next(card.Length);
int kari = card[i];
card[i] = card[ransu];
card[ransu] = kari;
}
int kazu = 0;
string number = "";
string[] mark = new string[] { "H", "D", "S", "C", "JKR" };
for (int i = 0; i < card.Length; i++)
{
if (card[i] >= 52)
{
number = "";
}
else
{
kazu = card[i] % 13 + 1;
number = kazu.ToString();
}
Console.WriteLine(mark[card[i] / 13] + number);
}
これを表示するとこうなります。
f:id:hidamarinonakade:20150322163305j:plain
無事ランダムでトランプを表示することができました。


おわりに

どうでしたか?
無事皆さんもランダムに表示することができましたでしょうか?
最後の方は少し勇み足になってしまいましたが、申し訳ありません。
次回については、文字入力について学びたいともいます。
ということで・・・
次回の課題

キーボード入力

こちらを少し学んでおいてください。
最終的にはブラックジャックの作成までやっていきたいと思います。
最後までお付き合いいただけると幸いです♪