【C#入門】第7回 繰り返しについて【じゃんけんゲームを作ろう その7】

2023年2月7日

こんにちは。
ノムノムです。

前回は条件文をやりました。

【C#入門】第6回 条件文について【じゃんけんゲームを作ろう その6】
【C#入門】第6回 条件文について【じゃんけんゲームを作ろう その6】
こんにちは。ノムノムです。 前回は変数をやりました。 今回は、条件文です。条件文は分岐や繰り返しといった処理に…
http://nomux2.net/branching/

今回は繰り返し文をやります。

繰り返し文

繰り返しっていうぐらいだからループするってことです。

基本的に繰り返し文は条件式が真(true)の時に繰り返し、偽(false)の時に処理を抜けます。

繰り返し文の代表的なものはfor文とwhile文です。この2つを覚えればとりあえず繰り返しに関して困ることはないと思います。

for文

for文は初期値から条件式が偽(false)になるまでループを行います。

for(初期値; 条件式; 加算)
{

}

例をあげます。例えば、1~10を足していく繰り返し文を作ってみます

int sum = 0;
for (int cnt=1; cnt<=10; cnt++)
{
    sum += cnt;
}

初期値で変数cntを宣言して初期値を1としています。条件式には変数cntが10以下の時は繰り返したいので「cnt <= 10」をおいて最後に変数cntを繰り返すごとに 1 加算しています。

注意したいことは、この変数cntのスコープ範囲はfor文の中だけです。

またbreakで繰り返し文を抜ける、continueで次へ進むことができます。

1~100まで偶数だけ足していき100を超えた時に繰り返し文を抜ける例をあげます。

int sum = 0;
for (int num=1; num <= 100; num++)
{
    //奇数の時は計算しない(%は割り算の余りを計算する演算子 == は左辺と右辺が等しいか確認する比較演算子)
    if (num % 2 == 1)
    {
        continue;
    }

    //合計に加算
    sum += num;

    //合計値が100を超えていたら繰り返し文を抜ける
    if (sum > 100)
    {
        break;
    }
}

while文

つぎにwhile文の説明をします。
while文は条件式が偽(false) になるまで繰り返します。

while(条件式)
{

}

注意しなければいけないことは、条件式が不変でずっと真(true)を返すような値にすると永久ループといってループから抜け出せなくなり、プログラムが終了できないという事態になってしまいます。

先ほど同様 1~100まで偶数だけ足していき100を超えた時に繰り返し文を抜ける例をあげます。

//初期化
int num = 0;
int sum = 0;

//変数sumが100以下の場合ループする
while(sum <= 100)
{
    //偶数なので2ずつ足していく
    num += 2;

    //合計に加算
    sum += num;
    
    //100を超えていたら抜ける
    if (sum > 100)
    {
        break;
    }

}

while文もbreakで処理を抜けることができます。

じゃんけんゲームの作り込み

繰り返し文は今回使用してないですが、これまでの変数や条件文からじゃんけんゲームを作り込んで一行と思います。

それでは、以下のグーのボタンを押した時の処理を入れてみましょう。


private void btnGoo_Click(object sender, EventArgs e)
{
    //①あなたの手
    this.picYou.Image = imgJankenList.Images[0];            //グーをあなたの手にします。

    //②CPUの手
    int cpu_hand = r.Next(3);       //0~2の乱数を返します。

    //③ CPUの手にあった画像を取得
    switch(cpu_hand)
    {
        case 0:
            this.picCPU.Image = imgJankenList.Images[0];    //グーをCPUの手にします。
            break;
        case 1:
            this.picCPU.Image = imgJankenList.Images[1];    //チョキをCPUの手にします。
            break;
        case 2:
            this.picCPU.Image = imgJankenList.Images[2];    //パーをCPUの手にします。
            break;
        default:
            this.picCPU.Image = null;
            break;
    }

    //④勝敗判定
    if (cpu_hand == 0)
    {
        this.lblResult.Text = "引き分け";
    }
    else if (cpu_hand == 1)
    {
        this.lblResult.Text = "勝ち";
    }
    else if (cpu_hand == 2)
    {
        this.lblResult.Text = "負け";
    }
    else
    {
        this.lblResult.Text = "判定不能";
    }
}

解説

それでは、一つ一つ細かく見ていきましょう。

①あなたの手

this.picYou.Image = imgJankenList.Images[0];            //グーをあなたの手にします。

これは、フォーム上にあるpicYouコントロールオブジェクトにグーのイメージを設定しています。
画面にグーの画像が表示されます。

②CPUの手

int cpu_hand = r.Next(3);       //0~2の乱数を返します。

r というのは変数の説明をしたときに追加した乱数のクラスです。Next(3)とすることで0~2の整数を取得することができます。
ここでは、0~2のどれかの数字がランダムで変数cpu_handに入るという認識で十分です。

③ CPUの手にあった画像を取得

    switch(cpu_hand)
    {
        case 0:
            this.picCPU.Image = imgJankenList.Images[0];    //グーをCPUの手にします。
            break;
        case 1:
            this.picCPU.Image = imgJankenList.Images[1];    //チョキをCPUの手にします。
            break;
        case 2:
            this.picCPU.Image = imgJankenList.Images[2];    //パーをCPUの手にします。
            break;
        default:
            this.picCPU.Image = null;
            break;
    }

②でcpuの出す手が分かったのでそのイメージを取得しpicCPUのイメージに設定します。
画面にCPUの手の画像が表示されます。

今回は、0 をグー、1 をチョキ、2 をパーとします。

④勝敗判定

if (cpu_hand == 0)
{
    this.lblResult.Text = "引き分け";
}
else if (cpu_hand == 1)
{
    this.lblResult.Text = "勝ち";
}
else if (cpu_hand == 2)
{
    this.lblResult.Text = "負け";
}    
else
{
    this.lblResult.Text = "判定不能";
}

③で 0 をグー、1 をチョキ、2 をパー としました。
グーを押した場合ですのでCPUの手である変数cpu_handが0 の場合はあいこ、1の場合は勝ち、2の場合は負けとなります。

それ以外の場合は、エラーとして判定不能としました。あえてif文を使いましたがswitch文の方が見やすいかもしれません。お好きな方で大丈夫です。

switch(cpu_hand)
{
    case 0:
        this.lblResult.Text = "引き分け";
        break;
    case 1:
        this.lblResult.Text = "勝ち";
        break;
    case 2:
        this.lblResult.Text = "負け";
        break;
    default:
        this.lblResult.Text = "判定不能";
        break;
}

まとめ

作ってみたら繰り返し文を使うところがありませんでした。すいません。

3すくみも実は計算式があるのでいちいち条件文を使用しなくてもいいのですが、ここでは学習がメインですので、追々やっていこうかと思います。

ここまで、できればあとはチョキとパーを同じように作ればひとまず完成となります。
やってみてください。

次回は、関数を使ってじゃんけんゲームを見やすく、修正しやすいものに変えていこうと思います。
ここまでお付き合いいただきありがとうございます。

【C#入門】第8回 関数について【じゃんけんゲームを作ろう その8】
【C#入門】第8回 関数について【じゃんけんゲームを作ろう その8】
こんにちは、ノムノムです。 前回は繰り返し文までやりました。 今回は関数をやりたいと思います。 まずはここまで…
http://nomux2.net/method/