第二章 第三話 試作機を作ってみる
みなさんこんにちはプリンです。なろう系あらすじジェネレータの章の、第三話です。
第二話では、意外と簡単に、いわゆる「いつどこで誰が何をした」ゲームが、作れてしまいました。
ただ、そこが今回の最終目的ではありません。今回の「あらすじジェネレータ」の目的は、「いつどこで誰が何をした」ゲームよりも、もっと複雑なあらすじを、比較的簡単な労力で、実現したいということです。なので、もう少し頑張ってみたいと思います。
さて今回は、そんな複雑なあらすじジェネレータを、どうやって実現するかの試行錯誤をお届けする予定でした。しかし、プログラムの構造に関する検討を、こういう文章で、延々と語っても面白いのかと疑問に思ったため、次のような方針で、プログラムを作ってしまうことにしました。
方針:
ルールの定義の書式や、それをどう読み込むかなんていうのは二の次。
実際、メモリ上にどう配置して、どう使いたいのかの、最終案を形にしてしまおう。
つまり、動けばいい!
現代のプログラムというのは、自分も含めていろんな人が、将来メンテしやすいように、わかりやすく記述するものですが、今回は、動けばいい、と割り切ってしまいます(笑。こうすることで、無駄な仕様を検討する必要なく、実際どんな感じで動くのかを、確認することが出来るんですね。
結果、今回のプログラムは、こんなに短く、シンプルになりました。ただし、あまり読みやすさはよくないです。
これを実行させた結果のコンソールが、こちらです。「%いつ% %誰%が %どこで% %どうする%」、という「あらすじのベース」を使い、10回ランダムにあらすじを生成させてみた結果です。
今回のプログラムのメモリ構造が、どうなっているかを図にしてみました。今回は、この図を書くのが一番大変でした(汗。
左上の、「synopsis_base」を元に、左下のカタログで、抽出したいデータがメモリのどこにあるかを特定し、乱数で右のリストから、必要なデータを取り出し、あらすじを組み立てる、というものです。
今回のプログラムの、最大の特徴が、この「synopsis_base」です。今、このベースは「"%いつ% %誰%が %どこで% %どうする%"」、になっているんですけど、これを例えば、
「%いつ% %誰%が %誰%とともに %どこで% %どうする% しかし、%どうする%"」
に変更してやると、それだけで生成される結果が、このベースに基づき複雑なものになります。
今回はここまでです。今回作ったプログラムは、このあと添付します。結構ややこしいプログラムになっています。ご質問などありましたら感想欄でご質問いただければご説明いたします。なお次回は今回のプログラムをいじくって、今のデータ量のまま、よりバラエティーに富んだあらすじを作れるよう改造する予定です。ご期待ください。
では次回またお会いしましょう。
(今回作ったプログラム、ここから)
# -*- coding: utf-8 -*-
import random
synopsis_base = "%いつ% %誰%が %どこで% %どうする%"
#synopsis_base = "%いつ% %誰%が %誰%とともに %どこで% %どうする% しかし、%どうする%"
s_def=["%いつ%","%誰%","%どこで%","%どうする%"]
s_start=[0,3,11,17]
s_num=[3,8,6,9]
s_str=["とある時代","時は未来","時は現代",
"ベレー帽の少女","社長","かわいい猫耳少女","マスターである男性","トラブルを起こしたニート主人公","機械の大群に殺された主人公","引っ込み思案の少女","幽霊としてよみがえった天才小説家",
"冒険者の格差が問題となった異世界で","ゲーム内仮想世界で","リアル世界で","地球で","過去世界で","都会のある町で",
"ギルドの問題を解決する","商人となってお店を開く","異世界の牢獄に閉じ込められる","何らかのトラブルによって過去に飛ばされる","ラスボスを倒す","霊体となる","機械を乗っ取る","人類を勝利に導く","作家デビューを目指して頑張る"
]
for n in range(10):
c=0
syno = synopsis_base
for s in s_def:
flag_end=-1
while flag_end==-1:
if syno.find(s_def[c])!=-1:
rep_target= s_str[random.randint(s_start[c],s_start[c]+s_num[c]-1)]
syno=syno.replace(s_def[c],rep_target,1)
else:
flag_end=0
c=c+1
print(syno)




