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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1105
dabby読みやすいプログラム6解決


dabby

リンク

2011/11/5(Sat) 23:50:33|NO.42830

はじめまして、どうもよろしくお願いします。
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.#...........###..
#######################

お願いします!



この記事に返信する


dabby

リンク

2011/11/5(Sat) 23:52:22|NO.42831

最後の部分もpreで囲むんだった;

####################### #..#...f.#..pf..##....# #..#..#..#..###.......# #...f.#...........###.. #######################
に読み替えてください;すみません;



GENKI

リンク

2011/11/6(Sun) 00:25:32|NO.42832

HSPには標準でモジュールやサンプルがたくさん入っています。
この辺を見て参考にされてはどうでしょうか。
あとは自分が過去に書いたスクリプトを読み返して、問題点洗い出すとかいいかもしれません。

とりあえずいくつか気づいた点を上げてみました。

・モジュールは別ファイルにわける。
 標準でついてきているモジュールを見て参考にしてください。

・モジュール空間(#module〜#globalまでの間)には#deffuncなどはいくつでも使用できます。
 特に必要なければ一つの空間だけで構いません。

・repeat〜loop間などにもはインデントをつけましょう。

・モジュール部とメインループ、サブルーチンなどスクリプトはある程度のグループに分かれます。
 「区切り線」を入れてみるといいですよ。
 また、この部分ではどんな意味の処理を書いているか分かるようなタイトルを入れておくと後で見返しやすいです。
 ただし入れすぎは禁物。
 http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%B6%E8%C0%DA%A4%EA%C0%FE

・コメントが少ない印象です。
 1年か半年もすれば自分で読み返すのも一苦労でしょう。

・if文を使いこなせるようになるといいかも。
例えば

if s1="" : else {
これは

if s1!"" {
こう書くのが普通だと思います。
http://hspdev-wiki.net/?HspCmd%2Fif
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D3%A5%C3%A5%C8%C1%E0%BA%EE
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%BE%F2%B7%EF%B1%E9%BB%BB%BB%D2


・switch文も覚えるといいかも。
 else ifでもいいんですけどね。


あとは何というか、読みにくいので読む気がしないです。



dabby

リンク

2011/11/6(Sun) 00:29:34|NO.42833

早い返信ありがとうございます!
switch文など存在を気づいてないのを始め発見が多くありました
精進いたします、今回はありがとうございました!



ミント

リンク

2011/11/6(Sun) 07:56:18|NO.42835

変数名にルール決めるといいかもです。

例えば「p  プレイヤー(あなた)」で不具合が出た場合、「p」で検索すると色々引っかかってしまいます。
そうなると少しデバックしずらいので、「player」とか名前をつけるといいかもです。


余談ですが最近自分はルールを決めるようにしました(本当は最初に決めるべき)
前の部分が「物の名前」、アンダーバー(_)の後ろが種類(x,y,fなどで座高とかフラグ)
例)TAMA_x
  弾のX

っと一目でわかるようにしたんだけど、GENKIさんが言っているとおり、
コメントをつけることが大事ですね。



dabby

リンク

2011/11/6(Sun) 10:21:07|NO.42836

「p」で検索すると色々引っかかってしまいます。

それ、確かに経験してました! 一回不便だなと思いましたが長い名前に直すところまで思いつかず…! ありがとうございました!



GENKI

リンク

2011/11/6(Sun) 14:28:54|NO.42840

演算子の前後はスペースを入れると見やすいですよ。
例)「r=255」→「r = 255」



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