トピック

この画面から

続きから「おもいだす」でロード、 初めから「すべてわすれる」でデータを最初から 始める事が出来るようにしないと… あとは「⇒」を 「おもいだす」と「すべてわすれる」 の所のみに移動出来るようにしないと… (このままだと上や下に行き過ぎてしまう…) その前にロードとかを先に… どうすればいいんですか?
0そうだね
プレイ済み
返信[1]
親投稿
ケイン KEIN.HORGAN
画像だけ表示されても、何をどう答えればいいのか(フランケンさんが分からなくて困っているところが)分からないですよ? とりあえずセーブやロードは難しいので、先にカーソルの問題を片付けちゃいたいと思いますが…… もうフランケンさんはIF文を使って条件判断が出来るはずですので、頑張ればすぐ直せますよ! > 上に行き過ぎて困る 上に行き過ぎるとはつまりどういうことか? それはつまり、「カーソルが選択肢より上の行に表示されてしまう」ということですよね? カーソルを表示する位置を指定しているのは、LOCATE 命令です。 (LOCATE 命令では、その直後のPRINT 命令で表示する文字の位置を指定します) つまり、LOCATE 命令で指定する数値を「上に行き過ぎないように」すればいいわけです。
0そうだね
プレイ済み
返信[2]
親投稿
何処のを変えればいいのか分からなくなって しまいました…(すみません…)
0そうだね
プレイ済み
返信[3]
親投稿
ケイン KEIN.HORGAN
うーん。えーと、47行目の @MOVE からのプログラムで何をしているのかは分かりますか? 具体的には、 LOCATE PX,PY ?" " LOCATE X,Y ?"→" の4行です。
0そうだね
プレイ済み
返信[4]
親投稿
あー…分かりません… (今の状態。)
0そうだね
プレイ済み
返信[5]
親投稿
ケイン KEIN.HORGAN
むむむ…… えーと、何が分からないかを言ってくれないとこちらも説明出来ないです。 説明書とヘルプを見て、そして何が分からないかを教えてくださいね。
0そうだね
プレイ済み
返信[6]
親投稿
この@MOVEが何の為にあるのかも まだよく分かりません…
0そうだね
プレイ済み
返信[7]
親投稿
ケイン KEIN.HORGAN
ああ、なるほど。 @MOVE というのは、「ラベル」という命令の一種で、これはいわゆる「目印」です。この目印は、GOSUB やGOTO 命令で使います。 普通は、プログラムは上から下へ1行ずつ実行されますが…… GOSUB やGOTO 命令を使うと、プログラムを実行する順番を変更できます。 このプログラムの場合、GOSUB @MOVE が実行されたら(35行目や40行目にありますよね?)、次の行を実行するのではなく、@MOVEの次の行から実行するようになります。 そして、GOSUB を使った場合、RETURN があるところまで実行して、元の行に戻るわけです。 ……この説明で分かりますか?
0そうだね
プレイ済み
返信[8]
親投稿
分かりました!説明ありがとうございます! (こんな感じになりました。)
0そうだね
プレイ済み
返信[9]
親投稿
ケイン KEIN.HORGAN
えーと、ちょっと惜しい? のかな? 新しく追加されている「+2」は、多分、下ボタンを押した時にカーソルがちゃんと下の選択肢まで移動するように加えたんだと思いますが、その状態だと上ボタンを押した時に上手く動かないような?
0そうだね
プレイ済み
返信[10]
親投稿
じゃあこうですか?
0そうだね
プレイ済み
返信[11]
親投稿
ケイン KEIN.HORGAN
お、いい感じになってるように見えます…… が、しかし、それでちゃんとなっているかどうかを判断するのはフランケンさんなので、「じゃあこうですか?」と言われても困るかなぁ…… それでフランケンさんの思う通りに動いていればそれでいいですし、 もし思った通りに動かない場合は、 「本当にやりたいこと」「だけど実際は○○な動きをしちゃう」 の二つを言ってくれないと分からないですしね。
1そうだね
プレイ済み
返信[12]
親投稿
動き的にはいいんですけど… 頑張っていじってみてるんですけど やっぱりこう上や下に行き過ぎる事が 出来てしまうんですよね…
0そうだね
プレイ済み
返信[13]
親投稿
ケイン KEIN.HORGAN
なるほど。 えーと、それでは話を戻しまして…… 結局、@MOVE 以降のプログラムで何をしているのかは分かりましたか? 分からない場合、ヘルプを見るなりして考えてみて、そしてそれでも分からないところがあったら、何が分からないかを教えてくださいね
0そうだね
プレイ済み
返信[14]
親投稿
あ、分かります!
0そうだね
プレイ済み
返信[15]
親投稿
ケイン KEIN.HORGAN
では、そこが分かったということは、どうしてカーソルが上や下に行き過ぎるのか分かりましたね? その原因を解消すればいいわけです。 そして、こういうときにIF 文を使うわけです。 IF もし○○なら THEN △△する ENDIF 「もし○○なら」というのは、普通は条件式を入れます。つまり Y>5 だとか、Y<10 だとか、そういう感じになります。 今作ってるプログラムにすでにあるIF文は、 BUTTON(2)==#UP だとかなっていますが、これはつまり「今押されたボタンが十字キーの上なら」という意味なんですね。
0そうだね
プレイ済み
返信[16]
親投稿
いじって試していたら 分からなくなってしまいました。 (やっぱり難しいですね…)
0そうだね
プレイ済み
返信[17]
親投稿
ケイン KEIN.HORGAN
えーと、あれ? もしかして、 「どうしてカーソルが上の方に表示されてしまうのか?」 については、分からないですか? LOCATE X,Y ?"→" が何をしているのかは分かったんですよね?
0そうだね
プレイ済み
返信[18]
親投稿
色々やっててごちゃごちゃに なってしまいましてね…
0そうだね
プレイ済み
返信[19]
親投稿
ケイン KEIN.HORGAN
ごちゃごちゃになった時は、一度元に戻してみるのもひとつの手です。 まずは、 49,50行目、53,54行目、57,58行目を削除してみてください。 その後…… えーと、 LOCATE PX,PY+3 LOCATE X,Y+3 この二行をどういうつもりで書いたのか、ここに説明してみてください。
0そうだね
プレイ済み
返信[20]
親投稿
LOCATE PX,PY+3 LOCATE X,Y+3 十字キーを押した時に次に表示する場所、 であってますよね?   (⇒) (説明ってこういう意味で良いんですよね?)
0そうだね
プレイ済み
返信[21]
親投稿
ケイン KEIN.HORGAN
あ、えーと、それはそれであっているんですが、それだと、プログラムの修正をする時に困ります。 例えば…… LOCATE PX,PY+3 この命令を実行すると、次にPRINT 命令をした時に、座標(PX,PY+3) の位置に表示をします と、こういうような理解が必要です。 そして、こうなった時に、「"PY+3"って、一体どういうつもりで指定したのかな?」となるわけです。 どうしてフランケンさんは、PY+3 としたのですか?
0そうだね
プレイ済み
返信[22]
親投稿
それは十字キーを押した時、移動すると 「⇒」が増えていっちゃうのでそれを 直そうかといじってたんですよ。           ⇒ おもいだす      ⇒すべてわすれる      ⇒      ⇒ (こんな感じに。 説明とか下手なんですよ…すみません。)
0そうだね
プレイ済み
返信[23]
親投稿
ケイン KEIN.HORGAN
あれ? えーと、よく思い出してみてください。 一番最初は、+3 をしなくてもカーソルは増えていなかったと思うのですが…… 試しに、LOCATE 命令の時のPY+3 とか、Y+3 とかを、ただのPYや Y にしてみてもらえますか?
0そうだね
プレイ済み
返信[24]
親投稿
確かに…これは Y=Y+3 Y=Y-3 にしてから増えていくから、 でしたっけ…
0そうだね
プレイ済み
返信[25]
親投稿
ケイン KEIN.HORGAN
とりあえず、どうしてカーソルが動くように見えるのか。ここから説明しましょうか。 そもそも「文字が動く」というのはどういうことか。 これは、 1.移動する前に表示してある文字を消す 2.移動先の座標に文字を新しく表示する ということなんです。 でも、「文字を消す」という命令は、プチコン(smile BASIC)にはないんですね。 だから、文字を消す代わりに、" "(空白文字です)で上書きしてあげるんです。 ここまで説明したら、さっきの「何故かカーソルが増えてしまった」という問題の原因も分かると思います。 どうしてだかわかりますか? ちょっと説明してみてもらえますか?
0そうだね
プレイ済み
返信[26]
親投稿
上書き出来てなかった、 という事ですか?
1そうだね
プレイ済み
返信[27]
親投稿
ケイン KEIN.HORGAN
その通りです! 移動前に表示していた文字を空白文字で上書き出来なかったから、カーソルが増えてしまったんです。 さて、これでカーソルが移動する仕組みについては分かったと思います。 そこで、ようやく「カーソルが変なところに移動しない為にはどうすればいいのか?」の話になるわけですが…… そもそも「カーソルが変なところに移動する」のは、どういう時に発生すると思いますか? LOCATE PX,PY ?" " LOCATE X,Y ?"→" この4行でカーソルの移動を行っているわけですが、X や Y がどんな時におかしな事になりますか?
0そうだね
プレイ済み
返信[28]
親投稿
うーん…分かりません…
0そうだね
プレイ済み
返信[29]
親投稿
ケイン KEIN.HORGAN
うーん。どう説明したら分かってもらえるのかなぁ…… えーと、じゃあ、次のようなプログラムを考えてみてください LOCATE 8,10 "メッセージ" LOCATE 5,Y ?"→" これで、"メッセージ"の左にカーソルを表示したいとします。 このとき、Y にはどんな値を入れればいいですか?
0そうだね
プレイ済み
返信[30]
親投稿
10 ですよね?
1そうだね
プレイ済み
返信[31]
親投稿
ケイン KEIN.HORGAN
そうですね! では、同じプログラムで…… Y=9だったら? Y=11だったら? Y=10の時にカーソルが正しい位置に表示されるわけですから、Yがそれ以外の時は正しい位置に表示されません。 このように、Yの値によってカーソルの表示される行が変化します。つまり、「カーソルが上や下に行き過ぎちゃう」というのは、Yの値がおかしいから発生する問題なのです。 さて、本題であるフランケンさんのプログラムでは、Yの値がどんな時におかしな事になりますか?
0そうだね
プレイ済み
返信[32]
親投稿
Y=17 の時ですかね…
0そうだね
プレイ済み
返信[33]
親投稿
ケイン KEIN.HORGAN
あれ、49行目と51行目が、また+3 されていますが、これはどうしてこういうふうにしたんですか? (ここがずれていると、またおかしな事になると思いますが……)
0そうだね
プレイ済み
返信[34]
親投稿
失敗してロードした時に消すのを 忘れてたんだと思います。 (多分。)
0そうだね
プレイ済み
返信[35]
親投稿
ケイン KEIN.HORGAN
なるほど…… さて、ではフランケンさんの予想のY=17 の時にどうなるか、ですが…… こういう時には、直接プログラムをいじってしまうのが確認するには分かりやすいです。 51行目を、 LOCATE X,17 と一時的に直してみて、そしてプログラムを実行してみて下さい。 どうなりましたか? カーソルは変なところに表示されますか?
0そうだね
プレイ済み
返信[36]
親投稿
こうなりました! (移動したら左の方に表示されました。)
0そうだね
プレイ済み
返信[37]
親投稿
ケイン KEIN.HORGAN
これはまた予想外な結果に…… えーと、今まではカーソルは上下に行き過ぎるだけで、それ以外は普通に動いていたんですよね? そうだとすると、何か変なところをいじってしまってこうなったと思うのですが…… そもそも、どうしてカーソルがこんなところに表示されてしまうかは分かりますか? (今まで勉強した事を思い出せば、分かるとは思います!)
0そうだね
プレイ済み
返信[38]
親投稿
Xをいじったから… 横に表示するよう命令したから、 ですかね? (一応、X,Y を元に戻しました!)
1そうだね
プレイ済み
返信[39]
親投稿
ケイン KEIN.HORGAN
そうですね! 表示したカーソルの位置がずれる、ということは、つまりPRINT 命令をする前に実行したLOCATE 命令で何かやらかした、という事になります。 X座標は横方向、Y座標は縦方向の事なので…… おそらく、Xをいじってしまったので横方向にずれてしまったのでしょう。 と、それはさておき。 さっきの画像をみる限り、Y=17 は(カーソルの表示される高さとしては)特に問題はないみたいでしたね。 では、改めて…… カーソルの表示される高さがおかしくなるのは、Yの値がどんな時になるか考えてみてください。 「○○より大きい時におかしくなる」とか、そういう条件が出てきませんか?
0そうだね
プレイ済み
返信[40]
親投稿
なかなか出てきません… (今の状態。)
0そうだね
プレイ済み
返信[41]
親投稿
ケイン KEIN.HORGAN
えーと、じゃあ試しに、 51行目のYの値をいろいろと変えて試してみてください。 例えば、 LOCATE X,1 とか、 LOCATE X,10 とか、 LOCATE X,17 とか、 LOCATE X,20 とか、 LOCATE X,23 とか、こういう感じに。 いろいろ数値を変えて試してみたらどうなりますか?
0そうだね
プレイ済み
返信[42]
親投稿
1~29まで変えてみました! 17~20が惜しかったのかなと思いましたが… (17は十字キーを押しても おもいだす から移動しなくなってしまい、 20は おもいだす から すべてわすれる へ移動したあと動かなくなる。でした。)
1そうだね
プレイ済み
返信[43]
親投稿
ケイン KEIN.HORGAN
おお、がんばりしたね! プログラムがわかっていれば、どうして動かなくなるか、も分かるとは思いますが、とりあえず大事なのは、カーソルがおかしな位置に移動してしまった時のYの値です。 LOCATE命令を実行する時、その値を使わないようにすればいいのです!
0そうだね
プレイ済み
返信[44]
親投稿
なるほど…
0そうだね
プレイ済み
返信[45]
親投稿
ケイン KEIN.HORGAN
なるほど、とレスが来るという事は、思い付いていないのかな。 Yの値がおかしい時はその値は使わない、とは、言い換えれば、『もし、Yの値がおかしければ、その値は使わない』という事です。 もし、と言うのは、IF を使えばできるので、考えてみて下さい!
0そうだね
プレイ済み
返信[46]
親投稿
あのー…どこら辺に IF を書けばいいでしょうか? (すみません…)
0そうだね
プレイ済み
返信[47]
親投稿
ケイン KEIN.HORGAN
考え方は二つあります。 1.Yの値を変化させる前にチェックして、おかしな値にしないようにする 2.カーソルを移動させる時にYの値をチェックして、おかしな値だったら修正する どっちでもいいですが、好きな方を選んで下さい
0そうだね
プレイ済み
返信[48]
親投稿
2の方ですかね…?
0そうだね
プレイ済み
返信[49]
親投稿
ケイン KEIN.HORGAN
なるほど。 それでしたら、@MOVE の次の行あたりからIFを書けばいいと思います。 IFの書き方は覚えてますか? もし忘れてしまっていたら、このトピックで説明しましたので、読み返してみて下さい
0そうだね
プレイ済み
返信[50]
親投稿
こんな感じであってますか? (なんとなく16)
1そうだね
プレイ済み
返信[51]
親投稿
ケイン KEIN.HORGAN
そんな感じですね! Yの条件はよく考える必要がありますが、とりあえず次は、IFの行とTHENの行との間に、Yの値を正しい値に直す文をかけばいいですね
0そうだね
プレイ済み
返信[52]
親投稿
色々試してみましたけど 変わっているのかが分からない…
0そうだね
プレイ済み
返信[53]
親投稿
ケイン KEIN.HORGAN
いや、うん、それでは何にも変わらないですね。 Yの値を正しい値に直す文を書かないと! ……えっと、分からない事があったら、『○○が分かりません』と言って下さいね。 ただ分からない、と言われても、どう説明したらいいのか分からないので。
0そうだね
プレイ済み
返信[54]
親投稿
正しい値に直す文ですか…
0そうだね
プレイ済み
返信[55]
親投稿
ケイン KEIN.HORGAN
うーん。まずそもそも 『Yの値を直す』 と言うのがどういう意味か分かりますか? と、もうラスコメなので、続きはまた次にしましょう。
0そうだね
プレイ済み
返信[56]
親投稿
はい… (分かりました、では今日はそろそろ寝ます!)
0そうだね
プレイ済み