空想曲線

吉里吉里2/KAG3でのゲーム制作に使える小ネタ置き場。ゲーム用素材も置いてます。

吉里吉里/KAG:万能ダイスを作ってみよう 後編  

2016-05-31[Tue]
cm0
tb0

(_´Д`)ノ< つづきよ、奥さん。

 リンク:万能ダイスを作ってみよう 前編
 リンク:万能ダイスを作ってみよう 中編

万能ダイスを作ってみようシリーズ最後です。
今回は edit タグを使ってダイスの個数と面数を設定できるようにします。

それではスクリプトから


[ iscript ]

var dice = new Array(); // ダイスの出目を格納しておく配列変数
var diceNum; // ダイスの個数
var diceSide; // 追加:ダイスの面数

/* ダイスロール
---------------------------------------------------*/

// ※引数 num のデフォルト値をdiceNum、maxのデフォルト値をdiceSideに修正

function diceRoll(num=diceNum,min=1,max=diceSide){
 //diceNum = num; // 要らなくなったのでコメントアウト
  for(var i=0; i < num; i++){
   dice[i] = int(Math.floor(Math.random()*((max-min)+1))+min);
   }
  return;
 }
[ endscript ]


つぎはエディット欄を作成します。


*edit
[ cm ]
; エディット欄を作る(ダイスの個数)
[ edit length=50 maxchars=2 name=diceNum ][ r ]

; エディット欄を作る(ダイスの面数)
[ edit length=50 maxchars=3 name=diceSide ][ r ]

; ひとつめのエディット欄にフォーカス
[ eval exp="kag.fore.messages[0].links[0].object.focus()" ]

[ link target=*check ]ダイスロール[ endlink ]
[ s ]

*check
; エディット欄の内容を確定する
[ commit ]

; 数値が入ってない、0が先頭に入っている、どちらかに0が入力されている場合はNG
;ここでは途中で改行してるけどスクリプトは一行で書ききってください

[ if exp="!/^([1-9]\d*|0)$/.test(diceNum) || !/^([1-9]\d*|0)$/.test(diceSide)
|| diceNum == 0 || diceSide == 0" ]


; 変数をリセットして
[ eval exp="diceNum = diceSide = ''" ]

; エディット入力へ戻す
[ jump target=*edit ]

; きちんと入力されているとき
[ else ]

[ iscript ]

// editで入力された変数は全て文字列変数なので数値に変換
diceNum = +diceNum;
diceSide = +diceSide;

[ endscript ]

[ jump target=*diceroll ]
[ endif ]


エディット欄に入力した数値の判定については「正規表現」でググってちょーよ。
では、残りの処理をサクサク書いていきましょう。


*diceroll
; さいころコロコロするころん
[ eval exp="diceRoll()" ]

*result
; tf.count:「◯回目」用のカウンター
; tf.num:出目用のカウンター
[ eval exp="tf.count = 1, tf.num = 0" ]

*loop
; 出目表示:回数は2ケタ右詰め、出目は3ケタ右詰め
[ emb exp="@'${'%2d'.sprintf(tf.count)}回目:${'%3d'.sprintf(dice[tf.num])}'" ]
[ r ]

; カウンターをそれぞれ+1
[ eval exp="tf.count++, tf.num++" ]

; 出目カウンターとダイスの個数が同じになったらループを抜ける
[ if exp="tf.num < diceNum" ]
[ jump target=*loop ]

; それ以外はループ
[ else ]
[ jump target=*end ]
[ endif ]


*end
; ダイスロール終了
[ s ]


じつはワザと処理をスルーしていることがひとつあります。
TRPGをプレイされる方ならご存知だと思うのですが
10面ダイスって最小値が0で最大値が9じゃないですか。

そうなると出目の最小値も edit で指定できたほうがいいですよね。
でも「出目の最小値 > ダイスの面数」という入力ミスがあったら
出目がおかしくなっちゃうから対策を練らないとダメだよなとか。

…………
……………………

∠( ゚д゚)/< できるできるキミなら改造できる(最後の最後で丸投げしていくスタイル)


吉里吉里/KAG:万能ダイスを作ってみよう 中編  

2016-05-24[Tue]
cm0
tb0

(_´Д`)ノ< つづきよー

 リンク:万能ダイスを作ってみよう 前編

前回はダイスの「面数」を自由に設定できるようにしたので
今回はダイスの「個数」を自由に設定できるようにしていきます。

まずは必要な変数を宣言しておきましょう。


[ iscript ]

var dice = new Array(); // ダイスの出目を格納する配列変数
var diceNum =0; // ダイスの個数

[ endscript ]


ダイスの個数が1個のときは普通の変数で良かったのですが
今回は個数が可変になるため、出目の管理を配列で行うことにします。
では、前回作った diceRoll 関数を修正していきましょう。


