製作日誌
不定期更新。最終更新日 07/12/15
今時珍しいベタな形式。読みたい人だけ読んで、というスタンス。実際のところ、基本的に私は無礼者です。
〜07/05/31 〜07/06/24 〜07/07/24 〜07/08/30 〜07/09/27
〜07/10/20 〜07/11/28
2007/12/07
てんたま氏が「戦国史関連ツール」について書いている項で、
私awakの作った「架空武将解説作成ツール」とは何の事かと思い起こしてみたところ、
姉妹サイトの「架空武将のランダム列伝」ではないかと思い当たった。
何とも、作った本人ですら忘れてた代物を申し訳ない。
さて、ツールだけでどこまでシナリオを自動生成できるかについて、少し思考実験してみた。
おそらく、必要となるルーチンは次のようになるだろう。
・タイトル自動生成ルーチン
これは、架空武将ジェネレータ形式でOKだろう。
如何にシナリオ名に使われる要素名を上手に考えるかが重要だろう(でも楽しそうだ)。
・開始年次や各種パラメータの決定ルーチン
ここは数値固定でもいいんで無い?という気もする。
・単語置換関連
基本的には弄る必要は無いと思うが、
シナリオの舞台を選択できる(「仮想日本」「仮想中国」「仮想欧州」とか)場合は、
選択した舞台に応じて一括変更したりしてもいいかも。
鉄砲関係の設定も、ここと大いに絡んでくるだろう。
・マップ関係
マップ自動生成は、どう考えても無理。
適度に起伏のある平野(=どうとでも解釈できる地形)マップを一枚用意して、
あとは、プレイヤーの脳内補完に任せるぐらいだろう。
国割りは…、どうしたものか。
・季節イベント関係
シナリオ世界の気候を選択できる(「温帯」「熱帯」「砂漠」「寒帯」とか)場合は、
選択した舞台に応じた季節イベントを設定してもいいかも。
・大名データ生成ルーチン
大名家の家名だが、日本戦国時代や中世ヨーロッパを想定した場合、
「領地名」=「家名」となる事は珍しくは無い。
そうでなくとも、「地名」と「名字」の語彙には共通するものが多い。
従って、大名名決定と地名決定は同じタイプのルーチンで作れるだろう。
それで、自動的に名字(あるいは、地名)を作成する手法なのだが、
それには、ここにあるような二つの要素を組み合わせて名字を作る方法と、
よくある名字をできるだけ集めて、その中から一つを選んで名字とする方法がある。
(先日取り上げた『AC_Bushou』は後者の方法を取っている。)
ちなみに、架空武将ジェネレーターの戦国時代向けのものは、
これらの二つからランダムで選択された方法で名字を作成する、という処理を武将一人ずつに行っている。
肝心の大名データ生成ルーチンだが、
データ出力に先立って、まず一番目の大名の名字を上の方式で決定し、例えば変数D(0)に格納する。
この変数は、大名データのみならず武将データ作成時にも使う。
そして、航海技術やら鉱山技術やらをランダムで決めた後に、書式に沿って出力。
次に、二番目の大名の名字を決定し、変数D(1)に格納、同様にして出力。
これを必要な数だけ、繰り返す。
ざっと考えてみたところ、こんな感じではなかろうか。
長くなったので、後半戦二回戦は次回。
2007/12/11
・外交自動作成ルーチン
従属&臣従を考えないならば、全ての任意の2大名家の組み合わせにおいて、
宿敵、設定なし、不戦のいずれかをランダムで判定するようにすればいい。
(設定なしの比率は高めにしておいたほうがいいだろう)。
従属&臣従を入れると途端に処理が煩雑になる。
例えば、城と大名の配置終了後に外交自動作成ルーチンが来る様にして、
石高下位の大名が石高上位大名の臣従or従属勢力になるかどうかを判定して、
臣従or従属勢力となった大名を対象から外した上で、上の総当たり戦をやる、
という手順は考えられるのだが。
・城タイプ関連
前回述べたような「シナリオの舞台設定」があるなら、
舞台ごとに色々設定できるかもしれない。
・城データ作成ルーチン
城名の決定については、前回の名字決定と同様なので省略。
さて、難題である所属国は置いておくとして、避けて通れないのが城座標の問題。
ランダムに座標を決定すると、経路設定で頭を悩ませる事になる。
ランダムで決定した座標から、全ての任意の2点間の距離を割り出し、
距離の短い城同士を結ぶ、という力技もあることにはあるが、
ランダムである以上、他の城から非常に離れた城が出来てしまう可能性もあり、
そうするとその城がどことも経路が繋がっていない状態になって、
クリア不能なシナリオが出来てしまう恐れがある。
そこで、一つ解決策を考えてみた。
マップを格子状に区切り、一つ一つの格子の任意の座標に一つ城を置く(図1)。
一つの格子を広めに取れば、ある程度はバラバラに配置したように見えるだろう。
図1
この時、格子はタテヨコともに偶数個用意する必要がある(理由は後述)。
配置した格子は、仮にヨコが2a個、タテが2b個とする。
また、左からi個目、上からj個目にある格子に置かれた城をS(i,j)と呼ぶことにする。
こうして擬似的に「城をランダムに配置」した上で、
後述の方法で「全ての城が必ず他の城と繋がる」経路設定を試みる。
城座標さえ決まれば、石高や経済等はランダムで決めれば済む。
しかし、所有大名の決定で再び面倒な事になる。
全大名を所有城1にすれば(=城と大名が一対一対応)別に問題は無いだろうが、
「複数の互いに隣接する城を所有する大名」というごくありふれた設定となると面倒な事になる。
これは、S(i,j)を所有する大名が決定される時に
ある確率でS(i-1,j)またはS(i,j-1)を所有する大名が選択される、という処理にするのが一番単純だ。
しかし、こうすると城データ作成の時まで必要な大名数が分からないので、
大名データ作成時に多少の問題が生じる。
(未使用大名が出るのが構わなければ、城と同数だけ用意してしまえば済む)
実際にプログラムを組んで検証したわけではないので、
もう少し賢いやり方があるかもしれない。
・経路設定ルーチン
自動的に経路を設定するに当たって、
重要なのが「必ず全ての城に経路が設定されている」状態にすることだ。
これが出来ないと、どうやっても侵攻できない城が出来てしまい、クリア不能になってしまう。
そこで、「どう設定されようと、必ず全ての城に経路が設定されている」方法を考えてみた。
図2
図1で配置した城を繋いで見ると、図2のようにいびつな格子状が現れる。
この時、4個の城を頂点とする四角形が(2a-1)x(2b-1)個が存在する事になる。
さて、中央にある青色の四角形を見てみよう。
この四角形が含む4個の城が繋がるような経路設定を想像してほしい。
(この時、この4城以外の城からの経路は一切考慮しないこと)
次に、右上や左上の青色の四角形でも同様のことをしてほしい。
この時、右上や左上の四角形は中央の四角形とそれぞれ一つの城を共有しているので、
結果「この3つの四角形に含まれる全ての城が、他の城と繋がっている」状態となっている。
これをさらにマップ全体へ広げていくと、
四角形がタテにもヨコにも奇数個存在して、四隅が青色の四角形がある場合に限って、
存在する全ての城が、他の城と繋がっている状態が実現可能になる。
それでは、四角に納まるようにして4個の城が繋がるような経路設定とは、
どんなものがあるのだろうか。
筆者が考えてみたところ、下の図3に示すように23通りあると判断した。
なお、中央で経路が交差するケースは省いた。
図3(実線は経路設置、破線は不設置)
つまり、四隅が青色の四角形となるよう市松模様に青色の四角形を置いておき、
青色の四角形内の経路を図3の23通りの中から決めていけば、
理論上は「どんなにランダムで経路を作っても、必ず全ての城に経路が設定される」のだ。
また、緑色の四角形内にも経路を設置する必要がある。
この時、緑色の四角形の4辺の全てが青色の四角形で使われてしまっている。
(=緑色の四角形の辺の上に経路を置くかどうかは、既に決められてしまっている)
従って、緑色の四角形内部の経路設定は、下の図4の3通りのみとなる。
図4(実線破線については図3と同じ)
以上の処理をデータとして出力する場合は、次のようになる。
S(i,j)が右上に来る四角形をSquare(i,j)と呼ぶ事にする(1≦i≦2a-1、1≦j≦2b-1)。
(i-j)が2で割り切れる場合(=剰余が0)、Square(i,j)は青色の四角形となる。
ここで、図3の23通りの中から経路配置をランダムに選択し、これをデータとして出力する。
例えば、(8)のパターンが選択された時、以下の文章を出力する(城IDは適当)。
S(i,j), S(i+1,j), BROAD, LINE
S(i,j+1), S(i+1,j), BROAD, LINE
S(i,j+1), S(i+1,j+1), BROAD, LINE
S(i+1,j), S(i+1,j+1), BROAD, LINE
なお、ここでは経路種別は一律とするが、ランダムで変わるようにしてもいいだろう。
(i-j)が2で割り切れない場合(=剰余が1)、Square(i,j)は緑色の四角形となる。
ここでは、図4の3通りの中から経路配置をランダムに選択し、同様に出力する。
こうした処理を、(2a-1)x(2b-1)個の四角形に対して行う事で、
全ての城が経路で結ばれた経路データが得られると考える。
所詮は、見せかけだけのランダム配置なので、自由度も低いのだが、
城や経路を自動的に配置するルーチンを自作する上で参考にして頂ければ幸い。
ここまで書いて力も尽き時間も尽きたので、残りは次回。
2007/12/15
最近は、見えないところで色々とやっていたりする。
それが何についてなのは、それが表に出てきた時にでも。
以下、前回の残り。
・武将データ作成ルーチン
「架空シナリオの武将設定? 架空武将ジェネレータ使えば終了だろ?」と思うのは、早い。
架空武将ジェネレータは大量の在野武将データを作成するには向いているが、
実際のシナリオには不可欠な大名一族とか譜代の家臣とかを再現するには不向きだ。
架空武将ジェネレータで出力されたデータをそのまま使った結果、
大名の世継ぎもおらず、姓もバラバラな家臣団しかいないシナリオになったのでは、
プレイしていてすぐ興醒めしてしまうだろう。
なるべくならば、武将の持つ背景についてある程度は想像可能な武将データを作りたいところだ。
そこで、
「まず各大名ごとに大名一族のデータを作成し、
次にランダムで選ばれた城に所属する一族の作成を数十回繰り返す。」
という方法を用いる事にしたい。
まず、各大名ごとに大名一族のデータを作成することについて。
一番目の大名家一族のデータを作る場合、
その名字は大名データ作成時に決定した変数D(0)に格納されている。
つまり、名字は既に決まっているので、後は個人名と能力値などを決めていくだけだ。
仮想日本を舞台にしているなら、通字をランダムで決定してから
個人名に使われる残りの字を決めててもいい。
こうした動作を大名家の数だけ行う。
なお、架空の一族を設定する方法については、
53氏のサイトの架空設定とダイスの目に詳しいので、そちらを参照。
架空武将ジェネレータとは基本概念が違うので流用は利かないが、
よく読めばプログラムに組む事は可能だ。
なお、ここの方式を忠実に実行すると、7以上の能力値の出る確率が一回の判定で約1/6となるように、
能力値が他のシナリオと比べて高めになりやすいので、適宜下方修正が必要だろう。
次に、譜代の一族の作成法について。
まずランダムで登場城を決定し、次に名字を決定する。
この名字はランダムでもいいし、一定確率で登場城の名がついてもいい。
そして、上記の方法で一族のデータを作成する。
この時、武将の所属大名を決定する為に、
ある城IDに対してその城を所有する大名のIDを返す処理を作っておくといいだろう。
そして、最後に多すぎない程度に在野武将を設定しておく。
これは、架空武将ジェネレータと同様の方法で差し支えない。
以上のようにすれば、
武将の持つ背景についてある程度は想像可能な武将データが出来ると思う。
とまあ、ここまで長々と書いてきたのだが、
こうして見ると、現行の技術だけでもシナリオランダム作成ツールが出来そうではある。
しかし、これだけの労力を費やして作ったツールから出力されたシナリオも、
ランダムで作ったという点を除けば「作り込みの浅い架空設定シナリオ」でしかなく、
プレイヤーにとってわざわざプレイしたくなる代物かどうかは大いに疑問だ。
現実的には、城と経路の設定ルーチンだけを抜き出して、
ランダムで城配置と経路設定をやってくれるツールを作るのが、最も実用的だろう。
ブラウザ機能で戻って下さい。
一応、リンク制限なし。ご意見お便り等は下のアドレスまで。
hjkz_src■hotmail.co.jp (スパム対策のため@を四角に変えて表記)