前提・実現したいこと
VisualSutdioでじゃんけんゲームを作っています。
累積の勝敗を文字で表示し、先に5回勝ったらウィンドウで勝ち数、負け数、分け数を表示させるというものです。
発生している問題・エラーメッセージ
5回勝ったらウィンドウで勝敗の結果が表示されるのですが、表示されている文字とMessageBoxとで値が違います。
正確には表示されている文字が変わる前にMessageBoxのほうで表示されてしまいます。MessageBoxを閉じると文字もMessageBoxと同じ値になります。
これはどのように改善すればいいのでしょうか。
エラーメッセージ
該当のソースコード
public partial class Form1 : Form { Random r = new Random(); int[] array_match_result = new int[0]; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.picCPU.Image = null; this.picYou.Image = null; this.lblResult.Text = ""; } private void btnGoo_Click(object sender, EventArgs e) { MatchStart(0); } private void btnChoki_Click(object sender, EventArgs e) { MatchStart(1); } private void btnPar_Click(object sender, EventArgs e) { MatchStart(2); } 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; int ret = ConvertVictoryMessage(judge, ref message); int ret2 = ConvertVictory(hantei, ref mess); int ret3 = Syouritu(rate, ref grades); label2.Text = "あなたは"; label3.Text = "でわたしの"; 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; } 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; } 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(); if (cnt_win == 5) { MessageBox.Show(array_match_result.Length.ToString() + "戦中 " + cnt_win.ToString() + "勝" + cnt_lose.ToString() + "敗" + cnt_draw.ToString() + "分けであなたが勝ちました。", "勝敗決定"); } else if (cnt_lose == 5) { MessageBox.Show(array_match_result.Length.ToString() + "戦中 " + cnt_lose.ToString() + "勝" + cnt_win.ToString() + "敗" + cnt_draw.ToString() + "分けでわたしが勝ちました。", "勝敗決定"); } return 0; }
ここに言語名を入力
ソースコード
### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなりますので。インデントされてないコードは質問者さんも読む気がしないのでは? 閲覧者・回答者はなおさらです。
すみません、初めてでしたのでそのようなものがあるとは知りませんでした。
ご指摘ありがとうございます。
処理を追うのにステップ実行を覚えてください。
> string message = "";
まずこの行にキャレットを置いて F9 を押します。すると左端に赤い円が現れます。もう一度押すと解除されるので、何度か押してためしてみてください。この円のついた行のことをブレークポイントと言います。
ブレークポイントを設定したら F5 を押してデバッグ実行してください。すると、ブレークポイントで停止します。そこで F10 を押すと、処理が一行進みます。画面を見ながら F10 を押すのを繰り返し、どの処理が実行されているのかを確かめてください。そうすれば自ずとどこが悪いのかわかります。
あと、画像ではパーがチョキに勝っていますが、これはいいんですか?
ありがとうございます。
このような機能があったのですね。
画像についてですが、今回はその件について質問させていただいたので表記としては間違ってはいますが質問の内容としては正しいかと思います。
回答2件
あなたの回答
tips
プレビュー