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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0107
おにぎりreturn と dialog の stat値5解決


おにぎり

リンク

2018/1/7(Sun) 20:10:53|NO.82209

returnの戻り値がわからなくて、return命令とdialog命令の併用が出来ないのですが、どうしたらいいいでしょうか?


sx=648 : sy=480 screen 0,sx,sy sketa=0 kketa=0 *home ppp=1 gosub *suujigimeiti //1p数字を決める gosub *kakunin   //1p数字の確認 ppp=2 gosub *suujigimeiti //2p数字を決める     gosub *kakunin //2p数字の確認 stop //-------------------------------------------- //サブなルーチン //-------------------------------------------- *suujigimeiti color 255,255,255 : boxf if(stat!1){sketa+=1} color : font msgothic,20 : pos 100,10 mes ""+sketa+"つ目の数字を選んでください" goto *suujibotan *suujigimeni clrobj 0,8 dialog "あなたの"+sketa+"桁目の数字は"+kketa+"でよろしいですか?",2 if(stat=7){ dialog "では戻ります",0 goto *suujigimeiti } if(stat=6){ if(sketa=1){numiti=kketa} if(sketa=2){numni=kketa} if(sketa=3){numsan=kketa} } if(sketa=3){return} goto *suujigimeiti *kakunin dialog "あなたの数字は"+numiti+""+numni+""+numsan+"でよろしいですか?",2 if(stat=7){ sketa=0 goto *suujigimeiti } if(stat=6 and ppp=1){ pnum=numiti*100+numni*10+numsan } if(stat=6 and ppp=2){ ppnum=numiti*100+numni*10+numsan } return //------------------------------------- //サブサブなルーチン //------------------------------------- *suujibotan//数字のボタンを表示。数字決めのときに使用 objsize sx/9,sy/9 pos sx/9*2,sy/10*5 button "1" ,*iti : button "4" ,*yon : button "7" ,*nana pos sx/9*3,sy/10*5 button "2" ,*ni : button "5" ,*go : button "8",*hati pos sx/9*4,sy/10*5 button "3" ,*san : button "6" ,*roku : button "9" ,*kyuu stop *iti kketa=1 : goto *suujigimeni *ni kketa=2 : goto *suujigimeni *san kketa=3 : goto *suujigimeni *yon kketa=4 : goto *suujigimeni *go kketa=5 : goto *suujigimeni *roku kketa=6 : goto *suujigimeni *nana kketa=7 : goto *suujigimeni *hati kketa=8 : goto *suujigimeni *kyuu kketa=9 : goto *suujigimeni

↑数字を当てるゲームのようなものを作ろうとしていて、その数字を決める部分です



この記事に返信する


あまら

リンク

2018/1/7(Sun) 21:23:10|NO.82210

これは初めて知りましたが、
gosubのあとgotoをするとreturnが使えなくなるという事ですね
// これはエラーになります
gosub *one *one goto *two *two return

ほとんどがgotoとstopで処理しているようなので、
最初もgotoで飛んで、戻る時もgotoを使った方が理解しやすいのではないでしょうか。

個人的な意見としては、stopで止めてボタンでジャンプするような
(いつ割り込み処理が入るかわからない)状況でgosubはあまり使いたくないですね。
下手するとネストが深すぎるとエラーが出る可能性もありますから。

ボタンのジャンプで少し気になったので
こんな方法もあるよという程度で参考にしてください。
	sx=648 : sy=480
screen 0,sx,sy dim nums, 3; count = 0; *suujibotan//数字のボタンを表示。数字決めのときに使用 objsize sx/9,sy/9 pos sx/9*2,sy/10*5 button goto "1", *selected: btn_id1 = stat; button goto "4", *selected: btn_id4 = stat; button goto "7", *selected: btn_id7 = stat; pos sx/9*3,sy/10*5 button goto "2", *selected: btn_id2 = stat; button goto "5", *selected: btn_id5 = stat; button goto "8", *selected: btn_id8 = stat; pos sx/9*4,sy/10*5 button goto "3", *selected: btn_id3 = stat; button goto "6", *selected: btn_id6 = stat; button goto "9", *selected: btn_id9 = stat; stop *selected pused_id = stat; switch pused_id case btn_id1 kketa = 1; swbreak; case btn_id2 kketa = 2; swbreak; case btn_id3 kketa = 3; swbreak; case btn_id4 kketa = 4; swbreak; case btn_id5 kketa = 5; swbreak; case btn_id6 kketa = 6; swbreak; case btn_id7 kketa = 7; swbreak; case btn_id8 kketa = 8; swbreak; case btn_id9 kketa = 9; swend *kekka nums(count) = kketa; count++; clrobj; dialog ""+count+"度目にあなたの選んだ数字は "+kketa+" です", 0; if( count == 3 ) { // 3回選んだ goto *last; } else { goto *suujibotan; } *last pos 0, 0; mes "あなたの選んだ数字は "+nums(0)+" : "+nums(1)+" : "+nums(2)+" です。"; stop



