HSPの使い方を覚えるためになんとなくゲームを作っていたのですが
突然書いているプログラムが読みにくいものになっていないか気になってしまいました。
もちろんプログラムを書くのも自分なら修正するのも自分なので、
「自分が読みやすければそれでいいんだよ!」っていうのも正しいんですが、
客観的に見て明らかに誰が見ても「こうしたほうがスマート」っていう書き方を
見落としていて自分一人でプログラムの修正などに無駄に苦労していたら
なんだか悔しいので、下記に投下するちょっとしたゲームのプログラムを見て
楽に記述できる点などがあったら教えて頂ければ幸いです。
//-------------------------------------------------- //深い森から脱出ゲーム! //操作方法 スペースキー 読み進める 選択肢を決定 // 上下キー 選択肢を選ぶ //-------------------------------------------------- debug = 0 ; 0 ならばマップの表示は無し 1 ならば有り //マップの見方 // . 道 // # 壁 // f 食料 // p プレイヤー(あなた) //map.txtを弄ればマップを変えることができます //記法は「マップの見方」の記号をそのまま書くだけです //マップの広さは自由ですが、形は長方形でお願いします //-------------------------------------------------- //F5キーでスタート! //-------------------------------------------------- #include "hsp3util.as" #module #deffunc rcolor if ginfo_r=0&ginfo_g=0&ginfo_b=0 : color 255,255,255 : return if ginfo_r=255&ginfo_g=255&ginfo_b=255 : color 0,0,0 : return #global #module #deffunc fadeout r=255:g=255:b=255 repeat color r,g,b boxf if r=0&g=0&b=0 : break r-=5:g-=5:b-=5 wait 1 loop return #deffunc fadein r=0:g=0:b=0 repeat color r,g,b boxf if r=255&g=255&b=255 : break r+=5:g+=5:b+=5 wait 1 loop return #global #module #deffunc br t=0 sw=0 repeat rcolor : boxf 0,455,640,480 : rcolor stick key if key&16 : rcolor : boxf 0,401,640,480 : rcolor : pos 20,400 : break pos 320,455+t emes "▼" if sw=0 : t++ : if t=10 : sw=1 if sw=1 : t-- : if t=0 : sw=0 loop return #global #module #deffunc _st str s0,str s1,str s2,str s3 s=0 pos 4 emes "→"+s0 emes " "+s1 emes " "+s2 emes " "+s3 repeat redraw 0 rcolor boxf 0,401,640,480 rcolor pos 4,400 stick key if key&16 : break if s1="" : else { if key&2 { s-- if s=-1 { if s3="" { if s2="" : s=1 : else : s=2 } else : s=3 } } if key&8 { s++ if s=4 { s=0 } else : if s=3 { if s3="" : s=0 } else : if s=2 { if s2="" : s=0 } } } if s=0 : mes "→"+s0 : else : mes " "+s0 if s=1 : mes "→"+s1 : else : mes " "+s1 if s=2 : mes "→"+s2 : else : mes " "+s2 if s=3 : mes "→"+s3 : else : mes " "+s3 redraw 1 wait 1 loop pos 20 redraw 1 return s #global #define st(%1="",%2="",%3="",%4="") _st %1,%2,%3,%4 #module #deffunc setid var m,int p,int x,int y notesel m noteget id,y poke id,x,p noteadd id,y,1 noteunsel return #global #module #defcfunc getid var m,int x,int y notesel m noteget id,y noteunsel return peek(id,x) #global goto *start *battle repeat 4 boxf rcolor wait 5 loop mmplay 1 thp=100 tmhp=100 pos 0,0 mes "HP "+hp+"/"+mhp line 0,400,640,400 pos 20 emes "狼に遭遇した!" br repeat if cnt=0 : continue rnd(2)+1 if cnt\2=1 : { st "戦う","待機","逃げる" if stat=0 { thp-=20+rnd(10) if thp<0 : thp=0 emes "俺の攻撃!" br } else : if stat=1 { ; ゲームオーバー引き起こし用のデバッグコマンド emes "狼にだって愛は通じるはず!" emes "こちらが先に闘いを放棄すれば…" br } else { if rnd(2)=0 : btend=2 : break emes "逃げ切れず…" br } } else { hp-=10+rnd(10) if hp<0 : hp=0 rcolor : boxf : rcolor line 0,400,640,400 pos 0,0 mes "HP "+hp+"/"+mhp pos 20,400 emes "狼の攻撃!" br } if hp=0 : btend=0 : break if thp=0 : btend=1 : break loop mmplay 2 if btend=0 { emes "喰われた…" br end } else : if btend=1 { emes "追い払った!" br } else : if btend=2 { emes "逃げ切った!" emes "(食料の一部を置いてきてしまった。)" br if food>100 : food=100 : else : food-=10+rnd(10)-5 } return *start randomize mmload "forest.mid",0,1 ; 陰鬱とした森っぽい自作曲です mmload "strange.mid",1,1 ; 怪しい何かに遭遇したっぽい自作曲です mmload "night.mp3",2,1 ; 鈴虫の声などの夜の自然音が入ったフリー素材です message=2 text 20 hp=200 mhp=200 food=200 notesel m noteload "map.txt" my=notemax noteget mx,0 getstr mx,mx mx=strsize mx-- : my-- if instr(m,0,"p")=-1 : mes "error:初期位置未設定" : stop repeat notemax noteget x,cnt x=instr(x,0,"p") if x!-1 : y=cnt : break loop noteunsel repeat mmplay 0 repeat 11 if food<0 : food=0 rcolor : boxf : rcolor line 0,400,640,400 pos 0,0 mes "食料 "+food if debug=1 : mes m pos 20,400 if message=1 { emes "おっ、食える植物見っけ。" br } else : if message=2 { emes "…ここは、どこだ。" emes "かれこれ3日はこの森の中で遭難していることになる。" emes "食料を探しながらなんとか家へ帰らなければ。" br } else : if message=3 { emes "朝だ…" emes "今日こそ家へ帰ろう。" br } message=0 if food=0 : emes "死んだ…" : br : end if x=0|x=mx|y=0|y=my : emes "脱出した!" : br : end if cnt=10 : break setid m,'.',x,y ss=0 : s="","","","" if getid(m,x,y-1)='#' : s(ss)="" : else : s(ss)="北" : ss++ if getid(m,x-1,y)='#' : s(ss)="" : else : s(ss)="西" : ss++ if getid(m,x+1,y)='#' : s(ss)="" : else : s(ss)="東" : ss++ if getid(m,x,y+1)='#' : s(ss)="" : else : s(ss)="南" : ss++ st s(0),s(1),s(2),s(3) if s(stat)="北" : y-- if s(stat)="西" : x-- if s(stat)="東" : x++ if s(stat)="南" : y++ if getid(m,x,y)='f' { food+=20+rnd(10)-5 message=1 } else { food-=10+rnd(10)-5 } setid m,'p',x,y loop mmstop fadeout rcolor line 0,400,640,400 pos 20 mmplay 2 emes "夜だ…" emes "今日はひとまず休もう。" br text 100 emes "…………" emes "……………" emes "………………" text 20 br if rnd(2)=0 : gosub *battle mmstop fadein rcolor message=3 loop
ちなみにmmloadはファイルがなかったら無視されるので
map.txtさえ用意すれば動作しちゃったりします。
↓map.txtの書き方はこんな感じ
#######################
#..#...f.#..pf..##....#
#..#..#..#..###.......#
#...f.#...........###..
#######################
お願いします!