/* ダイスロール
-------------------------------------------------------------*/

function diceRoll(num,min,max){
 diceNum = num;
// 追加:ダイスの個数に引数 num の値を代入
  if(min > max){min <-> max;} // min が max より大きいときは値を入れ替える
   // 指定したダイスの個数分ぶん回す
   for(var i=0; i < num; i++){
    // 出目は配列変数diceの添字0から順に格納
    dice[i] = int(Math.floor(Math.random()*((max-min)+1))+min);
    }
  return;
 }


※コピペして使うときはスクリプト内の全角スペースをすべて削除してください


おなじみの for 文を放り込んで修正完了です。
それではKAGに戻ってスクリプトを書いていきます。


*test
; ダイスロール関数を実行(6面ダイスを6個ふる)
[ eval exp="diceRoll(6,1,6)" ]

; 結果表示
1回目:[ emb exp="dice[0]" ][ r ]
2回目:[ emb exp="dice[1]" ][ r ]
3回目:[ emb exp="dice[2]" ][ r ]
4回目:[ emb exp="dice[3]" ][ r ]
5回目:[ emb exp="dice[4]" ][ r ]
6回目:[ emb exp="dice[5]" ]


この書き方だとダイスの個数が変わったときに対応できないので修正します。
ついでに「◯回目:」も自動的にカウントするようにしましょう。


*count
; tf.countは「◯回目の結果」のカウンター
; tf.numはダイスの個数のカウンター

[ eval exp="tf.count = 1, tf.num = 0" ]

*loop
; 結果表示
[ emb exp="@'${tf.count}回目:${dice[tf.num]}'" ][ r ]
; カウンターをそれぞれ+1
[ eval exp="tf.count++, tf.num++" ]

; ダイスの個数カウンターの値がダイスの個数と一緒になるまでループ
[ if exp="tf.num < diceNum" ]
[ jump target=*loop ]
[ else ]
[ jump target=*loopend ]
[ endif ]

*loopend
; ダイスロール後の処理


ダイスの個数を増やしすぎると結果を画面に表示しきれなくなるので
レイアウトは最大個数を基準にして組みましょう。

あと、今回は取り上げませんがテキストではなくサイコロの画像で表示したいときは
あらかじめ出目に対応した画像を配列変数に入れて置いて呼び出すのがカンタンだと思います。



diceImg = [ ,dice1.png,dice2,png,... ];
↑こういうのを作っといて……

[ image storage="diceImg[dice[0]]" layer=0 visible=true ]
↑こんなカンジで呼び出す。座標指定とか考えるとちょっと面倒だけども(´ε`;)

といったところで、今回は終了です。
次回は edit タグを使ってダイスの個数と面数を設定できるようにします。


吉里吉里/KAG:万能ダイスを作ってみよう 前編  

2016-05-17[Tue]
cm0
tb0

吉里吉里/KAGちょいネタシリーズ。
TRPG等で使用するダイスツールを吉里吉里で作ろうぜというネタです。
少し改造すればティラノスクリプトでも使えるかと思います。

全3回、内容は以下を予定しています。

 前編:ダイスの面数を自由に設定できるようにする
 中編:ダイスの個数を自由に設定できるようにする
 後編:ダイスの面数と個数をeditで入力できるようにする

まずは基本になる6面ダイスを作っていくよいよい ヽ(・∀・ )ノ
今回、KAGの intrandom は使用しませんのでご注意ください。


[ eval exp="f.dice = int(Math.floor(Math.random() * 6) + 1)" ]
ダイスロールの結果:[ emb exp="f.dice"]

このスクリプトを実行すると6面ダイスを1個ロールした結果を表示します。
f.dice の値は実数で弾き出されるため int で括って整数にするのを忘れずに。

ダイスの個数と面数が固定であればこれで十分なのですが
今回は「万能ダイス」を作るのが目的なのでもうちょい頑張りましょう。


/* 乱数を発生させる関数を作る
------------------------------------------------------------*/

// 引数:min=最小値、max=最大値
function diceRoll(min,max){
return int(Math.floor(Math.random() * ((max - min) + 1)) + min);
}


処理の内容をざっくり説明します。



1.Math.randomで0~1未満の乱数を発生させる


ためしに[ emb exp="f.dice = Math.random()" ]と書いて実行してみます。


0.91977
0.44133
0.51011
0.67559
0.55129
0.49673
0.51269
0.59877
0.78376
0.03391


本当は小数点以下の位がズラズラ並んでいるのですが要らないので小数点以下5位でカット。



2.乱数に「最大値-最小値+1」を乗算する


6面ダイスの最小値は1、最大値は6なので6を掛けます。


[ emb exp="f.dice = Math.random() * ((6 - 1) + 1)"]


0.91977*6 = 5.51862
0.44133*6 = 2.64798
0.51011*6 = 3.06066
0.67559*6 = 4.05354
0.55129*6 = 3.30774
0.49673*6 = 2.98038
0.51269*6 = 3.07614
0.59877*6 = 3.59262
0.78376*6 = 4.70256
0.03391*6 = 0.20346



3.Math.floorで小数点以下を切り捨てた後、最小値を足す


[ emb exp="f.dice = Math.floor(Math.random() * 6) + 1" ]


5.51862 → 5+1=6
2.64798 → 2+1=3
3.06066 → 3+1=4
4.05354 → 4+1=5
3.30774 → 3+1=4
2.98038 → 2+1=3
3.07614 → 3+1=4
3.59262 → 3+1=4
4.70256 → 4+1=5
0.20346 → 0+1=1


Math オブジェクトの floor メソッドは小数点以下を切り捨てます。
詳しく知りたい人は「Mathオブジェクト」で検索すると幸せになれるよ。



ということで最初に書いた

[ eval exp="f.dice = int(Math.floor(Math.random() * 6) + 1)" ]

を diceRoll() を使って書き直していきます。



;1~6の6面ダイスをふる
[ eval exp="f.dice =diceRoll(1,6)" ]
1D 6の結果:[ emb exp="f.dice" ]

;0~9の10面ダイスをふる
[ eval exp="f.dice =diceRoll(0,9)" ]
1D 10の結果:[ emb exp="f.dice" ]

;1~100の100面ダイスをふる
[ eval exp="f.dice =diceRoll(1,100)" ]
1D100の結果:[ emb exp="f.dice" ]


あとは引数 min の値を max の値より大きく書いてしまったときに
自動的に min と max の値を入れ替えるように修正しておきます。
うっかりさんもこれなら安心です。


/* ダイスロール
---------------------------------------------------*/

// 引数:min=最小値、max=最大値

function diceRoll(min,max){
if(min > max){min <-> max;}
// min が max より大きいときは値を入れ替える
return int(Math.floor(Math.random() * ((max - min) + 1)) + min);
}


ということで何面ダイスでも好きなだけコロコロできるようになりました。
次回はダイスの個数を設定できるようにしていきます。

今回はここまでー (´∀`*)ノシ


