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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1129
AKI初歩的かとおもいますが、計算式の質問12解決


AKI

リンク

2006/11/29(Wed) 12:44:40|NO.3837

こんにちは
下記のif文なのですが省略できますか?
if (mapx.data=1)|(mapx.data=5)|(mapx.data=9)|(mapx.data=13)|(mapx.data=17):pp=pp+12

こんな式ではだめでした
if mapx.data=(1|5|9|13|17):pp=pp+12
何か方法ありますか?



この記事に返信する


じった

リンク

2006/11/29(Wed) 13:13:08|NO.3839

mapx.data が0以上と制限した場合、

if ((mapx.data and 3)=1)and(mapx.data<=17):pp=pp+12

さらに、mapx.data の最大値が17以下ならば、『and(mapx.data<=17)』も省略できます。

でも、ちょっとわかりづらいかな?



じった

リンク

2006/11/29(Wed) 13:26:01|NO.3840

すみません、ちょっと訂正。

『mapx.data が0以上と制限した場合』→『mapx.data が−2以上と制限した場合』
『mapx.data の最大値が17以下ならば』→『mapx.data の最大値が20以下ならば』

要するに、mapx.data のとりうる値が −2以上20以下ならば

if (mapx.data and 3)=1:pp=pp+12
でOKなはずです。



kz3

リンク

2006/11/29(Wed) 13:33:15|NO.3841

>こんな式ではだめでした
>if mapx.data=(1|5|9|13|17):pp=pp+12

何故だめだったか、分かりますか?
分かっているならいいのですが、分からなければ何故ダメだったのか、を考えると次のステップに進めると思います。

>下記のif文なのですが省略できますか?

字数を減らすことなら減らせました。

>何か方法ありますか?

人によって実現方法も変わってくるでしょうね。
私は、規則性を発見したのでそれに基づいて演算をしてやりました。

# 自分の分からないことに「初歩的」とかつけられるハズないんだけどなぁ...初歩的かどうかも分からないハズじゃない?



ハトサブレ

リンク

2006/11/29(Wed) 13:53:53|NO.3842

省略という意味だけ取れば

a=mapx.data if (a=1)|(a=5)|(a=9)|(a=13)|(a=17):pp=pp+12
でいいかと。

それか値が1から17の間しかないのならば

a=mapx.data a=a\4 if (a=1):pp=pp+12
4の余りをだして1ならイコールにしてます。

等間隔のものの判断には¥を使うといいでしょう。



猫太

リンク

2006/11/29(Wed) 17:48:01|NO.3845

ifじゃなくて、switchマクロをつかったものです。
問題外な回答かもしれないですけど、一目見ただけでなにやってるかわかるかと思います。


switch mapx.data case 1 case 5 case 9 case 13 case 17 pp+=12 swbreak swend

個人的に、ifでこういう処理をするとどうしてもややこしくなるような気がします。
でも行数も増えちゃったので、結果的には省略は出来ていないですね・・・。



AC

リンク

2006/11/29(Wed) 21:53:54|NO.3852

># 自分の分からないことに「初歩的」とかつけられるハズないんだけどなぁ...
自分が分からないことでも初歩的といえるものはある。
例えばif文。これはプログラミングでは基本的なことで初歩的といえるが、
使い方などがよく分からない人もいるだろう。



kanzaki

リンク

2006/11/30(Thu) 02:48:08|NO.3857

本題とは趣旨が違いますが、猫太様のようにcaseを使って行う場合は
私の環境に於いて、ifで比べたときよりも2%位遅かったです。
処理が増えればもっと差が出ると思いますが、、、 全然問題にならない範囲差ですから
変に省略するよりも、猫太様の解が“見易さ”“訂正の容易さ”の点でよいような気がします。

ただ、私が想像するに、AKI様がお聞きになられたかったのは
「同一の変数に対しての比較に、効率的な記述方法が無いのか?」
ということのように思われます。
その方法があれば、私も是非に知りたい物です

