このブログ内を検索可能

2018年8月23日木曜日

メイドイン俺について

さすがに今となってはもう知っている人すら少ないとは思うが、我々はDS好きだった世代で、
メイドイン俺とかいうゲームがニンテンドーDSで発売されていた。

これによって我のあ遊期間(詳しいことは今はふせておく)である2009年から2011年の初期に相当する時期に、このゲームをやっていることが判明して、めでたく我の過去の歴史入りすることができたわけである。

お盆の休み中どこもなかなかいけず暇だった我は、強引にも
8月17日 レゴランド、リニア鉄道館
8月18日 USJ
8月19日 天王寺
8月20日 今昔館
8月21日 くらずし
8月22日 高野山
とおでかけにおでかけを重ねまくったわけである。
8月23日、24日は台風によっていけなくなるであろうと懸念していたので。
やっぱり和歌山の駅のすさまじさは大変。ホームは曲がってるし、駅と電車のすきまはとんでもないわ1時間に1本しか来ないしで。
高野山駅から大門まで誰もいない道を歩こうと意気込んでたら途中で謎の車に拾われてしまったし。誘拐される可能性もあったわけだがそのときは車から強引に途中下車するしかあるまい…。

なお9月初旬にナガシマ、9月10日までに東京めぐりを18切符併用で敢行する見通しである。

さて、そのメイドイン俺というゲーム、実は我には小学生の頃、Mくんという男の友達がいて(性格はおだやか。我自身がそういう性格だったので、女友達が多かった。誕生パーティーに男として自分だけ呼ばれる、というのもあったし、自分の自作コースなどを作って女子や先生に気に入られていた。なおその自作コースというもの、こちらには独特の世界観があり、それは年齢とともに変遷しているわけだが、今でも健在。世界樹の迷宮Xでは自分に「暗黒の帝王」とかいうアレ系の名前をつけることをためらわない我。
ちなみに中学以降は男子校だったので女とか関係ないし。理系なのでしょうがないわ…)

かつてそのメイドイン俺というゲームをやりはじめた時期は、ゲームの創作意欲もあった。
子供の頃からVIPマリオとかにあこがれていたわけである。しかし当時はどうすればいいのかわからなっかたが、2011年1月?頃になるとスーパーマリオフラッシュの自作ゲームから2月にRPGエディターを発見し、その後LunarMagicをはじめとするマリオ改造の能力を身につけ、
中学時代には自作コースをとある人物にプレイさせるという時代になった。
小学校時代はひたすら自作コースをえんぴつやボールペンでかき綴った。
それをとある女に渡してしまったのだが、それが我の描いたゲームの1ワールドからが記録されており、こちらとしては重要な"古書"であったのに取り返せず残念。あれは2007年とかの話なので、kいっと今頃そんなものはわすれさられてとっくに焼却炉行きやろ…かなしい

メイドイン俺をやった当初はなんか普通に「キッカケ」だの「スイッチ」だのいう機能があって、一応その時代でもある程度把握してやっていたらしい。
なおこれらはRPGエディターでいうならば、「条件分岐」「変数」にあたるものと思う。
何気にこのゲーム、プログラミングを扱っていたりする珍しいゲーム。
ただし短い時間で、タッチしか出力手段がないため、ゲームの質はお察し。
すでに我にはアニマロッタの画面の動作くらいなら理論上時間をかければできるくらいの能力は有しているつもりだが、当然そんなことはこのゲームではできない、が
くみたて道場、とかのアイデアはなかなかやるやん、と思った。

ちょっとここで余談。
たとえば「素数を生成するプログラムをつくろう」といわれるとどうするか。
素数というのはとりあえず、自身と1でしか割り切れない値、というもの。(1は例外)
まず、2,3は素数となる。
4は2という素因数をもつのでこれは合成数。
5は素数。
6は2や3を素因数に持つので合成数。
これらをかんがえると、素因数は素数なのはまあ定義によると分かることだが、その素因数をどうやって持ち出してくるか。

