Enjoy programming more!
Kidspod is a post site which supports young programmers.
First step to join us.
Register as a member
For members

2023/01/07 10:54:32

MixJuice GET URL : kidspod.club/mj/2169

ロジックゴルフ

■説明
Gに玉を入れるゲームです。
ボールのスタート位置を決め、玉を打ちます。
玉がGに入ると面クリアです。
反射板の斜面に当たると玉の進む方向が変わります。
外壁や進行方向に垂直な面に当たるとダメです。
全部で13面あります。
失敗すると、その面からやり直しです。

■操作
移動:← →
玉を打つ:スペースキー

■変数
A 面作成WORK
B 面作成WORK
D INKEYによる増減
I FOR
J FOR
K INKEY
M 面数-1
P 玉の移動増減X
Q 玉の移動増減Y
W WAIT
X 玉位置X座標
Y 玉位置Y座標

■プログラム
10 初期設定
20 初期設定
30-40 面描写
50-60 左右移動・スタート位置決定
70 玉消し
80-90 跳ね返り処理
100 クリア処理
110 玉表示
120 リトライ処理

■改造
容量が残り8Byteです。
大きく改造したい場合は、面のデータを少なくするのがいいかと思います。

一つの面のデータは5個です。
例えば、1面のデータは[0]~[4]に入っています。

オリジナルの面も作成できます。
面のデータは圧縮されています。
[0]には1面の1行目のデータが含まれています。
作成していた時の資料画像を貼りました。
画像の右のように3bitで一つを表しています。
[0]のような変数は2byte使っていますので[0]だけで16bitあり、一つの変数に入る情報は
3bitで一つになることを考えると5個(15bitを使い1bit余る)入ります。
1行目は数字に直すと4・5・6・0・5となりますが、これを10進数にするには
4+5*8+6*64+0*512+5*4096=20908
として、20908が1行目のデータになります。
同様に5行作成すれば1面分になります。
面の描写時にこの逆の計算をして表示しています。
30行の以下の部分(3bitずつ分解してキャラクターコードに置き換えている)
A=[I+M*5]>>(J*3)&7:B=(A>3)*(A+152)+(A=3)*26+(A=2)*25+(A=1)+!A*32

  • 1
  • 2
  • 1
  • 2

SOURCE CODE

10 CLV:LET[0],20908,0,28928,0,0,12483,8194,12291,8194,12291,164,128,128,20528,8194,23276,0,64,1048,9243,20612,132,134,0,8320,20868,28934,520,31207,20284,12418,0,0,130,131,20676,584,28676,584,30830
20 W=60:LET[40],14043,0,9362,0,14043,12482,8323,12482,8323,12482,196,12699,28932,20676,8596,12442,9368,14019,9346,13955,20780,31216,23598,31222,20284
30 @S:CLS:X=1:Y=8:P=0:Q=-1:?CHR$(6,6,6,6,6,6,6):COPY#920,#900,192:FORI=0TO4:FORJ=0TO4:LCJ+1,I+1:A=[I+M*5]>>(J*3)&7:B=(A>3)*(A+152)+(A=3)*26+(A=2)*25+(A=1)+!A*32:?CHR$(B):NEXT:NEXT
40 LC3,0:?"G":LC8,1:?"STAGE:";M+1
50 @A:LCX,7:?CHR$(226):LCX,8:?CHR$(233):K=INKEY():D=(K=29)-(K=28):IFK=32Y=6:GOTO@CELSEIFDLCX,7:?" ":LCX,8:?" ":X=(X+D+4)%5+1
60 GOTO@A
70 @B:LCX,Y:?" "
80 @C:X=X+P:Y=Y+Q:Z=SCR(X,Y):C=(Z=32):IFZ=157&&(P=1||Q=-1)||Z=158&&(P=-1||Q=1)||Z=26R=P:P=Q:Q=R:C=1
90 IFZ=156&&P+Q=-1||Z=159&&P+Q=1||Z=25R=P:P=-Q:Q=-R:C=1
100 IFZ=71?"CLEAR!":WAITW:M=M+1:IFM<13GOTO@SELSE?"ALL CLEAR":END
110 LCX,Y:?CHR$(233):WAITW/5:IFCGOTO@B
120 LCX,Y:?CHR$(244):?"RETRY":WAITW:GOTO@S

COMMENT

Kidspod運営チーム
Kidspod運営チーム2023/01/13 17:43:53

ゴールから逆にたどっていくのが必勝法だ!と思いきや、この技が通じない! 一度反射した板が消えるというところがおどろきでした。このアイデアひとつでグッと面白さが上がりますね。