HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0818
ももrepeat〜loopについて6解決


もも

リンク

2021/8/18(Wed) 14:50:32|NO.93611

下記のコードを書いたところ、
エラー11で、「repeat外でのloopは無効です」
と出てきました。

dialog "足し算の問題です。"
repeat 3
randomize
a=rnd(10)
b=rnd(10)
dialog str(a)+"+"+str(b)+"は?" 
c=a+b
dialog "回答を入力してください。"
input kazu
button "OK",*handan
stop
*handan
if kazu=c: dialog "正解です。"
if kazu!c: dialog "不正解です。正解は、"+c+"です。"
loop
button "終了",*owari
*owari
mmload "close.wav",0,0
mmplay 0
wait 270
end

*handanの前にstopを書かないと、入力ボックスに入力できずに不正解とみなされてしまいます。
3問続けて出題したいのでrepeatを使用したのですが、stopがあると使えないので、どのように書けば指定した回数出題できるのでしょうか。



この記事に返信する


沢渡

リンク

2021/8/18(Wed) 16:43:01|NO.93612

エラーが出るのは、3回回答して「終了」が出てきた状態で、
さらに「OK」を押した時でしょうか?
現状だと「OK」を押すとループ外からループ内にジャンプしてしまうので、
3回回答したら入力欄と「OK」ボタンを消すようにすると良いでしょう。

dialog "足し算の問題です。" randomize //randomizeは1回だけ実行すればよい input kazu : i_id=stat //入力欄はclrobjやclsを実行するまでは残るので、1回だけ実行すればよい。 //ただし、内容の書き換えを行うので、IDを記憶しておく button gosub "OK",*handan //buttonも一回だけ実行すればよい。 repeat 3 a=rnd(10) b=rnd(10) dialog str(a)+"+"+str(b)+"は?"  c=a+b dialog "回答を入力してください。" objprm i_id,0 //入力欄をリセット objsel i_id //入力欄にフォーカスが合った状態にする stop *handan if kazu=c: dialog "正解です。" if kazu!c: dialog "不正解です。正解は、"+c+"です。" loop clrobj //入力欄と「OK」ボタンを削除 pos 0,0 : button "終了",*owari stop *owari clrobj //終了ボタンを削除 mmload "close.wav",0,0 mmplay 0 wait 270 end



雪月夜

リンク

2021/8/18(Wed) 18:54:54|NO.93617

沢渡さんの方法でもいいですが、一応書いたのでこちらも載せときます
以下は無限ループとフラグ変数を用いて擬似的なstop処理を実装したコードです
元のコードから変更した箇所にコメントを追記しました


dialog "足し算の問題です。" randomize ;randomizeは1回だけ実行すればよい repeat 3 a=rnd(10) b=rnd(10) dialog str(a)+"+"+str(b)+"は?"  c=a+b dialog "回答を入力してください。" input kazu button gosub "OK",*handan ;サブルーチンジャンプ化 gosub *clickwait ;ボタン押下待機処理 loop button "終了",*owari stop *handan ;ラベルをループの外に記述 if kazu=c: dialog "正解です。" if kazu!c: dialog "不正解です。正解は、"+c+"です。" flg=1 ;フラグ変数設定 return *owari mmload "close.wav",0,0 mmplay 0 wait 270 end *clickwait flg=0 ;フラグ変数初期化 repeat if flg:break ;フラグ変数が設定されていたら待機処理終了 await 16 loop return



UT-X

リンク

2021/8/18(Wed) 19:09:04|NO.93618

先に回答した2人とは別の方法で実装してみました。
こちらはラベルとフラグ変数でrepeat〜loopを疑似的に再現しています。
また、サブルーチンを使っていません。
dialog "足し算の問題です。"
randomize ;randomizeは1回だけ q=3 ;この変数が問題数になる *mondai cls ;入力欄とボタンが複数表示されないように a=rnd(10) b=rnd(10) dialog str(a)+"+"+str(b)+"は?"  c=a+b dialog "回答を入力してください。" input kazu button "OK",*handan stop *handan if kazu=c: dialog "正解です。" if kazu!c: dialog "不正解です。正解は、"+c+"です。" q- ;1問終了したので1減らす if q>0:goto *mondai ;まだあるなら再び問題を開始 button "終了",*owari stop *owari mmload "close.wav",0,0 mmplay 0 wait 270 end



もも

リンク

2021/8/18(Wed) 19:40:20|NO.93619

みなさんありがとうございます!いろいろな書き方があるのですね。
知らないことがいろいろあったので勉強したいと思います。
大変参考になります。本当にありがとうございました!



沢渡

リンク

2021/8/25(Wed) 18:30:52|NO.93684

申し訳ありません。今さらですが、私の投稿したNo.93612には致命的なミスがあります。
上の方にある

button gosub "OK",*handan
はreturnで戻るわけでもないのにgosubを使うという「やってはいけないこと」を
やっている上、かといってこれを

button goto "OK",*handan
に直すと、今度は「goto系の割り込みはループもサブルーチンネストも全てリセットする」
という、HSPの中でも屈指の意味不明な仕様のせいで、エラー11になります。
(そもそも質問者さんのコードも、今試したらこれが原因のせいでOKを押しただけでエラーに
 なりまして……私は何を勘違いしていたのでしょうか)

というわけで、NO.93612は悪い例ですので参考にしないでください。
私が今から組むのなら、雪月夜さんのようなコードにすると思います。



もも

リンク

2021/8/27(Fri) 00:41:50|NO.93700

沢渡さん、ありがとうございます!



ONION software Copyright 1997-2023(c) All rights reserved.