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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

1344閲覧

switch文を使うとフリーズします

CsharpBiginner

総合スコア0

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/04 15:39

前提・実現したいこと

数か月前に勉強し始めたC#超初心者です。
ポーカーのゲームを作っています。
現在手札のカードが何の役に該当するのかの判定をするプログラムを書いてます。

以下ソースコード抜粋です。

C#

1 switch (g.s1) 2 { case 2: 3 One.Visible = true; 4 break; 5 6 case 3: 7 Three.Visible = true; 8 break; 9 10 case 4: 11 Four.Visible = true; 12 break; 13 14 default: 15 16 break; 17 18 }

g.s1は変数で初期値は0です。もし手札にスペードの1があれば、役の判定を行う前にg.s1+=1;しています。
なのでg.s1が2だったら2枚スペードの1があるのでワンペア、3だったらスリーカードというように判定できるようになっています。
OneとThreeとFourはラベルです。プレイヤーに何の役が判定されたかを伝えるためのものになっています。
フルハウスやフラッシュはもう少し工夫が必要になりそうです。

問題は、このスイッチ文に処理が差し掛かった途端十数秒フリーズしてしまうことです。
念のため、この変数g.s1が本当にスペードの1の枚数をカウントしているのかを、
このスイッチ文よりも前の行にラベルを配置して確認しましたが、
そちらは無事しっかりと、ワンペアだった場合は2という数字になっていました。
なので原因はこのスイッチ文の中にあると思っているのですが、どうしてもここの処理がうまくいきません。
エラーメッセージは特に出ていません。
リスクを承知でApplication.DoEvents();を行ってみましたが、改善は見られませんてした。(にわかだったらすみません、)

端的にまとめますと、変数が~だった場合は~~のラベルを表示するという簡単な処理をしたいだけです。

ご教授いただけたら幸いです。

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

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

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

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

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

BeatStar

2021/06/04 17:46

カテゴリがめちゃくちゃです。 C#であればobjectiveとか関係ありません。
BeatStar

2021/06/04 17:51

またg.s1が何者なのかもわかりません。 質問者さんからすれば当たり前でも、回答者からすれば当たり前ではないです。 回答者は質問者と同じ環境にある…わけじゃないです。 提示された情報からしかよみとれません。 なので情報を出し渋らずに提示しましょう。
BeatStar

2021/06/04 17:53

もしかすると別の場所が原因かもしれません。
CsharpBiginner

2021/06/04 17:57

g.s1は変数で初期値は0です。では伝わらないんですね、すみませんでした。
BeatStar

2021/06/04 18:31

えーっと、gはオブジェクトですよね? もしかしたらそのオブジェクトが問題なのかも知れませんし、他の部分が問題なのかも知れません。 つまり『全体のごく一部だけ出されても回答者はわからない』のです。 したがって、必要な情報は端折らずに提示すべきです。 変数と言っても『型』が問題だったりすることもありますから。
CsharpBiginner

2021/06/04 18:55

なるほど、わかりやすく解説ありがとうございます。おっしゃる通りgはオブジェクトでGameというクラスのものになります。その中でs1というpublicのint型の変数を作成しました。ソースコード全体を載せたいのですが、量がここに書くには膨大な上に、インデントの仕方が独特なので、追加は後ほどさせていただきますね。
episteme

2021/06/04 23:52 編集

switch (g.s1) { default: break; } だったら中断しますか? 中断するなら原因は別のところ。
thkana

2021/06/05 00:27

カテゴリタグは修正するつもりはないのですか? それはそれとして、十中八九、ここではないこの前後に問題があると思います。 > このスイッチ文に処理が差し掛かった途端十数秒フリーズしてしまうことです。 それはどうやって確認しましたか? ステップ実行などでもそうなりますか?
asm

2021/06/05 00:38 編集

> 2枚スペードの1があるのでワンペア、3だったらスリーカードというように判定できるようになっています。 私の知るポーカーではスペ1が複数枚というのは起こりませんが default以外が起こるのでしょうか?
thkana

2021/06/05 01:13

(昔ラスベガスに行ったとき、場の安い卓のブラックジャックでは複数のデッキをばさっとまとめて使っていたような記憶が。ポーカーは知らないけど>スペ1が複数枚)
Zuishin

2021/06/05 01:40

ポーカーは普通一組のデッキを使います。 ブラックジャックは今のカジノではカウンティング対策で複数のデッキを使います。そうしないと客が有利になるからです。
CsharpBiginner

2021/06/05 01:45

askさん おっしゃる通り本来のトランプは4枚も同じ記号のカードは存在しませんが、初心者ということもあり枚数をかなり減らしてスペードの1から6までのカードだけでやっています。
CsharpBiginner

2021/06/05 02:00

episteme試してみましたがフリーズすることはありませんでした。こういった確認方法もあるのですね、ありがとうございます。
episteme

2021/06/05 02:32

となると、~.Visible = true が件の現象の原因か...やっぱそのコード片だけでは判断できかねます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問