トランプ並べろ

ピクチャ系小技とビット積

l7_1

l7_2

このように、トランプを裏から表にひっくり返す処理を考えましょう。返す順番はランダムで。
(トランプ絵札の画像はニルバーナ展覧会機関からお借りしています。)
(トランプ素材のダウンロードはこちらから。)

処理例1 – とりあえず順に表示

【起動条件:呼び出し】

l7_3

こんな風になりました。順番にめくるだけでも気持ちいいですね。めくるアニメーション(61-66行)もつけてみました。
ここではファイル名を【マーク】【数字】.pngにしましたが、使いやすいように決めてください。
0~51までループで数字を増加させていって、
横位置=数字%13
縦位置=数字÷13
数字=横位置+1
で求めています。
(1~52だと縦横位置の結果がおかしくなります。考えてみるか、実際にやってみてください。)
お得意のディレイを使っているので、こういう処理でも1フレームで完了して次の処理に移れます。

ひな形は完成したので、次にランダムでめくることを考えてみましょう。

処理例2 – ランダムその1、CDBで管理

【起動条件:呼び出し】

l7_4

ランダムでめくれました。 ただ乱数でめくるだけでは同じカードを何回もめくることになるので、 CDBをひとつ使ってめくってあるかどうかを判断しています。
28行目からの処理でCDBを初期化し、41行目からのループでめくってあるかどうかを判断し、 なければループを抜けてめくる処理をしています。

【NOTE:回数付きループと普通のループの使い分け】

回数付きループは、その名の通りループ回数が決まっている時に使用します。例えば回数付きループでCDBを初期化などする時

のようになりますが、通常のループだと

のように、ちょっと長くなります。
(データベースは0から始まるため、最後のデータ数値はデータ数より1小さいので-1の処理が必要。 また、通常のループは終了条件を分岐で設定する必要がある)
これだけ読むと回数付きのほうが有利そうですが、回数が決まっていない場合 (処理フレームが400,000を超えたらループ中断とか) があったり、ループが2重3重になってきてループ中断が頻繁に起こる場合などは、 回数付きループは【一度ループを抜けると回数がリセットされる】という特徴があるために向いていません。
ループの仕組みをしっかり理解するためにも、最初は回数付きループは極力使わずに通常のループ+終了条件で、変数を使って組むのをおすすめします。

処理例3 – ランダムその2、コモンセルフで管理

【起動条件:呼び出し】

ランダム処理部分のみ。 たった52枚のトランプのためにデータベースをひとつ使うのも癪なので、コモン内で解決してみました。 Cself30~82をフラグに充てています。変数呼び出し値で管理。

処理例4 – ランダムその3、ビット積で管理

【起動条件:呼び出し】

ランダム処理部分のみ。 コモンを52個使うのも癪なので、7個で済むようにしてみました。 Cself24~27をフラグに充てています。ビット積と変数呼び出し値、一時変数で管理。
正直なところ、このトランプの既出かどうかを判断する処理時間は CDB<Cself<ビット積です。変数呼び出し値を使ったり掛け算を繰り返したりするよりは、1回データベースを参照するほうが早いからです。 考え方の参考になりそうなので、色々な方法を試してみました。内容によってはビット積やCselfのほうが早かったり便利だったりしますので、方法は知っておいて損はありません。

【NOTE:ビット積って?】

例えば、この処理ではスペードの2、3、4、13が既出の場合にCself24には【4110】という数値が入っています。
これは2進数に直すと【1000000001110】です。 よく見ると分かると思いますが、右から数えて2、3、4、13番目の数字が【1】になっているのが分かります。 0か1だけのフラグなら、ひとつの変数で30個ぐらいまで管理出来るので、使いこなせると非常に便利です。
例えば、【フラグ1、4、5、8が有効な場合にだけ動く並列イベント】や 【5×5のオンオフパズル】など、変数やデータベース・分岐などを多めに使うイベントや 起動条件も簡単に作れるので、興味があれば調べてみてください。
【2進数】【ビット積】あたりで調べると色々出てきます。

はじめにお読みください

ここはWOLF RPGエディター(通称ウディタ)のイベント作成において、 ひとつのお題に対していくつかの考え方を示すページです。正解や不正解ではなく、色々な考え方を示していけたらいいなと思っています。詳しくは以下をお読みください。

続きを読む