コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
しょうご ◆tpp2zBc4h8pI
2018/4/3 18:06
協力
自作シューティングゲーム 不具合修正の協力者募集
自作シューティングゲーム「ギャラクシーショット リメイク」が完成しましたが、敵を攻撃しても倒せない不具合、敵が上で残ってしまい、移動しない不具合がありますが、自分では原因がわからない為、不具合修正にご協力頂ける方を募集します。自分の技術の問題上、かなりのスパゲッティプログラムです。すいません。
公開キー[4K38EDQX]

コメント

アバター
でんぺん 2018/4/4 12:31 ◆HfSy5ayxtyTa
そうなんですよ。今回のケースは配列を使うとスッキリしますし、大抵のケースで配列はかなり役に立つので覚えておくとお得ですよ。

あと敵のスピードの部分とのことですが、どういうことですか?
僕もプログラム全部をきちんと見ているわけではないのでイマイチ把握してないだけかもしれませんが、今やっている事であれば、どの辺の事なのかとか、そうじゃなければどういう事がしたいのかとか、その辺がわかると何か言えるかなって思います。
アバター
しょうご 2018/4/4 12:36 ◆tpp2zBc4h8pI
この部分です。
分かりづらいですが、このCOM
(数字)Pの部分で敵のスピードを調整しています。
アバター
しょうご 2018/4/4 12:37 ◆tpp2zBc4h8pI
画像貼り忘れました。
アバター
でんぺん 2018/4/4 12:42 ◆HfSy5ayxtyTa
さっき僕は配列の事を書いてましたが、とりあえず配列化は別としてプログラムのスピードと書かれている部分をどう組むのが良い感じかってことですか?
それとも配列にしたらどういう風になるかって事ですか?

とりあえず今見せてもらった画像でわかる範囲での質問なら答えるので、ちょっと補足の説明が欲しいです!
アバター
しょうご 2018/4/4 12:50 ◆tpp2zBc4h8pI
配列にした場合のプログラムがどのようになるのかを教えて頂けると、ありがたいです。
アバター
でんぺん 2018/4/4 13:04 ◆HfSy5ayxtyTa
なるほど。それじゃまず上記の例では書き忘れましたが、配列の宣言として、
DIM COMP[5]
とします。これでCOMPもCOMP[0]〜COMP[4](の合計5つ)として扱えるようになります。ちなみに配列の添字[]の中身は0から始まるので5つの場合は0〜4までになります。

そして該当の範囲(スピードコメントのところ)を素直に置き換えると、
IF GAME==2 THEN
FOR I=0 TO 4
IF LV<20 && COMP[I]==85 THEN COMY[I]=COMY[I}+1:COMP[I]=0
IF LV>=20 && LV<25 && COMP[I]==65 THEN COMY[I]=COMY[I}+1:COMP[I]=0
IF LV>=25 && LV<30 && COMP[I]==55 THEN COMY[I]=COMY[I}+1:COMP[I]=0
IF LV>=30 && COMP[I]==50 THEN COMY[I]=COMY[I}+1:COMP[I]=0
NEXT
ENDIF

になります。一応これが素直に配列に直した場合(ただしANDは&&にしてみました)ですが、これだと処理が重複している感じがあるんでさらに最適化出来ます。それを次に書いてみます。
アバター
でんぺん 2018/4/4 13:16 ◆HfSy5ayxtyTa
見た感じ、条件に一致したTHENの後の処理は同じ(Y座標に足してカウントをクリア)なので、条件を整理するとこれはさらにシンプルに書けます。

NP=85
IF LV>=30 THEN NP=50 ELSEIF LV>=25 THEN NP=55 ELSEIF LV >= 20 THEN NP=65

FOR I=0 TO 4
IF COMP[I]==NP THEN COMY[I]=COMY[I]+1:COMP[I]=0
NEXT

という感じですね。
始めにLVによって変わる数値を求めて別変数(NP)に居れてるのがポイントです。(ここがIFとELSEIFが連続するのでさらに改良の余地はありますが)
それによってループの中の条件判断は極々シンプルになります。

NPを求めているプログラムはFORの中に入っていても正常に動作しますが、一度求めればFORの中で変化する値ではないのでFORの外で求めた方が処理速度的に良いです。

一応そんなイメージですが、なんとなくでもわかりましたでしょうか? いきなり色々詰め込むと混乱してしまう部分もあると思うので、わからなければ少しずつ理解していけばいいと思います。
アバター
しょうご 2018/4/4 13:36 ◆tpp2zBc4h8pI
ありがとうございます。
もう一つ質問なのですが、敵によって出現するレベルやスピードに違いがあるのですが、まとめることはできますか?
アバター
でんぺん 2018/4/4 14:01 ◆HfSy5ayxtyTa
敵によって変わると言うことは、配列を使った場合、配列の添字(0〜4)によって変わることになるんだと思います。

方法は色々ありますが、例えば敵によって変わるレベルやスピードの値を別の配列に入れておきそれを参照する方法があります。これは配列をテーブル化して利用するというような感じになります。

ちょっと複雑になりますが2次元配列を使ってみると、
DIM T_LV[5,4], T_SP[5,4]
T_LV[0,0]=30:T_LV[0,1]=25:T_LV[0,2]=20:T_LV[0,3]=1
T_SP[0,0]=50:T_SP[0,1]=55:T_SP[0,2]=65:T_SP[0,3]=85
※上記は敵0(1つ)なので残りの4つも同様に設定しておく。

とT_LVには区切りとなるレベル、T_SPにはその時のスピードを入れておきます。そうすればその判定は以下のようにシンプルになります。