自作ツール:JavaScriptで誕生日当てツールを作ってみた  

2016-05-08[Sun]
cm0
tb0

JavaScriptの勉強がてら、昔、吉里吉里で作った誕生日当て「1/365」を一部移植してみました。
お友だちの誕生日を当てて楽しむパーティツールとしてご利用いただれば幸いです。


「はじめる」をクリックすると開始します。不具合等を見つけたときはお知らせください。



※JavaScriptを有効にしていないと動きません
※BGMや効果音は入っていません


小此木鶯太郎の事件簿「可視と不可視の幻想」解答編  

2016-05-02[Mon]
cm0
tb0

(n‘∀‘)η < 解答編キマシタワー(注:キマシ展開はありません)

ご購入は amazon からどうぞ。未読の方は問題編も併せてどうぞどうぞ。

リンク:可視と不可視の幻想 解答編
リンク:可視と不可視の幻想 問題編


おまけページめっちゃ充実してますよー。
応募者さんの解答とか感想とか4コマ漫画とか。
リストラ疑惑が持ち上がった◯◯さんもどこかでスタンバってるかもよ。


なお、次回参加券に当選されている挑戦者のみなさまには
amazonギフト券をお送りしているので購入の際にご利用くださいとのことです。


今回、問題編・解答編とお手伝いさせていただいたのですが
電子書籍の作りかたを勉強するところからスタートしたので
最初のうちはそりゃもうひどかったですね、私が。


「ePubって何?」
「これどうやって編集すんの?」
「なんで目次が2つ要るの?」
「インデントってどうすればいいんだ」
「mobiに変換したら表示がヘンになった」
「画面に合わせて画像サイズ変えたいのに変わんない」
「左右中央揃えってどうやんだよ揃わねえよ(#゚Д゚)ゴルァ!!」


正直、心が折れそうになったこともあったような気がしなくもないですが
なんとか最低限の務めだけは果たせた(たぶん)のでホッとしています。
結果として電子書籍製作のノウハウを習得できたのは個人的に大きな収穫でした。


次回以降はもう少し短めのスパンで出していきたいと主宰が仰っていたので
いつの日か監察医さんの姿が拝めるよう一緒に祈りながら待ちましょう。
シリーズ皆勤賞なのに未だにメールでしか登場してないんだぜ。ふぐぅ。


個人的には監察医さんは血や内臓が好きな残念美人だったらいいなと思ってるんだけど、じつはオネエなんじゃないかという考えがどうにも拭い切れずにいる。


現在のページ

Category

Link

Comment

Mailform

Author

Twitter