【C#入門】第10回 配列について【じゃんけんゲームを作ろう その10】
こんにちは、ノムノムです。
前回までじゃんけんゲームを作成しデバッグできるところまでやりました。

すでにじゃんけんゲームとしては最低限出来ていると思いますが、もっといろいろ機能を追加してより面白くしていこうと思います。
今回は配列をやっていきたいと思います。
配列
配列とは複数の値の集合体です。
文字だけではわかりにくいと思うので絵を作ってみました。
今までの変数の場合が以下の絵のように考えます。

変数一つ一つに値が入っているというイメージです。
これを配列に置き換えるとするならば、下の絵のような感じでイメージして頂ければいいです。

それでは実際にプログラムでどうやるかを説明します。
配列の記述方法
配列には複数の宣言方法があります。それぞれ見ていきましょう。
まず 図の例で 今までの変数宣言の場合を書きます。
string fruit1 = "オレンジ"
string fruit2 = "りんご"
string fruit3 = "ぶどう"
string fruit4 = "バナナ"
となるでしょう。これを配列に変えて宣言するようにします。
パターン① 配列の要素数を指定する方法
string[] array_fruit = new string[4];
array_fruit[0] = "オレンジ";
array_fruit[1] = "りんご"
array_fruit[2] = "ぶどう"
array_fruit[3] = "バナナ"
まずは宣言ですね。
配列の場合変数の型に [] を付けます。そして初期値として空っぽの配列を新しく(new)して入れます。
この場合、「文字列の配列を要素4つで新しく作成したものをarray_fruitにセットします。」ということです。array_fruitには4つの要素 array_fruit [0] ~ array_fruit [3] を設定することができます。
パターン②初期値と一緒に宣言する方法
string[] array_fruit = new string[] {"オレンジ", "りんご", "ぶどう", "バナナ"};
こちらは、セットした数の分だけ要素数を作成してくれます。できた内容はパターン①と同様です。
どんな使い道があるのか?
配列にすることのメリットは、まず変数一つの中に複数の値を詰め込めるので見やすさが上がります。
もう一つは繰り返し文を使用した時に真価が発揮されます。
例を示しましょう。
配列に複数の数値の要素が入ってるとします。この合計を繰り返し文を使って取得してみます。
int[] arr_number = new int[]{10, 20, 2, 35, 12, 34, 67, 32, 45, 76};
int sum = 0;
for(int index=0; index < arr_number.Length; index++)
{
sum += arr_number[index];
}
解説します。まず宣言の方は先ほど説明したとおり配列arr_numberの中に10個の数値の要素が入っています。
配列の繰り返しを行うのですが、注目は「arr_number.Length」です。このLengthプロパティには配列の要素の数が入っています。
この場合10が入っています。配列の要素は0~9であるため「index < arr_number.Length」つまり要素数が10より小さければ繰り返すというようになります。
foreach文という繰り返し文がある
繰り返し文の説明の時はあえて説明しませんでしたが、foreachという便利な繰り返し文があります。
foreach(変数の型 変数名 in 配列/List/Collectionなど)
{
}
まあ実際に使ってみましょう。同じ例でやります。
int[] arr_number = new int[]{10, 20, 2, 35, 12, 34, 67, 32, 45, 76};
int sum = 0;
foreach(int num in arr_number)
{
sum += num;
}
解説です。foreachを使うと配列内の要素の数だけループします。
ループする度に変数numに配列の要素が順番に一つ入ってきます。
foreachはすごく便利です。ですが今何番目かはわからないのが欠点ですかね。
使ってみましょう
それではじゃんけんゲームに導入してみましょう。
今回は勝敗を配列に入れて管理してみたいと思います。
まずは宣言です。
public partial class Form1 : Form
{
System.Random r = new System.Random();
int[] array_match_result = new int[0];
public Form1()
スコープ範囲は、フォーム内全体です。関数内で宣言すると関数から抜けたときに無くなってしまうためです。
new int[0]となっているのは宣言だけして中身は無しとするためです。まだ宣言した時は、何も勝負してませんしね。
//勝負スタート
private void MatchStart(int my_hand)
{
string message = "";
int cpu_hand = GetCpuHand(); //0~2の乱数をCPUの手にします。
//イメージを設定
this.picYou.Image = GetJankenImage(my_hand); //あなたの手
this.picCPU.Image = GetJankenImage(cpu_hand); //CPUの手
//勝敗判定
int judge = JadgeJanken(my_hand, cpu_hand);
//勝負の結果を配列に追加
Array.Resize(ref array_match_result, array_match_result.Length + 1);
array_match_result[array_match_result.Length - 1] = judge;
//勝敗結果文字列を取得
int ret = ConvertVictoryMessage(judge, ref message);
//結果を表示
if (ret == 0)
{
this.lblResult.Text = message;
}
else
{
this.lblResult.Text = "不正な結果が返ってきました。";
}
}
まず、じゃんけんをしたら勝敗を格納するために配列のサイズを広げる必要があります。
宣言状態だと要素の数は0個です。
ArrayクラスのResize関数で要素数を増やすことができます。
Array.Resize(ref array_match_result, array_match_result.Length + 1);
この場合、array_match_result.Lengthで今の要素数を取得しているので + 1をして新しい要素追加しています。
array_match_result[array_match_result.Length - 1] = judge;
そして、追加した新しい要素(array_match_result.Lengthは追加したので増えている)にじゃんけんの結果を入れています。
まとめ
勝敗結果は格納しています。さてここのままでは画面に表示されていません。
どうでしょう?あなたが好きに表示させてみてはいかがでしょうか?
表示するのは、lblResultコントロールでもいいし、表示用に新しいコントロールを追加してもいいです。
表示内容は勝率でもいいし、対戦成績でもいいです。
次回はこの課題の答えを兼ねて文字列についていろいろやってみようと思います。
プログラムを早く習得するには試行錯誤するのが一番です。書いてある通りにやったら、なんかよくわかんないけど動いたヨシヨシでは上達が遅いですからね。
