プチコン3号ではセレクトボタンも無いはずだけど。
セレクトボタン押したら、プログラム止まるし
1そうだね プレイ済み
「プチコンで横スクロールシューティングゲーム」上田パソコンクラブ
http://www.white.umic.jp/pc/files/petitcom-shootr-text1.pdf
http://www.white.umic.jp/pc/files/petitcom-shootr-text2.pdf
http://www.white.umic.jp/pc/files/petitcom-shootr-text3.pdf
http://www.white.umic.jp/pc/files/petitcom-shootr-text4.pdf
https://www.youtube.com/watch?v=eld4Wg0PsCk
1そうだね プレイ済み
BGMSTOP [track[,fadetime]]
track:BGMトラック番号(0~7)
fadetime:フェイドアウト秒数(省略時:0)
0そうだね プレイ済み
再帰呼び出しでは、終了条件を正しく判定しないと無限に再帰呼び出ししてしまい、メモリが不足してエラーになる。
(実は命令・関数・サブルーチン呼び出しはメモリを消費するため、帰ってこないとメモリが開放されないのだ。)
自作命令・関数はレトロなBASICではほぼ作れなかったが、現在、殆どのプログラム言語で使用できるため、VBやSMILE BASICでも使えるのだ。
1そうだね プレイ済み
自作命令・関数からネストして自作命令・関数を呼び出すこともできる。
自作命令から、自分自身の関数を呼び出すことも当然できる。
これを再帰呼び出し(リカーシブコール)と呼ぶ。
COUNT_DOWN 10 '自作命令呼び出し
DEF COUNT_DOWN CNT '←カウントダウン表示命令
VSYNC 60 '←1秒くらい待つ
? CNT '←カウント表示
IF CNT>0 THEN '←カウントが0より大きければ
CNT = CNT -1 '←カウンデウン
COUNT_DOWN CNT '←再帰呼び出し
ENDIF
END
1そうだね プレイ済み
この場合、自作命令を呼んだとき変数X,Yが書き換わってしまい
LOCATE X,Yが正しく実行できずエラーになってしまう。
こんなことにならないために、自作命令・関数内で変数を使う場合はローカル変数を作り、それを使う。
A=1:B=2
SETA:SETB
? A,B
DEF SETA
A=10 '←呼び出し元の変数Aを壊してしまう
END
DEF SETB
VAR B '←ローカル変数Bを宣言
B=20 '←ローカル変数Bを変更しても呼び出し元の変数Bは変わらない
END
これを実行すると
10 2
と表示される
1そうだね プレイ済み
命令を自作できるなら関数も自作できる。
DEF~ENDの組み合わせで、関数名の後ろに括弧を書き、引数がある場合、括弧の中に書く。
関数は戻り値があるのでRETURNの戻り値を書く
DEF IS_ODD(VALUE) '自作関数 奇数判定
RETURN VALUE AND 1 '←引数が奇数なら1、偶数なら0を返す
END
'↑自作関数、自作命令は処理の前に書くこともできる、この場合、呼び出すまで中身は実行されない
? IS_ODD(5) '自作関数の戻り値を表示している
? IS_ODD(10)
1そうだね プレイ済み
LPRINT 10,5,"まほっ" '←自作命令LPRINT
LPRINT 10,6,"プログラミング言語全てわかるマン"
LPRINT 10,7,"舛添要一の朝までファミコン"
END '←プログラムの終了
DEF LPRINT X,Y,P$ '自作命令
LOCATE X,Y:? P$
END '←自作命令の終わりで、コール元に戻る
1そうだね プレイ済み
↑このサブルーチンを使うには、事前に変数をセットしないといけないので面倒だ。
そんな時は、自作の命令があれば便利だ。
自作命令はDEF~ENDの組み合わせで書く
命令に引き渡す引数がある場合は、命令名の後ろに書く
DEF 命令名 [引数1][,引数2][,引数3]・・・
命令の処理
END
1そうだね プレイ済み
特定の決まった処理(ルーチン)を、プログラムの複数箇所から呼び出せると便利なことがある。
そんな時はサブルーチンを使う。
サブルーチンはGOSUB命令で呼び出し、サブルーチンの最後に書くRETURN命令で、呼び出し元の次の命令に戻ってくる。
X=10:Y=5:P$="こうげき":GOSUB @LPRINT
X=10:Y=6:P$="にげなきゃだめだ":GOSUB @LPRINT
X=10:Y=7:P$="おかねだいじに":GOSUB @LPRINT
END '←プログラム終了
@LPRINT
LOCATE X,Y:? P$
RETURN
1そうだね プレイ済み
GOTO命令は多用すると、処理が複雑になり理解し難いプログラムとなる、
それをスパゲティーコードと呼び嫌われている、GOTO命令は最小限に留めるべきだ。
使うのは、例えばメインループの繰り返しや、ネストしたループ処理の内側から一気にループ外に飛び出すときくらいだ。
1そうだね プレイ済み
GOTO命令で実行位置をジャンプできる。
GOTOを使うには、ジャンプ先にラベルを記述する必要がある。
ラベルは@(アットマーク)で始まる英数字と_(アンダーバー)で記述できる。
ラベル自体は何も処理されない、場所を示すだけ。
@LOOP '←ジャンプ先のラベル
INPUT A$ '←ユーザーに喋らせる言葉をキーボード入力させる
TALK A$:? A$ '←A$を喋らせ、表示する
IF A$!="" THEN @LOOP '←A$が空じゃなければ@LOOPにジャンプする
↑THENとGOTOが連続する場合どちらかを省略できる。
1そうだね プレイ済み
REPEAT
VSYNC '←処理が速過ぎるので1/60秒の表示更新まで待つ
B = BUTTON() '←ユーザーの押したボタン情報を変数Bに取得
IF B==0 THEN CONTINUE '←何も押されて無ければループ評価に戻る
IF B==#UP THEN ?"↑" '←上が押されたら「↑」を表示
IF B==#DOWN THEN ?"↓" '←下が押されたら「↓」を表示
IF B==#LEFT THEN ?"←" '←左が押されたら「←」を表示
IF B==#RIGHT THEN ?"→" '←右が押されたら「→」を表示
UNTIL B==#A '(A)ボタンが押されたらループを抜ける
1そうだね プレイ済み
これらループはネストできる。
ループ内でCONTINUE命令により、すぐループの条件式評価に戻る。
(FOR~NEXTの場合は、変数がカウントアップ/ダウンされた後、ループを抜けるか評価される)
ループ内でBREAK命令により、すぐさまループを抜ける。
1そうだね プレイ済み
REPEAT
ループ処理
UNTIL 条件式
REPEAT~UNTILは後判定型のループで、UNTILまで処理が進むと条件式が評価され、条件が偽である間ループします。
ループするとREPEATに戻り、ループ処理を行います。
注意しなければならないのは、UNTILのループする条件がWHILEとは真偽逆であることです。
REPEAT
INPUT A$ '←ユーザーに喋らせる言葉をキーボード入力させる
TALK A$:? A$ '←A$を喋らせ、表示する
UNTIL A$=="" 'A$が空ならループを抜ける
1そうだね プレイ済み
WHILE 条件式
ループ処理
WEND
WHILE~WENDは前判定型のループで、ループに入る前に条件式が判定され、条件が真である間ループします。
WENDまで処理が進むと再びWHILEの条件式の評価に戻ります、条件が偽になるとループの中は処理されずWENDの次に進みます。
A$="はい、マイケル"
WHILE A$!="" '←文字列も比較できる、A$が空でなければループ処理に入る
TALK A$:? A$ '←A$を喋らせ、表示する
INPUT A$ '←ユーザーに喋らせる言葉をキーボード入力させる
WEND
1そうだね プレイ済み
ループ命令でFOR~NEXTは、最初に決まった数だけループするには良いのですが、
ループ回数が判らない場合には、どうすれば良いのでしょうか。
その場合、WHILE~WENDや、REPEAT~UNTILを使うと良いでしょう。
それぞれ使用に適した使い方があります。
WHILE~WENDの特徴は前判定型のループであるため、ループ処理の最低実行回数は0回、つまり条件に依っては1度もループ内に入らず次の処理に抜ける場合もあるということです。
REPEAT~UNTILの特徴は後判定型のループであるため、必ず1度はループに入ります。
1そうだね プレイ済み
文字列と文字列を結合できる。
A$="A"
B$="B"
C$=A$+B$ '←"A"+"B"で結合され、
? C$ '←変数C$は"AB"となる。
SMILE BASICでは、文字列を掛け算すると、複数複製できる。
TALK A$*3 '←"A"を3回複製し"AAA"になる。
TALK命令は、引き渡した文字列を、プチコンが話してくれるので「エエエー」と喋る。
1そうだね プレイ済み