(今回は、偶々ビットパターンに法則性があったに過ぎません)



トホホッティー

リンク

2006/11/30(Thu) 06:09:10|NO.3862

ビットパターンに法則性がない場合、配列変数を駆使して比較
するのはどうでしょう?


h.0=1,4,5,7,9,11,13,16,18 repeat 9 if mapx.data=h.cnt:pp=pp+12 loop
これなら少し時間はかかりますが、比較しやすいと思います。



AKI

リンク

2006/11/30(Thu) 08:42:47|NO.3870

いろいろありがとうございます
スクリなんですが以下
mmx = mx.data/32
mmx2=(mx.data+16)/32 mmy = ((my.data/32)*24) mmy2=(((my.data+30)/32)*24) pp = mmx+mmy pp2= mmx2+mmy pp3= mmx+mmy2 if (mapx.data=1)|(mapx.data=5)|(mapx.data=9)|(mapx.data=13)|(mapx.data=17):pp=pp+12:pp2=pp2+12:pp3=pp3+12 if (mapx.data=2)|(mapx.data=6)|(mapx.data=10)|(mapx.data=14)|(mapx.data=18):pp=pp+(24*12):pp2=pp2+(24*12):pp3=pp3+(24*12) if (mapx.data=3)|(mapx.data=7)|(mapx.data=11)|(mapx.data=15)|(mapx.data=19):pp=pp+(24*12)+12:pp2=pp2+(24*12)+12:pp3=pp3+(24*12)+12
内容としては背景画像(配列変数24*24)を4分割表示するようにしているので(12*12表示)
自キャラ座標からppという配列インデックスを取得する為の処理です
それから、csvstrで通行コード処理をする為のif文です
(過去の「MMO基本動作確認」と言うスレがEXEにしたものです。)
一応、いまはmapx.dataはNO19までですが開発していくとmapx.dataは増えると思いますので
そのときに、効率的に悪いかなと思いましてお聞きしています。



ハトサブレ

リンク

2006/11/30(Thu) 14:36:53|NO.3871

法則性があるのならその法則に対応した式をお考えください。
マップチップナンバーが増えるのならば、それに対応した式をお考えください。
また、これまでの省略に関する意見をとりいれたのならなにかしらできるはずです。
マップチップによる例外もでてくると思いますのでその場合は個別に式をおたてください。
応用することも出来ると思いますので、応用力をつけてください。

法則性がある場合、以下のソースで20以上でも大丈夫になると思います。

mmx = mx.data/32 mmx2=(mx.data+16)/32 mmy = ((my.data/32)*24) mmy2=(((my.data+30)/32)*24) pp = mmx+mmy pp2= mmx2+mmy pp3= mmx+mmy2 a=mapx.data a=a\4 if (a=1):pp=pp+12:pp2=pp2+12:pp3=pp3+12 if (a=2):pp=pp+(24*12):pp2=pp2+(24*12):pp3=pp3+(24*12) if (a=3):pp=pp+(24*12)+12:pp2=pp2+(24*12)+12:pp3=pp3+(24*12)+12



AKI

リンク

2006/12/1(Fri) 08:26:49|NO.3897

こんにちは
ハトサブレさん
このスクリだと、mapx.dataが1の場合
1÷4=0.25で余り0になりませんか?


if mapx.data=(1|5|9|13|17):pp=pp+12
こういう式ができれば直感的に書けそうですが・・・
カッコ内のパラメーターで処理分岐などもできたら・・・
やはりむずかしいのかな(要望になってきた)



トホホッティー

リンク

2006/12/1(Fri) 08:43:51|NO.3898

横から失礼します。

a=a\4

はa/4ではないですよ。
0¥4=0
1¥4=1
2¥4=2
3¥4=3
4¥4=0
5¥4=1
6¥4=2
7¥4=3
8¥4=0
というようになるものだと思われます。
計算式自体から勉強しましょう。



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