現在、プレイヤー1人とNPC3人の合計4人でじゃんけんをするプログラムを作成しています。プログラムの概略は下記のとおりです。何回勝負か(何回勝利したら終了か)の入力を促す。n)じゃんけんをして、結果を表示する。勝者が一人になるまでじゃんけんを繰り返す。プレイヤーとNPC1~3のいずれかがn勝したら、プレイヤーの成績(a勝b敗c分け)を表示し、プログラムを終了する。以上の動作をするプログラムを作成するにあたり、下記のようなソースコードを書きましたが、一部の組み合わせ(後述)において、間違った勝敗の判定が表示される不具合が発生しております。3日間不具合の発見に尽力しましたが発見できなかったため、こちらの掲示板にて質問をさせていただきました。諦めが早いようではございますが、ソースコードのどの部分に問題があるのかご教示を賜りたく存じます。n);printf("%d勝%d敗%d分けでした。puts("引き分けです。puts("あなたの負けです。puts("あなたの勝ちです。*winner){printf("%sが勝ちました。){printf("%sと%sは負けました。%sと%sで勝負をします。*winner_v2);printf("%sは%sで、%sは%sです。(judge)break;puts("あいこなのでもう一度勝負をします。){printf("%sは負けました。%sと%sと%sで勝負をします。*winner_v3);printf("%sは%sで、%sは%sで、%sは%sです。(judge)break;puts("あいこなのでもう一度勝負をします。npc[2]);printf("Playerは%sで、NPC1は%sで、NPC2は%sで、NPC3は%sです。printf("引き分けです。6年前ソースコードに不要な関数があったため訂正いたします。「全員の出した手がグー、チョキ、パーのうち2種類だけならば勝負が付いた。それ以外ならばあいこ。」というロジックになっていないことが想像できます。いうわけで、まずは、勝負が付いたのかどうか(全員の出した手が2種類かどうか)を判定し、勝負が付いたのであれば「グーはチョキにに勝つ。パーはグーに勝つ」というジャンケンの大原則に基づいて勝者を判定すればよいと思います。バグのないプログラムはない。プログラムは思ったとおりには動かない。6年前ご回答ありがとうございます。break;という部分で実行しているつもりです。6年前boxさんの書かれた判定方法は、何人でじゃんけんするか関係ありません。じゃんけんの勝敗を判定する関数はひとつにまとめられます。6年前まあ確かに、勝敗を判定する関数は1個にまとめられそうな気がします。今の設計の考え方では破綻しそうです。バグのないプログラムはない。プログラムは思ったとおりには動かない。勝敗を判定する関数の仕様を1)初期値:全員あいこ2)全員の手が2種類かどうか判定3)2種類でなければそのまま戻る4)2種類のとき、4-1)グーとチョキに分かれていれば、グーに勝者フラグを立て、チョキに敗者フラグを立てる4-2)チョキとパーに分かれていれば、チョキに勝者フラグを立て、パーに敗者フラグを立てる4-3)パーとグーに分かれていれば、パーに勝者フラグを立て、グーに敗者フラグを立てるというような具合にすると、プレイヤーが2人以上何人であっても対応可能であるような気がします。勝敗を判定する関数から戻った時点では、1)全員あいこ2)勝者と敗者とに二分のいずれかになるはずです。バグのないプログラムはない。プログラムは思ったとおりには動かない。(引き分け)戻り値は10です。プレイヤーとNPC2が負けています。for_judge関数内部の処理は意図したものなのでしょうか。ジャンケンは以下の簡単なコードで二者の勝ち負けを判定できます私はSRPGの武器同士の相性を判定する三すくみでこのコードを使用しています。私が作るならばboxさんのおっしゃる通り最初にアイコの判定をしてから、あとは総当たりでこのコードで判定をして負けたキャラクタから生存フラグをバキバキ折って最後の一人が残るまで続けるように作ります。皆様、ご回答ありがとうございます。返信が遅くなり、申し訳ございません。皆様のご回答をもとにアルゴリズムを見直し、ソースコードを大幅に改変しました。ところが、新しいプログラムでも不具合が発生しており、現在原因を探っているところです。修正でき次第、フォーラムルールに則り改変後のソースコードを記そうと思っております。親切にご指導いただきまして、誠にありがとうございました。設計を見直すべきというのは同意ですが、デバッグの技術を高めることも重要です。次のようにjanken()を直接書き換えて、問題のあるパターンを検証する方法もあります。1;}ちょっと追いかけてみると、four_judge()の外側のswitch文にbreakがないことが判るでしょう。他にも問題があるかもしれませんが。6年前おっしゃるとおりです。デバッグ技術はもとより、アルゴリズム組み方その他の技術に関して、さらなる学習と訓練が必要であることを痛感しております。four_judge関数についてのご指摘、ありがとうございました。three_judge関数の内部も、同様にbreak文が欠落していたようです。これにより、間違った判定がされる不具合の原因がわかりました。}144行目からの、外側のcase(以下case外)2までを例に挙げると、引き分けであった場合はcase外1の内側のcase(以下case内)2が実行されて、break文により内側のswitch文を脱出します。外側のbreak文がないため外側のswitch文を脱出できず、case外2のcase内0にあるreturn文によって関数ごとswitch文を脱出するため、返却値が間違ったものとなるようです。four_judge関数内でthree_judge関数を使用しているため、さらにthree_judge関数内のbreak文の欠落も絡んできます。必要な場所にbreak文を加えたところ、正常に動作しました。つきましては、当問題は解決といたします。改変したプログラムについては、作成を続行します。ご回答いただいた皆様、ありがとうございました。皆様のご回答をもとに設計をしなおしたプログラムが完成しましたので、予告通り公開いたします。puts("引き分けです。n);printf("\n%d勝%d敗でした。n)printf("%sの勝ちです。n)printf("%sの勝ちです。hd[plyr[i]]);}printf("\bす。*winner){printf("%sが勝ちました。1]);printf("\bが負けました。1]);}printf("\bで勝負を続行します。ミクプラは自由にリンクできます。