やたらと非効率に自作ゲームを作っていくブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

任意の区間、任意の個数の重複しない数字の並びを作るコモン

たまには真面目にウディタ触ってるんだぜアピール
「任意の区間、任意の個数の重複しない数字の並びを作るコモン」なるものを作ったので公開です。
かなり汎用性の高いコモンだとおもいます。

▼ 設定値 セルフ0~2は引数で設定する
■変数操作: CSelf0[最小値]
■変数操作: CSelf1[最大値]
■変数操作: CSelf2[生成する個数]

▼ 処理ここから
▼ 初期化
■文字列操作:CSelf6[返し値] = ""
■変数操作: CSelf10[格納した数字の個数] = 0 + 0
▼ ループ開始
■ループ開始
|▼ 乱数生成
|■変数操作: CSelf11[乱数] = CSelf0[最小値] ~ CSelf1[最大値]
|▼ 一時文字列へ入れる。+は誤判定を防ぐためにいれている(何の文字でも良い)
|■文字列操作:CSelf5[一時文字列] = "+\cself[11],"
|■条件分岐(文字): 【1】このコモンEvセルフ変数6 がCSelf5[一時文字列] を含む
|-◇分岐: 【1】 [ このコモンEvセルフ変数6 がCSelf5[一時文字列] を含む ]の場合↓
| |■ループ開始へ戻る
| |■
|◇分岐終了◇
|▼ 重複していない数字になっているので格納する
|■文字列操作:CSelf6[返し値] += 位置[CSelf5[一時文字列]]の文字列
|▼ 数字の個数カウント
|■変数操作: CSelf10[格納した数字の個数] += 1 + 0
|■条件分岐(変数): 【1】CSelf10[格納した数字の個数] が CSelf2[生成する個数]と同じ
|-◇分岐: 【1】 [ CSelf10[格納した数字の個数] が CSelf2[生成する個数]と同じ ]の場合↓
| |▼ 個数に達したので終了
| |■ループ中断
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】Sys108:[読]現フレームのコマンド処理数 が 400000以上
|-◇分岐: 【1】 [ Sys108:[読]現フレームのコマンド処理数 が 400000以上 ]の場合↓
| |▼ 500000回エラー回避
| |■ウェイト:1 フレーム
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇
▼ 余計な文字+を消去
■文字列操作:CSelf6[返し値] =<から文字列を置換> "+" → ""

▼ これで\cself[6]にはカンマ区切りで任意の区間、任意の個数の重複しないランダムな数列が入る
■デバッグ文:\cself[6]

▼ \cself[6]を返り値にしてあとはお好きに

割と苦労するとおもう重複しない数字を取り出し方。これで半年は苦しめられた気がします。あることをきっかけに再考し直したところ、僅かコメント24行(コメント文抜き)でかつ、汎用的に組めたので記念に残しときます。

具体的には「1~50の中からランダムで重複しない4つの数字を選ぶ」とか「1~8の数字をばらばらに並び替える(1~8の区間で8個の数値を取り出せば自ずとそうなる)」とかに使えますね。もちろん、ほかにも使い方次第で製作の幅はかなり広まる感じ。
いやこれ私的に今年最大のウディ大発見ですよこれ!(まだ1週間もたってないけど)

むしろ何故気がつかなかった・・・orz

追記はイベントコードです。
コピペしてクリップボード→イベントコード貼り付けすればそのまま使えます。
興味ある製作者の方はどうぞ
▼ セルフ0~2は引数で設定する
CSelf0[最小値]
CSelf1[最大値]
CSelf2[生成する個数]
▼ セルフ6が返り値。カンマ区切りで数値が出力される。
イベントコードはここから

WoditorEvCOMMAND_START
[103][0,1]<0>()("処理ここから")
[103][0,1]<0>()("初期化")
[122][2,1]<0>(1600006,0)("")
[121][4,0]<0>(1600010,0,0,0)()
[103][0,1]<0>()("ループ開始")
[170][0,0]<0>()()
[103][0,1]<1>()("乱数生成")
[121][4,0]<1>(1600011,1600000,1600001,24576)()
[103][0,1]<1>()("一時文字列へ入れる。+は誤判定を防ぐためにいれている(何の文字でも良い)")
[122][2,1]<1>(1600005,0)("+\cself[11],")
[112][3,4]<1>(1,555248134,1600005)("","","","")
[401][1,0]<1>(1)()
[176][0,0]<2>()()
[0][0,0]<2>()()
[499][0,0]<1>()()
[103][0,1]<1>()("重複していない数字になっているので格納する")
[122][3,0]<1>(1600006,258,1600005)()
[103][0,1]<1>()("数字の個数カウント")
[121][4,0]<1>(1600010,1,0,256)()
[111][4,0]<1>(1,1600010,1600002,2)()
[401][1,0]<1>(1)()
[103][0,1]<2>()("個数に達したので終了")
[171][0,0]<2>()()
[0][0,0]<2>()()
[499][0,0]<1>()()
[111][4,0]<1>(1,9000108,400000,1)()
[401][1,0]<1>(1)()
[103][0,1]<2>()("500000回エラー回避")
[180][1,0]<2>(1)()
[0][0,0]<2>()()
[499][0,0]<1>()()
[0][0,0]<1>()()
[498][0,0]<0>()()
[103][0,1]<0>()("余計な文字+を消去")
[122][2,2]<0>(1600006,2304)("+","")
[103][0,1]<0>()(" ")
[103][0,1]<0>()("これで\cself[6]にはカンマ区切りで任意の区間、任意の個数の重複しないランダムな数列が入る")
[106][0,1]<0>()("\cself[6]")
[103][0,1]<0>()(" ")
[103][0,1]<0>()("\cself[6]を返り値にしてあとはお好きに")
WoditorEvCOMMAND_END

イベントコードここまで

※注意
文字列として出力しているので、数字単体を一時文字列にぶち込んで数値に変換しなおす必要があります。

著作権とかの表記の必要ありません。ご自由にもっていってください。
スポンサーサイト
コメント:
コメントの投稿
管理者にだけ表示を許可する
プロフィール
↓赤月さんより頂いたものです

Strayひろま

Author:Strayひろま
長編ファンタジーRPGを制作中。
コメント頂いたら高確率で返信します。
つまり低確率でスルーします。

ツイッター
https://twitter.com/StrayHiroma

作ったゲームは カテゴリ[自作ゲーム]からDL出来ます。 レビュー、実況などはご自由にどうぞ。 何か連絡等があればどの記事でも良いので コメント欄に書いてください。
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
アクセスカウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。