- ベストアンサー
プロシージャを越えて戻る?
- 研修課題として、「じゃんけん」のプログラム作成に取り組んでいるのですが、「初期化(?)」ができずに悩んでいます。
- プログラムの流れは、コンピュータの手を決定する(乱数発生を利用して)、プレーヤーの手を決定する(ラジオボタンで選択)、勝敗の判断、そして続行するかどうかの尋ねです。
- しかし、「戻る」がうまくいかず、どうすれば正解なのかわかりません。反復処理やプロシージャ間の処理が不可能なのか、ご教授ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
VBはVB6.0系(VBA含む)かVB.NET(VB2005等)かで かなり違います。しがし、フォームプログラムの ようですので、考え方を述べます。 ★Windowsのプログラムはイベントドリブンです。 つまり、プログラムが主導権を持って動作するのでは なく、ボタンのクリックとか、マウスの通過などの イベント毎に処理します。だから(1)~(4)を能動的に 考えることが間違いです。 初期状態 ・ラジオボタンは未選択 ・com手決定のボタンはDisable 以上を前提とすると、以下のように考えます。 (1)ラジオボタンのクリック時イベント ここで始めてプレーヤーの手が決まるので、 これ以降はcom手決定のボタンをEnableにします。 (2)com手決定のボタンのクリック時イベント この動作で勝負開始です。この時にPC側の手を 決めても遅くありません。 (A)PCの手を決める (B)勝敗を判定する (C)結果を表示する (D)MsgBoxで続行するかどうかを尋ねる (E)辞める場合は自画面を閉じる (F)継続時はラジオボタンを全て未選択にし、 com手決定のボタンをDisableにする。 繰り返しますが、自分でループだの何だのを考えるの ではありません。そういうのはWindowsに任せます。 あくまでユーザの操作により発生したイベントにより 動作するのです。
その他の回答 (3)
No.1の者です。 …あぁ、やっとおっしゃっている意味がわかりました。 Subなり、Functionなりのモジュール(昔で言うならサブルーチン) 2個の「中身間で」またいだLoop文が書けない? そういうことですか? たとえば。 Private Sub サブモジュール1() なんたら Do End Sub Private Sub サブモジュール2() かんたら Loop End Sub Private Sub Main() 'ここが走る Call サブモジュール1 Call サブモジュール2 '実はループ End Sub という仕組みですかね? これはできないお約束になっています。 できちゃうと、プログラムの可読難易度がとても上がって、作った人しかメンテが できません。仕様上無理になっています。 あなたのおっしゃる理想のプログラム行の構成。 それは、あなたの質問中にもうできているんですよ。 これ。 (1)コンピュータの手を決定する。(乱数発生を利用して) (2)プレーヤーの手を決定する。(ラジオボタンで選択) (3)勝敗の判断をする。 (4)続行するかどうかを尋ね(メッセージBoxにて)、「はい」ならば(1)に戻る。 この日本語の構造がそっくりプログラムになっていればいいのです。 するととてもわかりやすい。 つまり、全体はばっくりこんな感じでしょうか? Sub Main() Do Call ComPlayerDecideGuChokiPa() Call WaitUserGuChokiPa() if CheckWinner() = UserWin Then あんたのかち Else あんたのまけ End if if Msg("もう一回する?") = No Then Exit Do End if Loop End Sub あとは各関数に、「画面表示し、入力を受け取り入力後閉じる窓」を 実装すればいいんです。 オブジェクト指向になると、もうちょっと見た目は変わりますが。 基本はこの流れかと。 なので、関数内でLoopさせるということはおかしいわけです。 基本は1関数内で、ループが簡潔に終わる必要があります。
お礼
なるほど、イベントドリブン方式なのに 機能全体をループさせようとしたのがそもそもの間違いでした。。 回答ありがとうございました。参考にさせていただきます。
- imogasi
- ベストアンサー率27% (4737/17069)
質問者が考えていることが、見当ハズレと思う。 学び初めで、いろんなことを勉強してないのに、我流で疑問点を作っていると思う。 質問者は頭の良いタイプだと思うが、学習に、災いする場合もありそう。 >皆様のご教授をお・・、ではなく、教授がいるでしょう。なぜ先生に聞かないのか。 >やはりプロシージャをまたいでのDo~loop処理は出来ませんでした。 ゲームを何回か繰り返すのかやめるのは、人間の意志で決るように普通は設計する。ボタンをクリックして開始したら1回のじゃんけん勝負を処理して、そこでユーザー側は永久停止してしまうか、くリ返すか聞く設計にする(そういう終了・続行ボタンを普通は設ける)。 その後ボタンを押されたかどうかは、(プログラムの起動中は)言語システム(その底にはOSの機能がある。Basic時代は(高度な知識が無いと)普通にはそういう処理は出来なかった)が見張り、そのボタンを押されたらクリックイベントとしてユーザープログラムにコントロール(実行権)を渡してくれる。 勿論ゲームの内容によっては、2回目以後の処理は、1回目と関係付けたものもある(例 獲得得点 合計)し、初期化が必要なものもあると思うが、本件では「コンピューターの手を決める」のがそれに当たり、他の初期化(=変数の初期化)ことを考える必要はなさそう。 イベント内での変数の値は、値の「スコープ」という考えがあるので、それとの関連で別途勉強することになるだろう。 むしろ次の回に、前の処理の何らかの結果を引き継ぐほうが、必要になる場合が多く、それは1課題だ。 ーーー このゲームを何千回と無くコンピュタで実行して、勝敗結果の偏りが無いことなどの納得などを行うことはありえると思うが、それは別の話。 ーー こういう1回分が画面との対話で処理するゲーム(が完成しているとして)などを、多数回自動実行するプログラムは、初心者のやる領分ではない。
お礼
遅くなり申しあけありません。 当方学生ではなく、社会人1年目です。 指導役の先輩社員がおり、その方からの出題でした。 なので、そう頻繁に質問することもできず、という状態でした。 回答、参考にさせていただきます。
Do If ゲーム終わり then exit do loop じゃだめですか? ゲームは巨大なループで作ります。
お礼
ご回答ありがとうございます。 やはりプロシージャをまたいでのDo~loop処理は出来ませんでした。
お礼
遅くなり申し訳ありません。 ありがとうございました。