|
|
2008/4/18(Fri) 23:43:42|NO.15204
皆さんスレの趣旨を忘れてif禁止プログラムに興味津々のようですね。私もですが。
いっそスレ立てちゃえばいいのに…と思ったのでたてました。
船丸さんごめんなさい。いただきました。
【スレ名】
if文系禁止ゲームの考察スレ
【スレの内容】
if文系禁止で作るゲームについて考えるスレッドです。
ゲームそのもの、あるいはゲームに使えそうなスクリプトのサンプルなどを募集します。
【ルール】
・if、#if、on 命令は使用禁止。
・禁止命令を他の命令で代用するのはOK。
・あまりに無駄な処理が多すぎるスクリプトの投下は禁止。
・スクリプトの長さはほどほどでお願いします。
・スクリプト投下以外の書き込みもOK。意見や感想などお願いします。
・けんかしない。
|
|
2008/4/18(Fri) 23:48:11|NO.15205
とりあえず立てた本人から。
基本的なところで自機を動かすサンプル。
キーボードのカーソルキーで動きます。
dp = 10
*main
redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0
stick key, 2048-1
px += -dp*((key&1)=1) + dp*((key&4)=4)
py += -dp*((key&2)=2) + dp*((key&8)=8)
pos px, py : mes "●"
goto *main
|
|
2008/4/19(Sat) 06:24:26|NO.15208
とりあえずこれを。
repeat
redraw 2
color 255,255,255
boxf
color
pos 0,0
stick a,5
switch a ; aを比較対象とする
case 1 ; aが0だった場合
mes "←キーが押されてました。"
swbreak ; case0の条件実行終了
case 5 ; aが0だった場合
mes "押されすぎです。"
swbreak ; case0の条件実行終了
case 4 ; aが1だった場合
mes "→キーが押されてました。"
swbreak
default ; aが0以外だった場合
mes "→か←キーを押してください。"
swbreak
swend
redraw 1
await
loop
|
|
2008/4/19(Sat) 07:02:38|NO.15210
if文禁止という趣旨からすれば、
do while switch for…あたりは使っちゃいかん気がしますが、どうですか?
|
|
2008/4/19(Sat) 08:21:33|NO.15211
いつもは質問しかしていませんでしたが、興味があったのでこんなものを作ってみました。
#define iff(%1) %tiff %i=*%i,*%i:goto %p2(%1):*%o
#define endiff %tiff *%o:%p0=%o
repeat
redraw 0
color 255,255,255:boxf:color:pos 0,0
mes "aは"+a+"です"
iff a<=100
mes "aは100以下です"
endiff
redraw 1
a++
await 16
loop
|
|
2008/4/19(Sat) 10:01:21|NO.15212
> do while switch for…あたりは使っちゃいかん気がしますが、どうですか?
今のところokとしてます。
忘れがちな基本テクなので1回は投稿されて欲しいところです。(みごとに忘れてました…。)
ただ、これらばかりで満足するかは個人次第。
色んな手法が出てくることを期待してます。
|
|
2008/4/19(Sat) 15:48:16|NO.15221
はみ出し処理などを演算子を用いてやってみました。
最適化とかは全くしてませんが、とりあえず動作する程度に。
screen 0,255,255,1,,,255,255
font "",15
repeat
redraw 0
wait 1
color 255,255,255:boxf:color
stick st,15
xm=st&1:xp=(st&4)/4
ym=(st&2)/2:yp=(st&8)/8
x-=xm:x+=xp:y-=ym:y+=yp
x-=x/241:y-=y/241
memcpy xvm,x,2,,2
memcpy yvm,y,2,,2
x+=xvm/$FFFF:y+=yvm/$FFFF
pos x,y:mes "■"
redraw 1
loop
|
|
2008/4/19(Sat) 16:35:06|NO.15223
・・・参考までに再掲載。
・・・元々はネタだが、敢て使うという姿勢は否定しない。
何かの参考になるかもしれない悪行コーディング
----------------------------------------------------------
使うとプログラムの可読性が損なわれる記述法、論理式
----------------------------------------------------------
簡単なフラグ保持
flg = ( 条件 ) or flg
条件が成立するとflgが1になり、条件が成立しなくなってもその値を維持する。
例
flg = 0
repeat 20
flg = ( cnt = 10 ) or flg
mes "cnt = " + cnt + " flg = " + flg
loop
もう少し使い所の有りそうな式
flg = ( ( ONになる条件 ) or flg ) and ( OFFに「ならない」条件 )
ONになる条件が成立するとflgが1になる。
OFFにならない条件が成立している間、flg=1を維持する。
例
flg = 0
repeat 20
flg = ( ( cnt = 10 ) or flg ) and ( cnt < 15 )
mes "cnt = " + cnt + " flg = " + flg
loop
さあ、自分のスクリプトに組み込んで、半年後位にそれを読んで、
「こ、こんなの使わなけりゃよかった・・・さっぱり意味分からん!!」と、
後悔するがよいよいよい(残響音含む)
|
|
2008/4/19(Sat) 21:48:27|NO.15226
なんかいいのができました。
まずこれ
x=0
lab=*if_true_0001,*if_false_0001 //label型の配列をつくる
if_jouken=x //xに条件式を丸々いれる
goto lab((if_jouken&&1)!1) //適切にジャンプ
*if_true_0001 //真
mes "1
goto *if_break_0001
*if_false_0001 //偽
mes "2
*if_break_0001
mes "3\n
//////////////////////////////////
if x{
mes "1
}else{
mes "2
}
mes "3\n\n同じ動作です。
これを応用すれば何でもいける と思う。
たとえば、これ 迷路ですが別スレでif使いまくりでしたが、
すべて機械的に置き換えて見ました elseがないので*if_false_****のある意味はないですが。。。
(誰か置き換えるコンバータかモジュールか#define か考えてくれる つわものは いないですかね?)
screen 0,788,604
*e
color
boxf
color 255,255,255
randomize
dim d,99,76
dim s,99*76,2
s.0.0=1
s.0.1=1
d.1.1=1
i=0
*l
r=rnd.4
x=s.i.0
y=s.i.1
h=0
g=0
lab=*if_true_0001,*if_false_0001
if_jouken=(x>1&d(x-1,y)!1)
goto lab((if_jouken&&1)!1)
*if_true_0001
h=1
lab=*if_true_0002,*if_false_0002
if_jouken=(r=0)
goto lab((if_jouken&&1)!1)
*if_true_0002
x-:d.x.y=1:i+:s.i.0=x:s.i.1=y:g=1:boxf x*8,y*8,(x+1)*8+3,y*8+3
goto *if_break_0002
*if_false_0002
*if_break_0002
goto *if_break_0001
*if_false_0001
*if_break_0001
lab=*if_true_0003,*if_false_0003
if_jouken=(y>1&d(x,y-1)!1)
goto lab((if_jouken&&1)!1)
*if_true_0003
h=1
lab=*if_true_0004,*if_false_0004
if_jouken=(r=1)
goto lab((if_jouken&&1)!1)
*if_true_0004
y-:d.x.y=1:i+:s.i.0=x:s.i.1=y:g=1:boxf x*8,y*8,x*8+3,(y+1)*8+3
goto *if_break_0004
*if_false_0004
*if_break_0004
goto *if_break_0003
*if_false_0003
*if_break_0003
lab=*if_true_0005,*if_false_0005
if_jouken=(x<97&d(x+1,y)!1)
goto lab((if_jouken&&1)!1)
*if_true_0005
h=1
lab=*if_true_0006,*if_false_0006
if_jouken=(r=2)
goto lab((if_jouken&&1)!1)
*if_true_0006
x+:d.x.y=1:i+:s.i.0=x:s.i.1=y:g=1:boxf (x-1)*8,y*8,x*8+3,y*8+3
goto *if_break_0006
*if_false_0006
*if_break_0006
goto *if_break_0005
*if_false_0005
*if_break_0005
lab=*if_true_0007,*if_false_0007
if_jouken=(y<74&d(x,y+1)!1)
goto lab((if_jouken&&1)!1)
*if_true_0007
h=1
lab=*if_true_0008,*if_false_0008
if_jouken=(r=3)
goto lab((if_jouken&&1)!1)
*if_true_0008
y+:d.x.y=1:i+:s.i.0=x:s.i.1=y:g=1:boxf x*8,(y-1)*8,x*8+3,y*8+3
goto *if_break_0008
*if_false_0008
*if_break_0008
goto *if_break_0007
*if_false_0007
*if_break_0007
lab=*if_true_0009,*if_false_0009
if_jouken=(g=0&h)
goto lab((if_jouken&&1)!1)
*if_true_0009
goto *l
goto *if_break_0009
*if_false_0009
*if_break_0009
lab=*if_true_0010,*if_false_0010
if_jouken=(g=0&h=0)
goto lab((if_jouken&&1)!1)
*if_true_0010
i-
lab=*if_true_0011,*if_false_0011
if_jouken=(i<0)
goto lab((if_jouken&&1)!1)
*if_true_0011
wait 100:goto *e
goto *if_break_0011
*if_false_0011
*if_break_0011
goto *if_break_0010
*if_false_0010
*if_break_0010
lab=*if_true_0012,*if_false_0012
if_jouken=(g&h)
goto lab((if_jouken&&1)!1)
*if_true_0012
c+
lab=*if_true_0013,*if_false_0013
if_jouken=(c=30)
goto lab((if_jouken&&1)!1)
*if_true_0013
c=0:await 1
goto *if_break_0013
*if_false_0013
*if_break_0013
goto *if_break_0012
*if_false_0012
*if_break_0012
getkey k,32
lab=*if_true_0014,*if_false_0014
if_jouken=(k)
goto lab((if_jouken&&1)!1)
*if_true_0014
goto *e
goto *if_break_0014
*if_false_0014
*if_break_0014
goto *l
| |
|
2008/4/20(Sun) 00:20:37|NO.15228
ラベル変数遣わなくても何とかなった。
while使ったが、ああこれがラベル変数使わない代償だな。
一箇所ifが残ってたので修正&長いので詰めた。
mzw= 99:mzh= 76:stacksize = mzw * mzh:screen 0,mzw*8,mzh*8
*start:color:boxf:color 255,255,255:randomize
dim d , mzw + 1 , mzh + 1:dim s , stacksize + 1 , 2
s(0,0)=1:s(0,1)=1:d(1,1)=1:i=0:k=0
while ((k=0 & i>=0))
r=rnd.4:x=s(i,0):y=s(i,1):h=0:g=0
h0 = ( (x>1 ) & (d(x-1,y )!=1) ):h1 = ( (y>1 ) & (d(x ,y-1)!=1) )
h2 = ( (x<mzw-2) & (d(x+1,y )!=1) ):h3 = ( (y<mzh-2) & (d(x ,y+1)!=1) )
h = ( (h0 + h1 + h2 + h3) != 0 )
g0 = (r=0 & h0=1):g1 = (r=1 & h1=1):g2 = (r=2 & h2=1):g3 = (r=3 & h3=1)
g = ( (g0 + g1 + g2 + g3) != 0) : ng=(g=0)
mx = ( g2=1 ) - ( g0=1 ):my = ( g3=1 ) - ( g1=1 ):x+=mx:y+=my
dx = (x*g) + (mzw*ng):dy = (y*g) + (mzh*ng)
d(dx,dy) = g:i += g:si = (i*g) + (stacksize*ng):s(si,0) = x:s(si,1) = y
boxf ((x-(r=2))*8)*g,((y-(r=3))*8)*g,(((x+(r=0))*8)+3)*g,(((y+(r=1))*8)+3)*g
i-=(h=0):c=((c<=30)*c)+g:await (c=1):getkey k,32
wend:wait 100:goto *start
|
|
2008/4/20(Sun) 08:10:06|NO.15231
でもここまで大きくなるとは思っていませんでした。
|
|
2008/4/22(Tue) 05:41:00|NO.15297
初歩的・邪道過ぎたらすみませんが
if a=2 {
mes "a=2"
}
else {
mes "a!2
}
と
repeat (a=2)
mes "a=2"
loop
repeat (a!2)
mes "a!2"
loop
でおなじ事ができるのでは?
欠点としては
・ネストの問題で多重利用が危ない
・ネストの問題でgotoを(repeatのなかで)利用できない
など(本当はもっとたくさん出てくるでしょうけれど)。
利点として
・if,#if,onを使わない
・マクロを使わない
など。
|
|
2008/4/22(Tue) 14:12:49|NO.15301
#defineマクロでif命令を作ってみました。
当然、マクロ内でif命令は使っていません。
else部分を省略できないのがちょっと心残り。
#define _if(%1) %t_if %i0 __if_lab=*%i,*%i:goto __if_lab(%1=0):*%p1
#define _else %t_if goto *%p2:*%o
#define _endif %t_if %o0 *%o
repeat 5
exp=cnt-2
mes "exp="+exp
mes "---- if ----"
if exp{
mes " 真"
}else{
mes " 偽"
}
mes "-- non if --"
_if exp
mes "_真"
_else
mes "_偽"
_endif
loop
|
|
2008/4/22(Tue) 17:11:03|NO.15302
いろいろできるものですね。
|
|
2008/4/23(Wed) 09:47:30|NO.15329
↑×3のrepeatを使ってgotoで違うラベルに飛べない問題ですが
邪道&危険な解決策です。
onerror *true
cause_error=1/(1-(a=2))
onerror 0
mes "false"
stop
*true
onerror 0
mes "true"
stop
|
|
2008/4/23(Wed) 22:04:26|NO.15346
a=2
これもあるでよ。
a=2
*aa
repeat (a=2)
goto *aaa
stop
*aaa
mes looplev
break :loop
mes looplev
await
goto *aa
looplevを見ればわかりますが、エラーが起こりません。
邪道ですが。
|
|
2008/4/24(Thu) 07:53:58|NO.15352
大分前にどこかに捨てた奴だが、if文抜いてみた。
ゲームは出てなかったと思うので、実際に出来るという確認に。
#define locate(%1,%2) pos %1*16 , %2*16
screen 0 , 512 , 384 : font "MS ゴシック" , 16 , 1
cp = " | \n>−+●\n | " : ct = "=>" : ce = "■■■\n■■■\n■■■"
x = 0 : y = 0 : tx = 32 : ty = 0 : tf = 0 : ex = 32 : ey = 0 : ef = 0:eof=0
while( eof=0 ):stick st,15,0
if ( st and 16 ) != 0 and tf = 0 { tx = x + 4 : ty = y + 1 : tf = 1 }
if ef = 0 { ex = 32 : ey = rnd(21) : ef = 1 }
x = x - ( ( ( st and 1 ) != 0 ) and x > 0 ) + ( ( ( st and 4 ) != 0 ) and x < 28 )
y = y - ( ( ( st and 2 ) != 0 ) and y > 0 ) + ( ( ( st and 8 ) != 0 ) and y < 21 )
tx = tx + ( tf = 1) : tf = (tf = 1 and tx < 32)
ex = ex - ( ef = 1) : ef = (ef = 1 and ex > 0)
redraw 0
color 96 , 96 , 255 : boxf
color 255 , 255 , 255 : locate x , y : print cp
color 255 , 96 , 96 : locate tx , ty : print ct
color 0 , 0 , 0 : locate ex , ey : print ce
redraw 1
eof =((y-2<=ey)+(y+2>=ey)+(x-1<=ex)+(x+3>=ex) = 4)
hit =((ty-2<=ey)+(ty>=ey)+(tx-1<=ex)+(tx+2>=ex) = 4)
tf= tf*(hit=0):tx=(tx*(hit=0))+((hit=1)*35):ef=ef*(hit=0)
await 50:wend
| |
|
2008/4/25(Fri) 02:22:34|NO.15364
こんなのも。
repeat loop で do while ( do until ) っぽいもの。
repeat 1
wait 0
x++
mes x
continue ( ( x != 10 ) == 0 )
loop
mes "end"
|
|
2008/4/29(Tue) 18:00:49|NO.15501
これに1行限定ルールが入ったら大変ですね。
|
|
2008/4/29(Tue) 21:32:55|NO.15510
elseも使えるようにしました。省略もできます。
#define iff(%1) %tiff %s1 %i=*%i,*%i:goto %p2(limit((%1)!0,0,1)):*%o
#define elseiff %tiff endiff %c iff 0=(%p2)
#define endiff %tiff*%o %o0 %o0
repeat
redraw 0
color 255,255,255:boxf:color:pos 0,0
mes "aは"+a+"です"
iff a<=100
mes "aは100以下です"
#if 1
elseiff
mes "aは101以上です"
#endif
endiff
redraw 1
a++
await 16
loop
|
|
2008/5/1(Thu) 21:38:37|NO.15579
でも、僕は純粋にif使わなくて条件反射が無いけど出来るゲームを求めていたのだが何かifを
代用する話になっているぞ。
|
|
2008/5/1(Thu) 23:30:48|NO.15581
なんか今見たらifが残ってたので上げなおし。
#define locate(%1,%2) pos %1*16 , %2*16
screen 0 , 512 , 384 : font "MS ゴシック" , 16 , 1
cp = " | \n>−+●\n | " : ct = "=>" : ce = "■■■\n■■■\n■■■"
x = 0 : y = 0 : tx = 32 : ty = 0 : tf = 0 : ex = 32 : ey = 0 : ef = 0:eof=0
while( eof=0 ):stick st,15,0
frg = ((st & 16 )!=0 & tf=0):tx = (tx*(frg=0))+ ((x+4)*(frg=1))
ty = (ty*(frg=0))+ ((y+1)*(frg=1)):tf = (frg=1) | tf
ex = (ex*(ef!=0))+(32 *(ef=0)):ey = (ey*(ef!=0))+(rnd(21)*(ef=0)):ef = (ef=0) | ef
x = x - ( ( ( st and 1 ) != 0 ) and x > 0 ) + ( ( ( st and 4 ) != 0 ) and x < 28 )
y = y - ( ( ( st and 2 ) != 0 ) and y > 0 ) + ( ( ( st and 8 ) != 0 ) and y < 21 )
tx = tx + ( tf = 1) : tf = (tf = 1 and tx < 32)
ex = ex - ( ef = 1) : ef = (ef = 1 and ex > 0)
redraw 0
color 96 , 96 , 255 : boxf
color 255 , 255 , 255 : locate x , y : print cp
color 255 , 96 , 96 : locate tx , ty : print ct
color 0 , 0 , 0 : locate ex , ey : print ce
redraw 1
eof =((y-2<=ey)+(y+2>=ey)+(x-1<=ex)+(x+3>=ex) = 4)
hit =((ty-2<=ey)+(ty>=ey)+(tx-1<=ex)+(tx+2>=ex) = 4)
tf= tf*(hit=0):tx=(tx*(hit=0))+((hit=1)*35):ef=ef*(hit=0)
await 50:wend
| |
|
2008/5/5(Mon) 21:13:39|NO.15673
いらいら棒。できたものが思った以上にいらいらする。別にゴールしたからなんだってものでもないが・・・
boxf 0,0:color 255,255,255:boxf 0,0,35,20
repeat 160;20-200の範囲で数値をいじることでレベル調整
line 0,0,480+cnt,480
loop
color 255,255,255:pos 40,0:mes "←GOLE":pos 420,460:mes "STAT→":color 255,255,255
*GAMESTAT
mouse ginfo_wx2-170,ginfo_wy2-25:wait 30
while ginfo(16)=255
pget mousex,mousey:wait 1
wend
color 255,255,255:goto *GAMESTAT
|
|
2008/5/5(Mon) 22:52:55|NO.15677
上のを一行にしてみた。というかほとんど細工しなくても一行にすることができた。STARTのスペル間違ってて恥ずかしい...
boxf 0,0:color 255,255,255:boxf 0,0,35,20:repeat 160/*20-200 レベル調整*/:line 0,0,480+cnt,480:loop:color 255,255,255:pos 40,0:mes "←GOLE":pos 410,460:mes "START→":color 255,255,255:repeat:mouse ginfo_wx2-170,ginfo_wy2-25:wait 30:while ginfo(16)=255:pget mousex,mousey:wait 1:wend:color 255,255,255:loop
|
|
2008/5/6(Tue) 01:42:46|NO.15679
たくさんのボールが動くスクリプトをifなしで作ってみました。
ボールとボールの移動距離を入れ替えて反射させるようにしたり、
ボールが重ならないように配置・処理しています。
ただし、ボールの大きさが大きすぎるとボールの配置に時間がかかってしまいます。
screen 0,640,480,0
ball=20 //ボールの数
size=50 //ボールの大きさ
speedmax=3 //速度の限界(絶対数)
dim ballx,ball :dim bally,ball
dim ballbax,ball :dim ballbay,ball
dim ballsx,ball :dim ballsy,ball
dim ballbasx,ball :dim ballbasy,ball
dim ballr,ball :dim ballg,ball :dim ballb,ball
randomize :repeat ball :ct1=cnt :flag=0
ballx.ct1=rnd(ginfo.26-size) :bally.ct1=rnd(ginfo.27-size)
ballbax.ct1=ballx.ct1 :ballbay.ct1=bally.ct1
ballsx.ct1=rnd(speedmax*2+1)-speedmax :ballsy.ct1=rnd(speedmax*2+1)-speedmax
ballbasx.ct1=ballsx.ct1 :ballbasy.ct1=ballsy.ct1
ballr.ct1=rnd(255)+1 :ballg.ct1=rnd(255)+1 :ballb.ct1=rnd(255)+1
repeat ball-1 :ct2=cnt+(cnt>=ct1)
balltx=ballx.ct1-ballx.ct2 :ballty=bally.ct1-bally.ct2
flag=(sqrt(balltx*balltx+ballty*ballty)<=size) | flag
await 0 :loop :continue (cnt+(flag=0)) :loop
*main
redraw 0 :color :boxf :repeat ball :ct1=cnt
ballbax.ct1=ballx.ct1 :ballbay.ct1=bally.ct1
ballx.ct1+=ballsx.ct1 :bally.ct1+=ballsy.ct1
ballsx.ct1=limit(ballsx.ct1,-speedmax,speedmax) :ballsy.ct1=limit(ballsy.ct1,-speedmax,speedmax)
ballsx.ct1=ballsx.ct1-((ballsx.ct1*2)*(ballx.ct1!limit(ballx.ct1,0,ginfo.26-size)))
ballsy.ct1=ballsy.ct1-((ballsy.ct1*2)*(bally.ct1!limit(bally.ct1,0,ginfo.27-size)))
ballbasx.ct1=ballsx.ct1 :ballbasy.ct1=ballsy.ct1
ballx.ct1=limit(ballx.ct1,0,ginfo.26-size) :bally.ct1=limit(bally.ct1,0,ginfo.27-size)
color ballr.ct1,ballg.ct1,ballb.ct1 :circle ballx.ct1,bally.ct1,ballx.ct1+size,bally.ct1+size
repeat ball-1 :ct2=cnt+(cnt>=ct1)
balltx=ballx.ct1-ballx.ct2 :ballty=bally.ct1-bally.ct2
flag=sqrt(balltx*balltx+ballty*ballty)<size
ballx.ct1-=(ballx.ct1-ballbax.ct1)*flag :bally.ct1-=(bally.ct1-ballbay.ct1)*flag
ballx.ct2-=(ballx.ct2-ballbax.ct2)*flag :bally.ct2-=(bally.ct2-ballbay.ct2)*flag
ballsx.ct1=flag*ballbasx.ct2+(flag=0)*ballsx.ct1 :ballsy.ct1=flag*ballbasy.ct2+(flag=0)*ballsy.ct1
ballsx.ct2=flag*ballbasx.ct1+(flag=0)*ballsx.ct2 :ballsy.ct2=flag*ballbasy.ct1+(flag=0)*ballsy.ct2
ballbasx.ct1=ballsx.ct1 :ballbasy.ct1=ballsy.ct1
ballbasx.ct2=ballsx.ct2 :ballbasy.ct2=ballsy.ct2
loop :loop :redraw :wait 1 :goto *main
| |
|
2008/5/6(Tue) 09:23:33|NO.15683
KENTAさんすごいっすな(笑)
普通に物理シミュレータですね
|
|
2008/5/6(Tue) 20:55:23|NO.15692
KENTAさんに一票!
|
|
2008/5/9(Fri) 17:19:58|NO.15749
もしかしたら2008年HSPプログラミングコンテストのショートプログラムで入賞できるかもしれません。
|
|
2008/5/13(Tue) 19:39:58|NO.15797
if禁止部門とか作ったら面白そう。できないかな♪
|
|