72315


じゃんけんに5回勝ったらウィンドウで勝敗結果を出します。

ルール

  1. プレイヤーは一人

  2. プレイヤーはグー、チョキ、パーのどちらかを選択

  3. プレイヤーが5回勝ったら勝利。  
CPUが5回勝ったらCPUの勝利。

勝敗結果をウィンドウで表示をします。そして、ウィンドウを閉じた際にゲーム画面を初期化したいのですが思うようにいきません。

恐らく以下の箇所が原因だと思うのですが、解決法が分かりません。

[code]

    this.lblResult.Text = message;
    this.label4.Text = mess;
    this.WinRate.Text = grades;
    
[/code]

* * *

**ソースコード**

[code]

        private void MatchStart(int my_hand)
        {
            string message = "";
            string mess = "";
            string grades = "";
    
            int cpu_hand = GetCpuHand();
    
            this.picYou.Image = GetJankenImage(my_hand);
            this.picCPU.Image = GetJankenImage(cpu_hand);
    
            int judge = JadgeJanken(my_hand, cpu_hand);
            int hantei = JadgeJanken(my_hand, cpu_hand);
            int rate = 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;
    
            label2.Text = "あなたは";
            label3.Text = "でわたしの";
    
            int ret = ConvertVictoryMessage(judge, ref message);
    
            int ret2 = ConvertVictory(hantei, ref mess);
    
            int ret3 = Syouritu(rate, ref grades);
    
            if (ret == 0)
            {
                this.lblResult.Text = message;
            }
            else
            {
                this.lblResult.Text = "不正な結果が返ってきました。";
            }
    
            if(ret2 == 0)
            {
                this.label4.Text = mess;
            }
            else
            {
                this.label4.Text = "不正な結果が返ってきました。";
            }
    
            if (ret3 == 0)
            {
                this.WinRate.Text = grades;
            }
            else
            {
                this.WinRate.Text = "不正な結果が返ってきました。";
            }
        }
    
        private int GetCpuHand()
        {
            int cpu_hand = r.Next(3);
    
            if (cpu_hand < 0 && cpu_hand > 2)
            {
                return -1;
            }
    
            return cpu_hand;
        }
    
        private Image GetJankenImage(int index)
        {
            if (index < 0 && index > 2)
            {
                return null;
            }
    
            return imgJankenList.Images[index];
        }
    
        private int JadgeJanken(int my_hand, int cpu_hand)
        {
            return (my_hand - cpu_hand + 3) % 3;
        }
    
        private int ConvertVictoryMessage(int judge, ref string victory)
        {
            switch (judge)
            {
                case 0:
                    victory = "";
                    break;
                case 1:
                    victory = "負け";
                    break;
                case 2:
                    victory = "勝ち";
                    break;
                default:
                    victory = "";
                    return -1;
            }
            lblResult.Text = victory.ToString();
    
            return 0;
    
        }
    
        private int ConvertVictory(int hantei, ref string mess)
        {
            switch (hantei)
            {
                case 0:
                    mess = "であいこ";
                    break;
                case 1:
                    mess = "であなたの";
                    break;
                case 2:
                    mess = "であなたの";
                    break;
                default:
                    mess = "";
                    return -1;
            }
            label4.Text = mess.ToString();
    
            return 0;
    
        }
    
        private int Syouritu(int rate, ref string grades)
        {
            switch (rate)
            {
                case 0:
                    grades = "";
                    break;
                case 1:
                    grades = "";
                    break;
                case 2:
                    grades = "";
                    break;
                default:
                    grades = "";
                    return -1;
            }
    
            int cnt_win = 0;            
            int cnt_lose = 0;       
            int cnt_draw = 0;
    
            foreach (int res in array_match_result)
            {
                switch (res)
                {
                    case 0:
                        ++cnt_draw;
                        break;
                    case 1:
                        ++cnt_lose;
                        break;
                    case 2:
                        ++cnt_win;
                        break;
                    default:
                        break;
    
                }
            }
            grades += array_match_result.Length.ToString() + "戦中 "
                + "あなた：" + cnt_win.ToString() + "勝　"
                + "わたし：" + cnt_lose.ToString() + "勝　"
                + "あいこ：" + cnt_draw.ToString();
    
            WinRate.Text = grades.ToString();
    
            if (cnt_win == 5)
            {
                MessageBox.Show(array_match_result.Length.ToString() + "戦中　" + cnt_win.ToString() + "勝"
                        + cnt_lose.ToString() + "敗" + cnt_draw.ToString() + "分けであなたが勝ちました。", "勝敗決定");
    
                array_match_result = new int[0];
                label2.Text = "";
                label3.Text = "";
                label4.Text = "";
                lblResult.Text = "";
                WinRate.Text = "";
                picYou.Image = null;
                picCPU.Image = null;
            }
            else if (cnt_lose == 5)
            {
                MessageBox.Show(array_match_result.Length.ToString() + "戦中　" + cnt_lose.ToString() + "勝"
                        + cnt_win.ToString() + "敗" + cnt_draw.ToString() + "分けでわたしが勝ちました。", "勝敗決定") ;
    
                array_match_result = new int[0];
                label2.Text = "";
                label3.Text = "";
                label4.Text = "";
                lblResult.Text = "";
                WinRate.Text = "";
                picYou.Image = null;
                picCPU.Image = null;
            }
    
            return 0;
        }
    
