投稿

ラベル(アルゴリズム)が付いた投稿を表示しています

【コルーチン】処理順を大事にしたい時、処理を待ちたい時に使うコルーチンについて

C#スクリプトで、 処理1 処理2 処理3 の順番に書いた場合、 もちろん処理1,2,3の順番で実行されるのですが、 処理1が終わった後に処理2が始まるわけではありません。 処理1が終わった後に処理2を始めたい場合、 コルーチンを使うと便利です。 これで処理1が終わったあと処理2を始められたり、 その間に〇〇秒待つ、などの処理もできます。 また、何かの入力をしたら次の処理が始まる、 などもゲームではよくありますが、これもコルーチンで対応できます。 これらのコルーチンの使い方は  スタジオしまづ様の解説動画 によくまとめられています。 以下もし時間があれば内容を書く。

ハイパーロボットの解法のアプリ上での実装についてのメモ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上でのコーディングが間違っているか、私の考えているアルゴリズムが負荷が大きすぎるのか、ということになる気がするのですが、今はよくわかっていません。 ちょっと頭を冷...