投稿

10月, 2023の投稿を表示しています

ハイパーロボットの解法のアプリ上での実装についてのメモ2

 前の投稿 の続きです。 直進パズルオンライン のシングルプレイに答えを表示させる機能を付けました。 【簡単なアルゴリズム説明】 【実装中で苦労したこと】 【他のアプリとの違い】 を残しておきます。 【簡単なアルゴリズム説明】 1.準備 まず、壁の配位、コマの配位を管理する変数(配列を)用意する。壁の配位は一回ステージが決まれば不変ですが、コマの配位は1手動かしたら変わるので、別の変数(配列)に用意しておきます。また、あるコマをある方向に一手動かし、動かした先のコマの配位を保存できるようなプログラムも作っておきます。 2.一筆書きでゴールできるか判定するプログラムを作る ゴール対象コマを動かして、一筆書きでゴールまで到達できるかを判定するプログラムをまず作ります。ゴールの位置が決まればゴール対象コマも決まり、コマたちの初期位置C[手数=0]から考えて、ゴール対象コマが動ける方向を元に、1手動かして実現できる配位C[手数=1]が決まります。C[n]から動ける方向をそれぞれに対して探し、C[n+1]を作っていくと、(あれば)ゴールできる手順が見つかります。これだけでも体感で1/2くらいの確率でゴールできる手順が見つかります。もちろんこれが最短とは限りません。実現される配位C[n]の大きさはそこまで大きくなく、C[n]からC[n+1]は最大でも3倍にしかならないからです。というのも、まず動ける方向が原理的に4方向が最大で、壁の方向には動けない&来た方向には戻らない、という制限があるので、C[n+1]はC[n]の2,3倍程度の大きさしかありません。例えば2手ずつ増えるとして、10手先まで計算しようとすると、2の10乗=1024程度の計算量になりますが、これはそこまで大きくなく、この一筆書きプログラムは何回も呼んでもそこまで時間はかかりません。 3.総当たりでゴールできるプログラムを作る ゴール対象コマでやった方法を、全てのコマに対して行います。初期位置C[手数=0]から、1手動かして実現される配位C[手数=1]を作り、全て保存します。C[n]からC[n+1]を作る時も同じ方法で、おおよそ10倍くらい配位の数が増えていきます。というのも、例えば5コマある場合、1コマあたり2,3方向しか動けず、以前実現した配位はC[n+1]に入れないので、おおよそ10倍程度になります。なので、

ハイパーロボットの解法のアプリ上での実装についてのメモ

イメージ
ハイパーロボットの説明書には、 "Note: Most situations on the gameboard can be solved in less than 10 moves; but sometimes, a situation will arise that requires 20 or more moves." 「ほとんどの盤面は10手以下で解けます。ただし、時々20手以上かかるような盤面もあり得ます。」 とあります。ハイパーロボットや 直進パズルオンライン をやったことがある人はわかると思いますが、10手以下ばかりの解法を思いつき続けることはないと思います。(それができる人はすごく上手です!) 果たして本当にそうなのか、プログラムを書いてみました。日頃慣れているpythonで書いてみたところ、わりとすんなり動くものは作れました。基本的には総当たりで、なるべく効率よく解けるように実装しました。それで実際問題を解かせてみると、見事に10手以下の解がほとんどでした。すごい。 せっかく書いたし、 直進パズルオンライン にはシングルプレイがあるので、答えを表示できるようにして、答えを見るためにリワード広告を見る必要がある、という実装をしようとしてみたところ、unity editor上でさえ動きが止まってたまにフリーズしたりするので、スマホ上ならなおさら負荷が大きすぎてダメなのでは?と思い、一旦作業を中断しました。 ただ、google playには Ricochet Robot Solver というハイパーロボット(ricochet robot)の問題を解くアプリがあることを思い出しました。インストールして動かしてみたところ、google chrome上で動かしていると表示されました。更に、コードはgithub上にあると書いています。なので最初はスマホアプリ内で計算しているのではなく、どこかのサーバで計算して結果だけダウンロードしているのか?と思ったのですが、そうではないようです。(オフラインで起動しても解いてくれる)ということはスマホで十分計算できるということなので、私のunity上でのコーディングが間違っているか、私の考えているアルゴリズムが負荷が大きすぎるのか、ということになる気がするのですが、今はよくわかっていません。 ちょっと頭を冷

unityroomでlocalizeパッケージが使えない、解決方法

多言語対応のために、unityのlocalizeパッケージを使って実装しました。それ自体は調べたらたくさん情報が出てきてその通りすればOKなのですが、unity editor/androidの実機上ではちゃんと多言語対応できたのですが、webGLでビルドしてunityroomにアップロードしたところ、No translation foundと出て表示がおかしくなってしまいました。色々調べたところ、 むじ様の記事 に原因・解決方法が書かれていました。ただ、私にはこの解決法は難しすぎたので、泥臭い方法で解決(?)しました。というのも、unityroomで遊ぶユーザは日本人しかいないという仮定のもと、localizeは諦めました。(storeに出すものはlocalizeしている) 私の場合、localizeのコンポーネント(LocalizeStringEvent)を付与しているのはすべてUIだったので、unity editorのcanvas上でLocalizeStringEventコンポーネントを持っているUIをshiftキーを押しながら選んでLocalizeStringEventを無効化しました。 他にも、localize関係の変数の読み込み部分はコメントアウトしました。 今回は3つのシーンがあったのですが、最初のシーンだけ上記の対応をするだけでおかしくなった表示は戻りました。 以上の対応をすることで、localizeする前の状態、つまり日本語だけのアプリがunityroom上で遊べました。

写真・イラストからドット絵を作る方法

ドット絵って良いですよね。私が小学生の時はスーファミが全盛期だったので、ドット絵には非常になじみがあります。私のゲームでも使いたい!と思ったので、ドット絵を簡単に作る方法を調べました。 【概要】 1.写真からドット絵: ドット絵こんばーた である程度のドット絵を作る 2.ドット絵の編集: Piskel で読み込み、編集する 3.参考:ドット絵の心得 【1.写真からドット絵: ドット絵こんばーた である程度のドット絵を作る】 ドット絵こんばーた を使えば、非常に簡単にドット化(低解像度化)ができます。色を二色にすれば白黒、色数を増やせば元の画像に近い色使いでドット化できます。作られたドット絵をローカルにpngとかで保存しておきます。 【2.ドット絵の編集: Piskel で読み込み、編集する】 Piskel を使えば、1.で保存した画像を読み込み、編集できます。ソフトでドット化した画像はところどころ違和感があるので、手で直します。Piskelは無料ですが、 Aseprite は現在19.99ドルで、有料な分機能が良いらしいです。 【3.参考:ドット絵の心得】 ひろはすさんのYoutubeチャンネル のドット絵の描き方講座が参考になりそうです。