2018年2月16日金曜日

ゲームの作成状況31 各マスの配置座標決定

さて、さっそくブロックを配置してみた。2ゲーム目以降は、先にマスの番号を入れると座標を返す関数(返り値がひとつなので2次元の座標を返すために1000×X+Yとしている。Y<1000なのでこの値はただ一通りなのでOK)あとはこれとピクチャ番号を1ずつ増やす処理を行ってループさせるだけで、なんと簡単に80個のマスを配置できるということについ数日前気づいた。
右のプログラムはそれを記している。ほかのもこれくらいエレガント?にできるといいんだが、なにしえおキャンディドロップは規則性のない(本当はあるが、それを考えるのが面倒)、ビンゴボンバーも真ん中をくりぬいたせいでマスと座標との関係が簡単に表せず面倒だった。

余談
もしキャンディドロップの各辺がnマスの正六角形であるとして、半径をrとすると、、kマスめの中心座標はnとrを用いてどう表されるかというと…。(簡単のために一番左上の中心座標を(0,0)とする)
kには当然1以上何か以下の条件がつくが、ここでは省略。

p段目は階差数列や帰納的な考え方でちょっと考えると、(p-1)n+(p^2-3p+4)/2<=k<=pn+(p^2-p)/2を満たすようなkがp段目となる。プログラムで扱うならば、このpを1から増やして(ループ)いき、そしてこの範囲を満たすようなkがあれば、そのpが段数である。さて、段数が求まればY座標が判明する。正六角形なので、正三角形を考えると、1段降りるごとにY座標は2rSin[Pi/3]だけ増加する。(Y軸は下向きを正としている点に注意)すなわちSqrt[3]r増加することになる。これでY座標は確定。
問題はX座標である。実は、これは中心に行くと、X座標は減っていくが、その後は増えていく。いうなれば、n段目まではX座標が2rCos[Pi/3]ずつ減っていき、その後2rCos[Pi/3]ずつ増えていく。
さて、先ほど求めたpが、nまでであれば普通にX座標を減らしていけばよいが、nより大きくなる場合、別のループを作ってX座標を考慮しなければならないことになる。
一辺100マスのキャンディドロップをつくるなら、上の手法でいくだろうが、所詮は一辺10もいかないので、都度座標を定めたほうが好都合なのである。
あと気をつけるのが、Sin[Pi/3]は無理数なので、ウディタではこれを扱えない点に注意。たぶんSinコマンドで近似はできそうかもしれないが。うまくSqrt[3]rが整数に近くなるようにrを定めたりなど、これだけでもいろいろ苦労するものなのである。


今は
ただ緑ブロックを描画しただけだが、いずれはこれがなかなかうならせるほどのゲームになるであろうことを期待する。
なお、一応変数として160個用意して、前80個を各マスの内包する番号、後80マスをマスの種別(0がレインボー(未作成)、1が赤、…というふうに)
連鎖してピクチャを落とすのが難しくかんじるかもしれないが、これはただ単にピクチャのY座標を50増やし、それをループさせるだけであるから、実は簡単。しかもピクチャの置き換えも、ただピクチャ番号に8をたすだけ。処理の簡易化が期待できそうである。

新しいアニマ系ゲームの作成に伴うブログ移転

https://zisakukarako.blogspot.com/ というブログで、今度は自作カラコロッタをつくってみようということにした。 今度は自作アニマロッタ風ゲームでの反省を生かす予定。 どこまで続くかは不明。 さらに、自作アニマロッタまで作ろうと試みている...