HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0418
GENKIif文系禁止ゲームの考察スレ28解決


GENKI

リンク

2008/4/18(Fri) 23:43:42|NO.15204

皆さんスレの趣旨を忘れてif禁止プログラムに興味津々のようですね。私もですが。
いっそスレ立てちゃえばいいのに…と思ったのでたてました。
船丸さんごめんなさい。いただきました。

【スレ名】
if文系禁止ゲームの考察スレ

【スレの内容】
if文系禁止で作るゲームについて考えるスレッドです。
ゲームそのもの、あるいはゲームに使えそうなスクリプトのサンプルなどを募集します。

【ルール】
・if、#if、on 命令は使用禁止。
・禁止命令を他の命令で代用するのはOK。
・あまりに無駄な処理が多すぎるスクリプトの投下は禁止。
・スクリプトの長さはほどほどでお願いします。
・スクリプト投下以外の書き込みもOK。意見や感想などお願いします。
・けんかしない。



この記事に返信する


GENKI

リンク

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



Megane

リンク

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



GENKI

リンク

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



f

リンク

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

さあ、自分のスクリプトに組み込んで、半年後位にそれを読んで、
「こ、こんなの使わなけりゃよかった・・・さっぱり意味分からん!!」と、
後悔するがよいよいよい(残響音含む)



begriff

リンク

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



f

リンク

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

でもここまで大きくなるとは思っていませんでした。



hx

リンク

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



TODO

リンク

2008/4/22(Tue) 17:11:03|NO.15302

いろいろできるものですね。



hx

リンク

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を見ればわかりますが、エラーが起こりません。
邪道ですが。



f

リンク

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



naznyark

リンク

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を
代用する話になっているぞ。



f

リンク

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




KENTA

リンク

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



begriff

リンク

2008/5/6(Tue) 09:23:33|NO.15683

KENTAさんすごいっすな(笑)
普通に物理シミュレータですね 



As

リンク

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禁止部門とか作ったら面白そう。できないかな♪



ONION software Copyright 1997-2023(c) All rights reserved.