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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0315
なかじースコアの表示について質問です!14解決


なかじー

リンク

2011/3/15(Tue) 23:08:34|NO.37614

昔のゲームのように、
000005300  は5300点という表し方にするにはどうすればいいのでしょうか?
つまり、もし500点とったら右上とかに000000500とか
2000点とったら000002000 とかこういう感じです。
お願いします。

分かりにくかったらご指摘お願いします。



この記事に返信する


てれてれ

リンク

2011/3/15(Tue) 23:13:54|NO.37615


mes strf( "%09d",123 )
詳しくはヘルプを見てください。



ひらまる

リンク

2011/3/16(Wed) 00:01:47|NO.37616


repeat スコア = cnt mes strf( "%08d", スコア ) await 1 redraw 1 redraw 0 color 255,255,255 : boxf color 0,0,0 pos 0,0 loop
なるほど これは便利ですね
しかしいずれ欲が出て、自作の数字フォントでスコア表示したくなるんですけどね〜



玄冬

リンク

2011/3/16(Wed) 09:45:19|NO.37619

>しかしいずれ欲が出て、自作の数字フォントでスコア表示したくなるんですけどね〜


buffer 1, 10, 200 color : boxf color $ff repeat 10 mes cnt //pos 0, 18 * cnt : picload "./img/" + cnt + ".bmp" loop gsel 0 repeat v_score = strf( "%08d", cnt) dim v_score_fig repeat strlen(v_score) v_score_fig(cnt) = int(strmid(v_score, cnt, 1)) loop redraw 0 color 255,255,255 : boxf foreach v_score_fig pos cnt * 10, 20 gmode 2 gcopy 1, 0, v_score_fig(cnt) * 18, 10, 18 loop await 1 redraw 1 loop



晩御飯

リンク

2011/3/16(Wed) 10:02:41|NO.37620

どっちが速いんでしょうか。

#define KETA 8 buffer 1, 10, 200 color : boxf color $ff repeat 10 mes cnt //pos 0, 18 * cnt : picload "./img/" + cnt + ".bmp" loop gsel 0 repeat score = cnt // スコア保存 redraw 0 color 255,255,255 : boxf repeat KETA pos ( KETA - cnt ) * 10, 20 gmode 2 gcopy 1, 0, score \ 10 * 18, 10, 18 score /= 10 loop await 1 redraw 1 loop



なかじー

リンク

2011/3/16(Wed) 14:14:24|NO.37622

わあ、すごいです!
こういうのを探してたんです!
てれてれさんありがとうございます!
他の皆さんもいろいろなスコア表示の方法?を
コメしてくださりありがとうございます!
ホントに助かりました!



f3d

リンク

2011/3/16(Wed) 23:27:19|NO.37637

ちなみに数字の桁数を得るなら、
log(x)/log(10)-1ででます。



玄冬

リンク

2011/3/17(Thu) 00:22:43|NO.37638

>晩御飯さん
速さはわかりませんが、変数の数が少ない分
そちらに軍配が上がりそうですね。

>f3dさん
いろいろと間違えられていますよ
まず細かいことですが"桁"の概念が存在するのは"数字"ではなく"数"です。
HSP標準の自然対数関数はlog()じゃなくてlogf()です。
そして対数による桁の求め方はlog_10(X)"+"1です。(log_10は常用対数)

なのでhspで書くなら
1 + (logf(x) / logf(10))

となります。 ただし、
x = 1000 : mes 1 + (logf(x) / logf(10))
とするとわかるようにこの方法だと整数に直したときに狂いが出ます。

十進記数法での桁数を求めるなら
strlen(str(x))

を用いたほうが無難だと思われます。



なかじー

リンク

2011/3/17(Thu) 14:08:41|NO.37644

うをっ、さらに補足などありがとうございます!
ゲームにやくだてようとおもっております^^



てれてれ

リンク

2011/3/17(Thu) 16:35:15|NO.37646

>正しく計算できているようですが、どうでしょうか。

x = 999 : mes ""+x+ " :" + int(1.0 + (logf(x) / logf(10))) +" 桁 " x = 1000 : mes ""+x+ " :" + int(1.0 + (logf(x) / logf(10))) +" 桁 " x = 1001 : mes ""+x+ " :" + int(1.0 + (logf(x) / logf(10))) +" 桁 "
狂い生じてるんですけど・・・



玄冬

リンク

2011/3/17(Thu) 17:47:56|NO.37647

???
なんだろう。
見ない間にレスが一個付いて、さらに消されたのでしょうか?

たぶん対数による求桁の話の続きでしょうかね。

どうしても対数による求桁を行いたいならこんな裏技がありますよ。
mes 1 + str(logf(x) / logf(10))

doubleからintに直接変換すると時々値が狂うんですが そういう時は、一旦strにしてからintにすると狂わずに整数にできます。 (今日になって思い出しましたorz)



てれてれ

リンク

2011/3/17(Thu) 18:26:37|NO.37648

>doubleからintに直接変換すると時々値が狂うんですがそういう時は、一旦strにしてからintにすると狂わずに整数にできます。 (今日になって思い出しましたorz)

x = 999999 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999989 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999990 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999991 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999992 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999993 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999994 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999995 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999996 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999997 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999998 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 " x = 9999999 : mes ""+x+ " :" + int(1 + str(logf(x) / logf(10))) +" 桁 "
狂い生じてるんですけど・・・



玄冬

リンク

2011/3/17(Thu) 19:56:30|NO.37651

あー…HSP自体の計算が狂っていることに対してはどうしようもできませんね。

x=1000 t = (logf(x) / logf(10)) mes 1.0 + t ;double mes 1 + t ;double→int mes 1 + str(t) ;double→str→int
私が示した方法は上記のように単に実数と整数で結果が違うときに
実数側に計算結果を合わせながら整数にする方法なので

x=999999 t = (logf(x) / logf(10)) mes 1.0 + t ;double mes 1 + t ;double→int mes 1 + str(t) ;double→str→int
のようにそもそも実数での計算がずれればずれますね…(考えてなかった)
理論値ではt<6なので(EXCEL曰く5.999999566)、
int(str(t))=5となってもらいたいのですが
HSPでは実数型の変数は小数第7位で四捨五入
されるので6になってしまうようですね。

結論としては
1 + (logf(x) / logf(10))
で数学的には常に桁数が求められるが
HSPの計算精度では1〜999998の範囲でのみ有効である。 したがってHSP上で求桁するには
strlen(str(x))
とするしかないということですね。

>てれてれさん
精度チェックお疲れ様でした。



gool

リンク

2011/3/17(Thu) 21:40:07|NO.37656

HSPの計算が狂っているというわけでなく丸め誤差の問題です。
だから普通にこうでいいでしょ。

x=1000 mes int(1.00000000001+logf(x) / logf(10))



玄冬

リンク

2011/3/17(Thu) 23:30:22|NO.37657

ああ、確かに!



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