SMGほるもんX 2018/11/25 03:28

久しぶりにCF2.5の解説書くよ!と見せかけて近況報告?

皆さんこんばんは
4ヶ月ぶりにブログ更新しているしおさばです。

ツイッターを見ている方はご存知かと思いますが1ヶ月チャレンジは見事に失敗致しました。
一応チュートリアル的なステージ1のみの成果物を上げときますね。

Download

とまあそんなこんなで4ヶ月経った現在でもまだ完成しておりません。

しおさば@SMGほるもんXの中の人@smghormonex
本日の進捗。やっとOPデモが出来上がった。たったこれだけつくるのに1ヶ月以上かかったが実作業は24時間あれば足りるくらいなのがつらい。正直精神的な障害の方がでかかった。現在のやる気を維持したまま残るデモを完成させ年内リリース目指す…

2018/10/30 03:53:44

OPやらEDやらはそれなりにできているのでいましばらくお待ち下さい。

そして現在はスコアのランキング表示をしようと思ってランキング画面を作成中です。
標準のハイスコアオブジェクトはどうにも使いにくいし、エクステンションなどを使ったものはいろいろと制限がかかる場合があるしで、もう思い切ってCF2.5の基本的な機能だけで作ってみたらいいんじゃねと作ってみました。

新規スコアは記録されてるスコアと比較して高いかどうかで書き変えてやれば良いだけなのでサクッとできました。
可変文字列も利用して10件までならスコアネームの保存もできます。
ついでに暗号化保存にも対応したのでスコアの改ざんもできないようになりました。
オブジェクトイベント化もしてあるので、あとはサマンサのドキドキトレジャーハンティング ウェルカム・トゥ・ザ・ジャングルにコピペして表示画面つくればサクッとできるはず。

というわけでハイスコア管理のmfaファイルを置いておきます。

Download

一応バックアップも兼ねてのうpですが自由に使っていただいで構いません。
標準のプレイヤー1のスコアに挿入したいスコアを入れてフラグを有効にすれば自動でランキングに挿入してくれます。
もちろんスコアの参照先を変えてやればいろんな所からスコアを持ってくることができます。
後はカウンターでもなんでも良いので対応する変数の値を参照して表示してやれば簡単にランキング表がつくれます。
その際何位に挿入されたかも判るので強調表示なんかにもつかえます。

と、まあそんな感じでハイスコア管理に関しては思ったよりも簡単にできてしまったのですが、その前段階で苦労しました。

スコアの(非常に簡単な)挿入処理を模索していたときに、様々な並べ替えの処理が頭にありました。
ハイスコア管理も昇順に並べ替える作業と非常に近いものがあります。
で、そういった作業を調べていくと必ずどこかの段階で配列というものが出てきます。
配列自体はエクセルの表みたいなものなのでそんなに難しくはないのですがそれをどうすれば「簡単」に並べ替えなどができるのかずっと疑問に思っていました。
特にカードゲームなどで必要となってくるシャッフル、つまり重複しないランダムソートは自分にとって鬼門でした。
ところがハイスコア管理についてソートやら配列やら調べていたときにとあるランダムソートのやり方とCF2.5の高速ループなどの機能とがなぜだか繋がって、あれ?こうしたら簡単にできるんじゃね?となってしまったのでさあ大変、なぜかハイスコア管理そっちのけでランダムソートを作っていました。
まあおかげでハイスコア管理もかなりシンプルに組み上げることができたのでいいのですが相変わらず明後日の方へ進み出すと止まりません。

というわけで、出来上がった重複しないランダムソートのサンプルも置いておきます。

Download

ここからは解説になるので興味のない人はスルーしてね。

重複しないランダムソートのやり方としていままで思いついててもやらなかった方法があります。
0~5までの数値をランダムに並び替えるとしたらRandom(6)で0~5の数値を呼び出して出た値を変数に記録していけば良いのですがこれを単純に6回繰り返すだけだと同じ数値がでてくる確率は非常に高く重複せずに6回振ることはまずできません。

※ランダムは6ですが選択される値は0から数えるので5が最大値というPCならではのややこしさがあり書いてて混乱してくるのですが読む方も混乱してしまえしない様に注意してください。

そこで
1回目Random(6)をして出た値を変数Aに記録します。
そして2回目Random(6)をして出た値と変数Aを比較します。
出た値と変数Aが違っていればその値を変数Bに記録します。
同じであればもう一度Random(6)をして出た値と変数Aを比較します。
これを繰り返します。
3回目以降も記録する変数はC・Dと変わりますがやることは2回目と同じです。
ただし記録された全ての値と比較します。
つまり3回目は変数A・Bと比較、4回目は変数A・B・Cと比較するということです。
サイコロ遊びで既出の目が出たら振り直すというルールで1から6まで順番を決めると言えば想像しやすいでしょうか。
実際サイコロの様に6つしか項目がなかったり、それほど多くない数なら昨今のPCの処理速度があれば問題はないでしょう。
しかしそれが千…万…となっていくに従って振り直しの回数が増えいつまで経っても終わらないということになります。
じゃあ2回目はRandom(5)でやればいいのではと思うのですがそれはあくまで1回目に5が出た場合であって0~4の数値は被る可能性があります。

以前か自分はここで詰まっていました。
これを華麗に回避する手段が思いつかなかったのです。

ところが今回ひょんなことからこんな図を見かけました。

ABCDEF



Random(6)で一つピックアップ

ABC_EF

D

間を詰めてRandom(5)でピックアップ

ABCEF_

D

A_CEF_

DB

間を詰めてRandom(4)で…

以下繰り返し。

これを見たときに配列とランダムとCF2.5(高速ループ)とがつながったのです。
思考が繋がってしまえばあとはそれを形にするだけでなにも難しいことはありません。
いままでずっと思い悩んでいたことが1日もかけずに出来上がってしまいました。

配列エクステンションを利用したプロトタイプ。↓
>

しおさば@SMGほるもんXの中の人@smghormonex
> 本日の進捗。ハイスコア絡みで重複しないランダムソートを作ることができた。これでカードゲームだってつくれるぞ。もっとも今作ってるゲームでは使わないんだけどね。動画はBをCへランダムに並べ替えています。
>
>
> 2018/11/12 02:28:01

その後理解がすすみオブジェクト一つの変数で重複しないランダムソートを組み上げたのが今回あげたやつです。

あまり解説になってない上に書いてるスタンスが右往左往していますがまあそんな感じで最近は良い方向で開発がすすんでいます。

いかがでしたか?
CF2.5を使っている皆さんの役に立つかどうかはわかりませんが少なくとも自分が忘れたときには役に立つ記事になったのではないでしょうか。

と、タイトル見て読んだらなんの結論もでてなくてクソ腹の立つメディアサイトの決まり文句で締めておけば支離滅裂でも無問題。

そういうわけで年内にはサマンサのドキドキトレジャーハンティング ウェルカム・トゥ・ザ・ジャングルを発売できるようにがんばります。

アデュー!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

最新の記事

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索