物語の体操にでてくるプロット作成法をruby+emacsで手軽に

物語の体操という本の中にプロット*1を作成する練習の仕方が書いてあるそうです。
(実際に読んだことはないです。><)
タロットっぽいカードをシャッフルしてから並び替えて行うみたいです。
順番にそれぞれ意味があってその意味とカードの内容とを対応づけていくみたいです。
(カードの向きが上向きか下向きかでも意味が違うそうです。)
詳しくはここで調べてください。><

でもわざわざ、実際のカードを並べ替えたりするのはめんどそう。

プログラムに作ってもらった方が楽なんじゃないかなーと思いました。*2

そんなわけで

$KOCE = 'utf8'
#
# ~/test/buf/prot.rb という名前で保存しています。
#
class Array
  def shuffle
    self.each_index{ |i| j = rand(i+1); self[i], self[j] = self[j], self[i]}
  end
end

class A
  def initialize
    @seed = %w{意志 清楚 理性 秩序 知恵 誓約 善良 節度 至誠 生命 寛容 開放 調和 想像 信頼 公式 変化 結合 厳格 勇気 幸運 庇護 治癒 慈愛}
    @result = %w{ 主人公の現在 主人公の近い未来 主人公の過去 援助者 敵対者 結末}
    @attribute = %w{ + -}
    @width = @result.inject(0){ |n,e| len = e.length; n = len if n < len; n}
  end
  
  def add_attribute a
    a.zip((0...a.length).map{ @attribute.shuffle.first})
  end

  def get
    seed = @seed.shuffle[0,6]
    seed = self.add_attribute(seed)
    return @result.zip(seed)
  end

  def output
    puts "=================="
    puts "意味:       内容(正逆)"
    puts "=================="
    #self.get.each{ |e| puts e.join(" : ")}
    get.each{ |e| puts("#{e[0]+" "*((@width - e[0].length)/3)} : #{e[1]} ")}
  end
end

a = A.new
a.output
# >> ==================
# >> 意味:       内容(正逆)
# >> ==================
# >> 主人公の現在   : 至誠- 
# >> 主人公の近い未来 : 善良- 
# >> 主人公の過去   : 知恵+ 
# >> 援助者      : 清楚+ 
# >> 敵対者      : 想像- 
# >> 結末       : 誓約+ 

あと、emacsを使っているなら

.emacsに以下を追加すると

(global-set-key [f4] (lambda () (interactive)
		       (insert (shell-command-to-string "ruby ~/test/buf/prot.rb"))))

「f4」を押すだけで、結果を自分が開いているバッファの上に出力することができます。

これを使えば

簡単にお話を作る練習ができるかもしれません。><

*1:小説を書くときに使う予定表みたいなものみたい

*2:ジェネレータとか既に同じことを考えているひとはたくさんいました。