[/code]


CC BY-SA 4.0
2020-12-01T03:05:57.763
72308
2020-12-11T03:48:30.677
2020-12-11T03:48:30.677
3060
42946
question
c#
C# じゃんけんゲーム　ゲーム画面を初期の状態に戻したい


表示内容をクリアする処理そのものは`private int Syouritu(int rate, ref string
grades)`の中で各`MessageBox.Show(...)`の後に行っていますね。

[code]

    MessageBox.Show(...
            + ...
    
    array_match_result = new int[0];
    label2.Text = "";
    label3.Text = "";
    label4.Text = "";
    lblResult.Text = "";
    WinRate.Text = "";
    picYou.Image = null;
    picCPU.Image = null;
    
[/code]

しかし`Syouritu(...)`から戻った後にテキストボックスに質問記事に記述された代入をしているので、再度テキストが表示される状態です。

[code]

    int ret3 = Syouritu(rate, ref grades);
    
    if (ret == 0)
    {
        this.lblResult.Text = message;
    }
    else
    {
        this.lblResult.Text = "不正な結果が返ってきました。";
    }
    
    if(ret2 == 0)
    {
        this.label4.Text = mess;
    }
    else
    {
        this.label4.Text = "不正な結果が返ってきました。";
    }
    
    if (ret3 == 0)
    {
        this.WinRate.Text = grades;
    }
    else
    {
        this.WinRate.Text = "不正な結果が返ってきました。";
    }
    
[/code]

表示内容をクリアする処理は、`Syouritu(...)`の中で行うよりは`Syouritu(...)`から戻った後で行った方が良いですし、上記の`Syouritu()`から戻った後の処理は全部を削除するか、エラー(0以外)のときだけ以下のようにエラーメッセージを表示すれば良いと思われます。

[code]

    int ret3 = Syouritu(rate, ref grades);
    
    //// 以下をSyouritu(...)から移動する
    array_match_result = new int[0];
    label2.Text = "";
    label3.Text = "";
    label4.Text = "";
    lblResult.Text = "";
    WinRate.Text = "";
    picYou.Image = null;
    picCPU.Image = null;
    
    //// 以下はエラー時の表示だけ残す場合。あるいは無くても良い。
    if (ret != 0)
    {
        this.lblResult.Text = "不正な結果が返ってきました。";
    }
    
    if(ret2 != 0)
    {
        this.label4.Text = "不正な結果が返ってきました。";
    }
    
    if (ret3 != 0)
    {
        this.WinRate.Text = "不正な結果が返ってきました。";
    }
    
[/code]

他にはこんな風に`private void MatchStart(int
my_hand)`の中に文字列変数を定義して、関数のパラメータに`ref`で渡していることも遠因ですが、いったい何を意図してこのようにしているかを見直した方が良いでしょう。それによっては上記変更は適切では無いかもしれません。

[code]

    string message = "";
    string mess = "";
    string grades = "";
    
    ...
    
    int ret = ConvertVictoryMessage(judge, ref message);
    int ret2 = ConvertVictory(hantei, ref mess);
    int ret3 = Syouritu(rate, ref grades);
    
[/code]


CC BY-SA 4.0
2020-12-01T06:12:42.510
72315
2020-12-01T06:20:40.150
2020-12-01T06:20:40.150
26370
26370
72308
answer