質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

1133閲覧

表示している文字とMessageBoxで勝敗結果が違う

garudain

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/11/27 04:49

編集2020/11/27 06:27

前提・実現したいこと

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/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/27 04:51

コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなりますので。インデントされてないコードは質問者さんも読む気がしないのでは? 閲覧者・回答者はなおさらです。
garudain

2020/11/27 05:01

すみません、初めてでしたのでそのようなものがあるとは知りませんでした。 ご指摘ありがとうございます。
Zuishin

2020/11/27 06:42

処理を追うのにステップ実行を覚えてください。 > string message = ""; まずこの行にキャレットを置いて F9 を押します。すると左端に赤い円が現れます。もう一度押すと解除されるので、何度か押してためしてみてください。この円のついた行のことをブレークポイントと言います。 ブレークポイントを設定したら F5 を押してデバッグ実行してください。すると、ブレークポイントで停止します。そこで F10 を押すと、処理が一行進みます。画面を見ながら F10 を押すのを繰り返し、どの処理が実行されているのかを確かめてください。そうすれば自ずとどこが悪いのかわかります。 あと、画像ではパーがチョキに勝っていますが、これはいいんですか?
garudain

2020/11/27 07:16

ありがとうございます。 このような機能があったのですね。 画像についてですが、今回はその件について質問させていただいたので表記としては間違ってはいますが質問の内容としては正しいかと思います。
guest

回答2

0

画面の更新を行う前にMessageBoxを表示しているので、そこで処理が停止し、画面の文言がまだ更新されていないだけなのではないですか?

行っていることをものすごく単純化して書くと

C#

1message = "負け"; 2mess = "であなたの"; 3grades += array_match_result.Length.ToString() + "戦中 " 4 + "あなた:" + cnt_win.ToString() + "勝 " 5 + "わたし:" + cnt_lose.ToString() + "勝 " 6 + "あいこ:" + cnt_draw.ToString(); 7 8MessageBox.Show(array_match_result.Length.ToString() + "戦中 " + cnt_win.ToString() + "勝" 9 + cnt_lose.ToString() + "敗" + cnt_draw.ToString() + "分けであなたが勝ちました。", "勝敗決定"); 10 11this.lblResult.Text = message; 12this.label4.Text = mess; 13this.WinRate.Text = grades;

となります。
MessageBox.Showでメッセージボックスを閉じるまで続きが実行されないので、画面のラベルが更新されません。
なので、更新してからメッセージボックスを出しましょうということです。

投稿2020/11/27 05:06

編集2020/11/27 06:37
YAmaGNZ

総合スコア10294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

garudain

2020/11/27 06:37

ありがとうございいます。 無事解決いたしました。
guest

0

ベストアンサー

MessageBoxを表示中は、閉じるまでそこで処理が止まります。
MessageBoxを表示するより前にLabel等を更新すれば良いのではないでしょうか。

投稿2020/11/27 05:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

garudain

2020/11/27 05:17

質問ばかりですみません。 「更新」というのはどうすればよいのでしょうか?
退会済みユーザー

退会済みユーザー

2020/11/27 05:28

今表示している文字列をどうやって変更していますか? その変更している処理をMessageBox表示より前にやるだけです
garudain

2020/11/27 06:36

MessageBoxの前にTextBox.Text = grades.ToString();と入れたら解決しました。 どうやらもう一工程抜けていただけのようです。 ありがとうございました。
YAmaGNZ

2020/11/27 06:44 編集

それだけだと、「あなたの勝ち」や「あなたの負け」の部分が更新されませんよ。 また1工程抜けていたのではなく、工程の順番が違うということです。 だから「MessageBoxを表示するより前にLabel等を更新すれば良い」と回答されているのですよ。
garudain

2020/11/27 07:02

なるほど…工程の順番ですか まだまだ始めたばかりで不慣れなところが多くてすみません。 勝ち負けはどのようにすればよいのでしょうか
YAmaGNZ

2020/11/27 07:27

何も考えずに一番簡単な修正としては、ConvertVictoryMessage等の文言を作り出す関数内でその作成した文言を返すのではなく、その関数内でLabelの更新を行うということです。
garudain

2020/11/27 07:38

今度こそ解決しました。 ベストアンサーを決めてしまった後だというのにここまで付き合って頂き恐縮です。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問