BASIC - 1行プログラム・ゲーム

ポケコンのBASICの1行だけを使ってどこまで作りこむか!それが1行プログラムの面白さです。
ポケコンはメモリが小さいので短いプログラムを書くことはメモリ節約になります。
それから、やりこみ要素も結構あって、1行でこんな面白いゲームが作れた!とか、新しいアルゴリズムを思いついた!とか・・・遊びにも勉強にも役に立ちます。
1行にはスペースも含めて253文字しか入力できません。1行プログラムはこの狭いスペースへの挑戦なのです!

ここでは自作の1行プログラムを公開しています。ちょこちょこと打ち込んで楽しんでみてください。

注意:ウェイト用(スピード調節)にBEEP命令を使っています。ビープ音がなる状態で実行すると、不快な音が鳴る可能性がありますので、音が鳴らないことを確かめてから実行してください。

スロット

1 CLS :CLEAR :DIM A(2),B(3):FOR J=0 TO 2:A(J)= RND 6-1:NEXT :WHILE D<3:LOCATE 0,0:FOR J=0 TO 2:A(J)=(A(J)+1-B(J+1)) MOD 6:PRINT MID$ ("$*+&",A(J)+1,1);:NEXT :C= ASC INKEY$ -48:S=(C>0)*(C<4):S=S*(1-B(C*S)):D=D+S,B(C*S)=1:WEND :CALL 48381:GOTO 1

キーボードの1,2,3を押すと、それぞれ対応した3つの絵がストップします。止める順番は自由です。どこから止めてもオッケー(ここが売り)。
すべての絵がストップしたらゲーム終了。何かのキーを押すと再開します。スコア判定などはしていません。
アルゴリズム解説:A(2)は絵、B(3)は止めているかの判定に使っています。 C*Sというのは、押されているキーが1~3の時だけ1~3を意味し、それ以外のときは0です。後は適当に解析してください。

新ドットよけ

1 WAIT 1:FOR S=1 TO 99:CLS :PRINT STR$ S:X=0,Y=23,A=1:FOR J=1 TO S*8:P= RND 99+20,Q= RND 47:LINE (P,Q)-(P+1,Q+1),B:NEXT :REPEAT :PSET (X,Y):X=X-1-( INKEY$ ="")*2:A=(Y=47)*2-(Y=0)*2+A:Y=Y+A:UNTIL POINT (X,Y):IF X=144 NEXT

自分のオリジナルルールのドットよけです。ドットよけはポケコンゲームの王道ともいえますが、ルールが単純ではまってしまいます。
ルール:左から伸びる線の先が画面上にちりばめられている無数のドットに触れないように一番右端まで持っていくものです。ドットをよけるわけです。ここまではいたって普通のドットよけです。
このドットよけ特有のルール:斜め前に伸びる線は上下の壁にぶつかると向きを変えて進んでゆきます。何かのキーを押している間は、右に伸びていた線は左に戻っていきます。
ちょっとわかりにくいですが、やってみればわかります。一度何も押さずに動きを見てみればよくわかると思います。

よけろ点(新ドットよけのアレンジ)

1 FOR S=1 TO 99:CLS :PRINT STR$ S:X=0,Y=23,A=1:FOR J=1 TO S*8:P= RND 99+20,Q= RND 47:LINE (P,Q)-(P+1,Q+1),B:NEXT :REPEAT :PSET (X,Y):BEEP 1,,30:D=X-1-( INKEY$ ="")*2:A=(Y=47)*2-(Y=0)*2+A:E=Y+A:PRESET (X,Y):X=D:Y=E:UNTIL POINT (X,Y):IF X=144 NEXT

上で紹介したドットよけのアレンジバージョンです。
ルールの変更はありませんが、左から伸びてくる線が今回は点になりました。なぜかというと、新ドットよけを遊んだ方はわかると思いますが、線だと左に戻れないんです。通った後が残っているので、通ったところに戻ることが出来ないわけです。
これはそれを解消したバージョンです。これで思う存分漂うことが出来ます・・・が、点にしているためにその点が非常に見えにくくなっています。目を離すとどこに行ってしまったかわからなくなってしまうかも知れません・・・。

後、大して変わっていませんが、下のはベーシックマガジン掲載のバージョンです。スピードが遅くなって、障害物ドットが大きくなりました。動かすドットも見やすくなっているはずです。

1 FOR L=1 TO 99:CLS :PRINT STR$ L:X=0:Y=23:F=1:FOR J=1 TO L*6:P= RND 99+Y:Q= RND 44:LINE (P,Q)-(P+1,Q+3),B:NEXT :REPEAT :PSET (X,Y):F=((Y=47)-(Y=0))*2+F:BEEP 1,,80:PRESET (X,Y):Y=Y+F:X=X-( INKEY$ ="")*2-1:UNTIL POINT (X,Y):IF X=144 NEXT

ストップゲーム1

1 S=0:FOR J=1 TO 5:CLS :X=0:A= RND 350+100:PRINT "STOP:"; STR$ A:WHILE INKEY$ ="":X=X+1:LOCATE 0,1:PRINT STR$ X:WEND :S=S+ ABS (X-A):BEEP 1:NEXT :PRINT "SCORE="; STR$ S

次々に増えていく数値をキーを押して画面上部に表示されている目標数値になるべく近くストップさせるゲームです。
全部で5回繰り返し、最後に目標数値との差の合計が表示されます。
短く収まっているので、改造などをしてみてください。

ストップゲーム2

1 S=0:CLS :FOR J=1 TO RND 400+99:A$= INKEY$ :J=J+(A$<>"")*-500:NEXT :PRINT MID$ ("FLYINGSTART!",-(A$="")*6+1,6):WHILE INKEY$ ="":S=S+1:WEND :PRINT "Time:"; STR$ S:CALL 48381:BEEP 1:GOTO 1

START!と表示されたらすぐにキーを押して止めてください。
フライング判定をしていますが、フライング後のスコアの表示は無効のものです。
短いプログラムなので改造してみてください。

Copyright(C) tosik
E-Mail:
Weblog: Tosikの雑記