ここから、帰納的にやっていく、つまりループや、という考えにいたる。
どこかに素数リストを作っておいて、そこから一回ずつ素数かどうか判定したい照会していけばいいのではと。ただずっとやっていると大変なので、例として100を判定したいなら、もしその正の平方根10までで素数かどうかを判定して、そこからはもう判定しないという風にしてもよい。
なぜなら、その正の平方根までに素因数をもてば、すでに合成数が確定。
もし持たなかった場合、合成数であると仮定すると正の平方根より大きいところで素因数をもつことになる。そうすると、それが素因数であることから、ある自然数nを用いて、その素因数をmとするとnmで表せることになる。でその素因数mが正の平方根より大きいという仮定から、nは正の平方根より小さい。しかしnはやはりnmで表せているので素因数であり、もともとの仮定に反する。
よってそのような素因数は存在しない、ということで、
正の平方根まで繰り返せばよいというのが裏付けられる。

たとえば73が素数であることを判定しようとおもうならば、
その正の平方根はどうやってもとめるか。
実際にはだいたい平方根を自然数で近似しておけばよいので、
1から増やしていき、その2乗を計算。1,4,9,16,25,36,49,64,81となるので、8と9の2乗の間。
ならば9までやっておけば十分だろう、という考えに行き着く。

この考えは重要で、たとえば1000000とかになってくると、上記の方法だと、2乗計算からの大小比較計算は1000までで済むが、普通にこれをやらないと1000000回の素因数の判定が必要。
自作アニマロッタ系統を制作しようとすると、あまりの処理と変数の多さに処理落ちもうやめてといいたくなるので、こういう処理を軽くするのは重要。

では73の場合の素数判定。
素数は2,3,5,7が正の平方根まであてはまる。よってこれだけ調べる。
もちろんどれも素因数ではない。あうと。
じゃあその素因数の2,3,5,7はどこから出てくる?というと、やはり7とかも7の正の平方根が2以上3以下なので、2を試してみる、というはなしに。
要するにはじまりは2ということが分かる。しかし2はもはや定義するしかない。

これで後はループをするとどんどん素数がわかっていくやったぁというわけである。

プログラム的には、

変数1-1に2を格納
ループ開始
pが素数か判定したい
変数1-1から1-n(nは1以上の値が格納されている部分まで)に格納されている値に対し
[pの正の平方根(求め方は上にかいている)を近似するプログラム]を実行して
1-1から1-nまでそれ以下かどうか照会。その平方根以下まで割ってみる。
あまりが0ならば合成数確定。どこかでそうなれば以降はループを脱しておく。
最後まであまり0のものがなければ素数。変数の新たな場所に(この部分に入るたびに+1するxを設定しておいてその値によって変数1-xという場所をしていしてそこにpを格納)
次、pをp+1とする。


これを有限回繰り返せば、n番目の素数は1-nに格納されている。分かりやすい。
しかも途中の素数も全部出てくる。いいのお

ただまあ、こういうプログラムは計算システムがすでに搭載されているときは有効だが、
そうでなければ非常に厳しい。
たとえばあまりがどうか、とかいうのは
例として70÷8をやる場合、シンプルなのは1から増やしていって商が8で64、商が9で72。なのであまりの定義(n=pq+rとした場合、0<r<p+1、pを商とする)により、商は8となりあまりは6。
なおもっとつきつめると8*8とかをどうするのかということになり、これは*の定義にもどって、8を8回たすとかいう話になってくる。
じゃあ8+8=16ってなんでやねん、となり、それは
1に1をたすと2、2に1をたすと3、…という風に数を定義し、その他繰り上がりなどについても定義する必要があってもはや大変。

ウディタは除算とかを普通にやってくれるのでよい。数学専門mathematicaはそこらのソフトとは比較にならないほどの計算システムを有する。

ちなみに我ははじめてたまごっちのプチプチおみせっちを購入して、2作目がのび太の恐竜2006、3作目がおいでよどうぶつの森だったと記憶している。