ppp

リンク

2018/1/7(Sun) 22:08:42|NO.82211

その書き方だとサブルーチン内でgotoが使えないような誤解が生じるんだけども。

a=1 gosub *one stop *one goto *two *two a=0 return
こうするとエラーは出ないよ。
stopもendもないからgosubのあと下まで処理が行って何もないのにreturnされてる状態になってるだけ。



ぜーっと!

リンク

2018/1/7(Sun) 22:23:40|NO.82212

あまらさんの組み方、スマートやねえ(*´ω`*)
;が文末についていて、他の言語のクセが出ててニヤリ。

基本、gosubで飛んだ先では、短時間で return を使い戻るということを心掛ける必要があるかも。


一応、あまらさんのサンプルの一部補足を勝手にしておきます。(^^;

ボタンを設置すると、stat にオブジェクトIDが返ってきます。
おにぎりさんの最後の部分を抜いてきました。これだけを新規作成して実行してみてください。

sx=648 : sy=480 screen 0,sx,sy title "button を設置すると、statにオブジェクトIDが返ってきます。" //*suujibotan//数字のボタンを表示。数字決めのときに使用 objsize sx/9,sy/9 pos sx/9*2,sy/10*5 button "1" ,*iti :title ""+stat:wait 200 button "4" ,*yon :title ""+stat:wait 200 button "7" ,*nana:title ""+stat:wait 200 pos sx/9*3,sy/10*5 button "2" ,*ni :title ""+stat:wait 200 button "5" ,*go :title ""+stat:wait 200 button "8",*hati:title ""+stat:wait 200 pos sx/9*4,sy/10*5 button "3" ,*san :title ""+stat:wait 200 button "6" ,*roku :title ""+stat:wait 200 button "9" ,*kyuu :title ""+stat:wait 200 stop *iti //kketa=0 : goto *suujigimeni *ni //kketa=0 : goto *suujigimeni *san //kketa=0 : goto *suujigimeni *yon //kketa=0 : goto *suujigimeni *go //kketa=0 : goto *suujigimeni *roku //kketa=0 : goto *suujigimeni *nana //kketa=0 : goto *suujigimeni *hati //kketa=0 : goto *suujigimeni *kyuu //kketa=0 : goto *suujigimeni title "オブジェクトID(並べた順番):"+stat+"番が押されました。" stop

ボタンを押したときのラベルはそのままですが、どこに飛んでも最終行のstopに来ます。
ボタンを押したら、タイトルの部分に、番号が出ると思います。

ボタン設置の順番の関係で、表示の番号と数値が違いますが、順番と表示番号を合わしてあげれば
stat の数値を見るだけで、どのボタンが押されたかがわかるのです。
そのため、あまらさんのサンプルにあるように、ボタンにあるラベル名はすべて同じでもOKなのです。



あまら

リンク

2018/1/7(Sun) 23:42:26|NO.82213

> stopもendもないからgosubのあと下まで処理が行って何もないのにreturnされてる状態になってるだけ。
なんという勘違い&凡ミス……
pppさん指摘ありがとうございます。

正確にはサブルーチンにstopが入るとreturn出来なくなるんですね。
// これこそがエラーの原因であってほしい
gosub *one stop *one button goto "test", *two; stop *two return


ぜーっと!さん解説ありがとうございます。
> ;が文末についていて、他の言語のクセが出ててニヤリ。
やはりわかりますよね
文末に何も無いと落ち着かなくてつい^^;



おにぎり

リンク

2018/1/8(Mon) 00:04:28|NO.82214

あまら様、ppp様、ぜーっと!様、質問した日に解答して頂き本当にありがとうございます。
感動して鼻血が吹き出し、一つのキーボードが使えなくなりました(泣)。

サブルーチンにstopが入るとreturnが使えなくなることを、恥ずかしながら初めて知りました。
buttonの運用には気をつけたいと思います。

statの使い方もありがとうございます。
一応、今回はstatえお活用していきたいなーと考えてます。

ありがとうございました。ペコリ。



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