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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0125
ミントスクリプトの効率化?5解決


ミント

リンク

2011/1/25(Tue) 09:03:41|NO.36739

どうもお久しぶりです。そうでない方は初めまして (説明が長いです)

現在STGを作っています。右球と左球の処理をして敵の処理も出来ました。
ですが全部の敵を「右球と左球」両方に当たり判定を書いてしまうと長いスクリプトになってしまいます。
言葉では説明しずらいのでミニプログラムを出します (このプログラムだけでは動作しません、全部だすと200行近くあるので( ̄▽ ̄;)

 〜処理の流れ〜
自機の弾を変数に収納。
14行以降 → 敵と自機弾の当たり判定 (自機弾は100発)
---------------------------------------------------------

;****************敵VS玉****************** *敵VS玉 ;mytmx = 自機弾のフラグ repeat MYTMMAX ;自機弾の最大数,100 ;←球 MY_ct = cnt ;自機弾についてのカウント数 ttx = mytmx.MY_ct : tty = mytmy.MY_ct ;自機弾の座標 ;→球 MY_ct2 = cnt ;自機弾についてのカウント数 aax = mytmx2.MY_ct2 : aay = mytmy2.MY_ct2 ;自機弾の座標 gosub *tugi loop *tugi ;****************敵VS玉********************** repeat ENEMYMAX ;敵の最大数,5 ;←球 ;teki.cnt = 敵フラグ ;mytm = 自機弾フラグ if teki.cnt = 1 and mytm.MY_ct { if (tekix.cnt < ttx+8) and (tekix.cnt+32 > ttx) and (tekiy.cnt < tty+16) and (tekiy.cnt+32 > tty){ ;リセット ;敵の存在 ;自機弾 teki.cnt = 0 : mytm.MY_ct = 0 } } ;→球 if teki.cnt = 1 and mytm2.MY_ct2{ if (tekix.cnt < aax+9) and (tekix.cnt+32 > aax) and (tekiy.cnt < aay+9) and (tekiy.cnt+32 > aay){ ;リセット ;敵の存在 ;自機弾 teki.cnt = 0 : mytm2.MY_ct2 = 0 } }loop return
------------------------------------------------------------------
あたり前ですが敵は一種類だけではありません。4匹のグループ、3匹のグループ・・・と沢山種類があります。
それらを全て追加してしまうととんでもない長さになります。
追加するとこんなかんじです(さっきのソースの一番下に追加)(追加する場合29行目のreturnを削除)
------------------------------------------------------------------

;****************4グループの敵************************ repeat MAX_F ;敵の最大数,4 ;←球 if teki2.cnt = 1 and mytm.MY_ct{ if (tekix2.cnt < ttx+8) and (tekix2.cnt+32 > ttx) and (tekiy2.cnt < tty+16) and (tekiy2.cnt+32 > tty){ ;リセット ;敵の存在 ;自機弾 teki2.cnt = 0 : mytm.MY_ct = 0 } } ;→球 if teki2.cnt = 1 and mytm2.MY_ct2{ if (tekix2.cnt < aax+8) and (tekix2.cnt+32 > aax) and (tekiy2.cnt < aay+16) and (tekiy2.cnt+32 > aay){ ;リセット ;敵の存在 ;自機弾 teki2.cnt = 0 : mytm2.MY_ct2 = 0 } }loop return
----------------------------------------------------------------------
んでこれが3グループ2グループとなると・・・・
なので、関連性を見て「左の弾と右の弾」をまとめられそうな気がしましたが非力な自分には無理でした・・・orz
(当たり判定の所だってきっと小さくできるはず・・・)

そこで色々考えてみたのですが、プログラミング経験が少ない自分には3つぐらいしか思い浮かびませんでした・・・

■1 変数を使ってまとめてみる
MY_M = MY_ct
MY_M = MY_ct2
→プログラミングルールでNG

■2 orを使ってみる
ヒット数がおかしくなる

■3 その他
・フラグ?
・else → 「違う場合」じゃないし


この場合どのようにしたら短くできますでしょうか?
それとも自分のような経験が少ない人はガンガン付け加えた方がいいのでしょうか?
ってか以前に小さくするっといのは無理なんでしょうか?

なんかアルゴリズムの相談で申し訳ないです (´・ω・`)
わかる方いましたら教えてください。



この記事に返信する


ORZ

リンク

2011/1/25(Tue) 12:46:43|NO.36740

君がどんなプログラミングルールを背負っているのかはわからんが・・・
とりあえず何がイケないって敵のグループをteki,teki2,teki3....と管理していることだ。
敵のグループが最大100個あり、そいつら全員のHPを表示したいなァと思ったら

repeat MAXCOUNT_E1 mes tekiHP.cnt loop repeat MAXCOUNT_E2 mes teki2HP.cnt loop
みたいなものを100個書く必要がある。ので君が今まで作ったモノをブン投げるくらいの勢いで
多次元配列というものについて勉強しなさい。これを使うと

repeat MAXGROUP cn2=cnt repeat MAXCOUNT.cn2 mes tekiHP.cn2.cnt loop loop
というように書くことができる。さらに、敵のパラメータが4つあった場合、4つもmesるのは
面倒なので

dataname="X座標","Y座標","好きな食べ物","twitterアカウント名" repeat MAXGROUP cn2=cnt repeat MAXCOUNT.cn2 cn3=cnt repeat 4 mes dataname.cnt+":"+tekidata.cn2.cn3.cnt loop loop loop
という風に書くこともできる。これをもう少し発展させるとモジュール型変数というものになるが
これはまだ訓練兵未満の君には荷が重いかもしれない。



ミント

リンク

2011/1/25(Tue) 21:01:25|NO.36754

>ORZさん
>>とりあえず何がイケないって敵のグループをteki,teki2,teki3....と管理していることだ。
ですよねー・・・

配列を使えばいいとわかっているんだけど、使わないへぼプログラマーですorz
ってか使わないということは、知らない事と同然だよね・・・
まずは配列を使うことを習慣づけて慣れてからステップアップしていこうかと思います。


>>多次元配列というものについて勉強しなさい。これを使うと
多次元配列・・・
このさいイチからやるつもりで「1次元配列 → 2次元配列」というふうに覚えて使えるまでいきたいです。

>>これをもう少し発展させるとモジュール型変数というものになるが
自分の質問にたびたび出てきましたね「モジュール型変数」
ですがいまいち理解できずほっぽらかし状態でした・・・そのうち覚えないとな・・・
いやいや今は「配列」だけに集中しよう。じゃないと私のプログラムに明日は来ない。


そんなわけで「配列」から勉強します・・・
「配列」自体は覚えているので(うる覚え)問題ないかと思いますが、スクリプトを短縮化できるか自信ありません・・・
ですがやらないことには始まらないでしょう。

お忙しい所お答えいただきありがとうございます!
わざわざ作っていただいたサンプルプログラムの方もありがとうございます!



先輩

リンク

2011/1/26(Wed) 09:39:17|NO.36765

「うる覚え」じゃなく「うろ覚え」です。
「使えない」と自分の実力を認めることがプログラマの務めです。



ORZ

リンク

2011/1/26(Wed) 16:47:18|NO.36769

まずは日本語の効率化に努めるべきだな。



ミント

リンク

2011/1/26(Wed) 19:16:57|NO.36770

>>先輩さん
あわわわ、言葉を間違えてしまいました。
実力ですか・・・あまりふりかえったことがないので、
ここでどこまで覚えたのかふりかえってみるか・・・

>>ORZさん
プログラミングと違い、言葉の指摘は1レス?あれば十分じゃありません?
まー私は本当にバカだからバカにされてもしょうがないですけど・・・自信湧かないなぁ・・・



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