ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2012年04月23日

JavaScript 重複のない擬似乱数テーブルをCやJavaソースコードの配列として使える形で発生させる

ついでなので、これも作ってしまおう。

乱数が必要なんだけど、結果を再現可能なものにしたい、という場合に使う擬似乱数テーブル。
数値には重複がないことが望ましい。つまり、256個の配列に、0〜255の整数全てが存在しているが、並びは出鱈目の状態。

なんに使うかといえば、例えばゲームのステージ再現。
この擬似乱数テーブルを使用して、ステージの開始時に敵やアイテムの配置を決める。
そうすると、擬似乱数テーブルのどこから使い始めたかというランダムシード整数値1つだけで何度でも同じステージを再現できる。
難点といえば周期があることだが、乱数を必要とする個所がテーブルの長さに対して割り切れる数値になることは稀である。
周期が心配であれば、数値の最大値を素数-1にすればよい。

開発言語の乱数関数のランダムシードを使えばいいかもしれないが、ランダムシードと乱数の発生パターンが実行環境、バージョン全てで同じになるか不安要素がある。またクロスプラットフォームの場合はランダムシードを同じにしても乱数の発生パターンは同じにならないのが普通であろう。

そういうわけでここに置いておく。
posted by みこあいさ at 18:19| JavaScript

JavaScript ローカルファイルをC,Java等に使える形でダンプ

前回、バイナリデータをソース中に置く目的で、ローカルファイルをBase64エンコードするJavaScriptコードを作ってみたが、考えてみたら普通にそのまんまダンプするやつだって結構使ってるじゃん、ということに気付いたので、

ついでにこれも作ってみた。

Javaで16進byteの配列をソース中におくとき、byteがsignedなんで、

byte[] ddd = { 0x00,0x40,0x80 };

で0x80だけエラーになったりして結構面倒だったりする。

もう今だけ通ればいいやー的に

byte[] ddd = { 0x00,0x40,(byte)0x80 };

としたり、
メモリなんてもったいなくないもん!と

short[] ddd = { 0x00,0x40,0x80 };

としたりしてその場その場をいい加減な態度でしのいだりするわけだが。

一応そのへんも考慮して、前置文字列として

(byte)0x

とおけば大丈夫にした。
posted by みこあいさ at 16:37| JavaScript

2012年04月21日

JavaScript Base64 ローカルファイル バイナリエンコード

バイナリファイルをBase64エンコードする必要にせまられることがよくある。
目的は、ソースコードにテキスト状態でリソースを組み込むこと。
たとえば小さめのjpeg画像をソースコードにテキストとして置く。
別のファイルに分けてファイルを読み込めばいいじゃないか、と思う人も多いかもしれない。
これは好みの問題。
できるだけワンパッケージにしたがる習性が自分にはある。
これをビルドするときには、他にはこのライブラリもくっつけて、includeして、コンパイラはバージョンはこれで、実行時にはこのファイルを同じディレクトリに置いて…
そういうのが好きじゃない。
単一機能のソースファイルはできるだけ少なく、できれば一本で。ライブラリは.lib、.jar1つだけ。そういう風にしたい。
ソースの全選択+ペーストでプログラムもリソースも全てをもっていけたらすばらしい。環境依存度が低ければもっとすばらしい。
だからバイナリデータをソースに埋め込みたくなることがよくある。
そのままのダンプをCであればunsigned char、Javaであればbyteの配列に置くこと方法もある。この方法のほうが実際のデータ量は小さくなる。
しかしこれだと、ソースコードの文字の数は格段に増える。例えばCで16進ダンプで並べたとすると1バイトの255は0xff,となるので、ソースファイルにバイナリサイズの5倍の文字列が挿入されることになる。置こうとするバイナリデータのサイズにもよるが、自分の場合は大抵は無視できないくらい大きくなる。
ソースコード自体もある程度は見通しよくしておきたい。
それでBase64。文字列にすればソースコード中にバイナリを効率よく置くことができ、Base64ではそれほど増えない。
Cなどクラシックな環境ではBase64を扱う関数は自分で用意する必要があるが大したコードでもないし、最近の実行環境はBase64エンコード・デコードを組み込み関数に持っているものも多く、取り回しも便利になった。

…で、バイナリをBase64にして、ソースコードに埋め込むにはソースコードとしてできるだけそのまんまコピペできるようにダンプしてほしいのだが…
必要になったとき、ネットのどこかにあるだろ、とタカをくくって探したけど見つからなかった。
そのときはしょうがないので、JavaでBase64ダンプし、それを手作業で分割してソースにした。
だけど、これでやっぱり元のバイナリを差し替えたい、となったら正直またあの作業はご免こうむりたい。

そういうわけで今になって自作。

ついでに興味があったのでローカルファイルをJavaScriptで扱ってみることもやってみた。元にした情報がHTML5の紹介記事のところにあったので、HTML5でないと動かないかも。
HTML5はIEでは動かないので念のため。
posted by みこあいさ at 01:02| JavaScript