FOR I=0 TO 4
FOR J=0 TO 3:IF LV>=T_LV[I,J] THEN NP=T_SP[I,J]:NEXT
IF COMP[I]==NP THEN COMY[I]=COMY[I]+1:COMP[I]=0
NEXT

という感じにまとまるのですが、正直2次元配列まで出てきてますし、今まで使ったことがないと難しく感じると思います。
一つ一つ読み解いていけば分かるとは思いますが理解が難しければ、一旦はわかる範囲で整理してまとめてみるのもいいんじゃないかと思います。

ちなみに上記は一例で、プログラムは色んな書き方が出来るので、もっと別の方法とかテーブルの部分はREAD、DATAを使うなどすると見やすくなる、等、色々な手段がありますので、まずはわかる範囲で少しずつトライしていくのがいいんじゃないかなって思います。
アバター
しょうご 2018/4/4 14:20 ◆tpp2zBc4h8pI
今までほとんど配列を使っていなかったので、少し難しく感じますが、少しずつ慣れていこうと思います。ありがとうございました。
アバター
でんぺん 2018/4/4 14:28 ◆HfSy5ayxtyTa
配列は覚えると便利ですよ! そして配列を使い出すと必然的にループ(FOR)も多く使うようになると思います。

始めは難しく感じると思いますが、慣れてわかってくると便利で応用が利く命令だなってなると思いますしプログラムの幅も広がってさらに楽しくなってくると思いますよ。

楽しみながら頑張ってください!
アバター
しょうご 2018/4/4 15:07 ◆tpp2zBc4h8pI
度々すいません。
レベルが一定数になった時に敵を追加するようにしたいのですが、始めから敵が5体表示されてしまいます。どのようにすればよいのでしょうか?
アバター
でんぺん 2018/4/4 15:17 ◆HfSy5ayxtyTa
やり方は色々あると思いますが、配列を使っていて増える敵が配列の順番(0〜4)で増えていく感じであれば、例えばE_MAXという敵の最大数的な変数を用意してまずE_MAX=1としてレベルが上がって敵の数が増える時にE_MAX=E_MAX+1などして上限を増やしていき、いつもはFOR I=0 TO 4としている部分を、
FOR I=0 TO E_MAX-1
とすれば良いと思います。(-1するのは配列は0スタートなので1減らす事で整合性をとってる)
アバター
しょうご 2018/4/4 15:42 ◆tpp2zBc4h8pI
敵の判定を付けたのですが、敵を倒すことができません。
アバター
でんぺん 2018/4/4 15:47 ◆HfSy5ayxtyTa
どんな感じですか? もし可能なら現時点のプログラムの公開キーを出してもらえればある程度確認出来ますよ。
(ただし全部のソースを見る余裕はないと思うので細かいバグまでは対応出来ませんが…)
アバター
しょうご 2018/4/4 16:12 ◆tpp2zBc4h8pI
ありがとうございます。
公開キー:QKKNQ39S
(GRPは含めていません)
アバター
でんぺん 2018/4/4 16:57 ◆HfSy5ayxtyTa
当たらない原因はわかりました。どうもCOMとCOMYの辺りが記述ミスがあるっぽくてその辺でおかしくなってますね。

IF POINT==COM[I] AND BOM==COMY[I] THEN BEEP 11〜…
って感じじゃないといけないのが、
IF POINT==COM[I] AND BOM==COM[I] THEN BEEP 11〜…
ってなっていて、COMYじゃないといけないところがCOMになってました。

他にもそういう箇所がありそうなので全体的にチェックする必要があるかもです。

あと僕が始めに書いた、
FOR I=0 TO 4
IF COM[I]==1 AND COM[I]==FLOOR(PLAYER) THEN COLOR 3
NEXT
も、
FOR I=0 TO 4
IF COMOK[I]==1 AND COM[I]==FLOOR(PLAYER) THEN COLOR 3
NEXT
の間違いでした。これはすいません。両方ともCOMでは変になりますよね…。

それと命令を1行に書くときなのですが、区切りにスペースを入れてますが本来は:(コロン)の方が正確です。例えば、
LOCATE 0,0 PRINT "TEST"
でも動きますが、これは
LOCATE 0,0:PRINT "TEST"
の方が1行に命令を2つ書いているというのが明確になるので良いと思います。特殊なケース(1画面プログラムなど)ではあえて:を省略することがありますが、それ以外ではちゃんと入れておいた方がプログラムは見やすくなると思います。
アバター
しょうご 2018/4/4 17:11 ◆tpp2zBc4h8pI
コメントありがとうございます。修正して試してみます。それとスペースとコロンの部分ですが、てっきりスペースが正しいと思っていました。そこも直しておきます。ご指摘ありがとうございます。
アバター
でんぺん 2018/4/4 17:52 ◆HfSy5ayxtyTa
コロンは1行に複数の命令を書きたいときに使うものですが省略やスペースでも大丈夫な事が多いので書かない人も居るんですが始めのうちは書いておいた方がいいかなって気がしますね。慣れてきたらどうするかは本人の好みもあると思いますが、僕は基本的には入れてます。

他にもインデントや見やすくするためだけのスペースを入れるなどをするとプログラムが綺麗に読みやすくなるので結果的にバグが見付けやすくなったりするのでプログラムを綺麗に書くのを心がけると自分の為にもなると思いますよ。

ちょっと例でプログラムを僕が1画面分だけ自分だったらどうするか的な感じで整列してみました。1画面だけですが読みやすくなってると思いませんか? そんな感じですねー。
アバター
しょうご 2018/4/4 18:24 ◆tpp2zBc4h8pI
命令と命令の間スペース等があり、とても見やすくなっていますね。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -