これまで作った機能を呼び出せるようにする

Last-modified: 2018-05-27 (日) 05:55:46
 

これまではsiritoriだけ実行したり、learningだけ実行したりしてましたが、まず最初に無脳ちゃんとあいさつをしてから、いろいろなことができるようにしてみます。
ただし、こちらに何をするかの選択権はありません。

 
 

無脳ちゃんに名前をつける。

本題に入る前に、これまで名無しだった無脳ちゃんに名前をつけられるようにします。

 

meimei.rb

 require 'yaml'
 require 'pp'
 def meimei
   names={}
   puts '私の名前は?'
   names['yome']=gets.chomp
   puts '私の名前は ' + names['yome'] + ' っていうの?'
   puts 'あなたをなんと呼べばいいの?'
   names['master']=gets.chomp
   puts names['master'] + ' でいいのね?'
   YAML.dump(names,File.open("NAMES.yaml", "w"))
 end

名前は外部ファイル(NAMES.yaml)に保存されるので、これからプログラムを実行するとずっと無脳ちゃんはその名前です。
もし、名前を変えたくなってしまったら、NAMES.yamlを直接編集するか、meimei.rbを実行し直せば変えられます。

 

2行目に

 require 'PP'

というのがありますが、必須のものではなく、プログラムを作っている途中で、変数の中身を確認したいときに

 pp hensuu

とやるためのものです。

 

他の機能を呼び出すための入り口となるファイルを作る

他の機能を呼び出すためのファイルを作ります。
最初に他のファイルを読み込むため、requireがやたら多くなってしまいました。
なお、greeting.rbで使うために、他のファイルもいじってあります(hogehoge.newなどを削除しました。)。githubのファイルを一括ダウンロードしてください。

 

greeting.rb

 require 'yaml'
 require 'pp'
 require './meimei'
 require './shiritori'
 require './learning'
 require './shiritori_learning'
 require './shittakaburi'
 class Greeting
   def initialize
     begin
       @names=YAML.load_file'NAMES.yaml'
       puts @names['yome']+'> '+ @names['master'] + '、何か用事なの?私だって忙しんだからね。でも、ちょっとだけならつきあってあげてもいいわよ。'
     rescue
       puts 'まず無脳ちゃんに名前をつけてあげてください。'
       meimei
       puts @names['yome']+'> 別に'+ @names['master'] + 'と知り合いになってもうれしくもないんだかれね。だけど、一応よろしくね。'
     end
   end
   def talking
     talk = rand(4)
     case talk
     when 0
       puts @names['yome']+'> '+ 'しりとりでもする?勘違いしないでよね。ただの暇つぶしよ。ヒマツブシ。'
       Shiritori.new.play
     when 1
       puts @names['yome']+'> '+ '何か言葉を教えてよ。まあ、あなたじゃ大した語彙なさそうだけどね。'
       Learning.new.ask
     when 2
       puts @names['yome']+'> '+ 'ちょっと、前しりとりに出てきた言葉の意味教えなさいよ。'
       Shiritori_Learning.new.ask
     when 3
       puts @names['yome']+'> '+ @names['master'] + 'はあまり言葉知らなそうだから、私が少し教えてあげるわ。'
       Shittakaburi.new.teach
     end
   end
 end
 session = Greeting.new
 session.talking
 

ところで、@names['yome']なのだけれど、プログラム中では、ずっと出てくるし、途中で変わることはないはずなので、最初に定数かグローバル変数かシンボルとかいうものに代入してしまう方が今後楽になるような気がする。

 

greeting.rbと連携させるために修正したファイル

shiritori.rb

 require 'yaml'
 require 'pp'
 class Shiritori
   def initialize
     @names=YAML.load_file'NAMES.yaml'
     #### 初めからPCが答えられる言葉を用意してあげる。
     @pc_wordsbank = ['ごりら','ぱんだ','ごま','めだか','かばん','ごりら']
     #### WORDSBANK.yamlを一旦読み込み、配列pc_wordsbankに格納
     #### ただし、最初はWORDSBANK.yamlがないので、例外処理を行う
     begin
       @load_wordsbank=YAML.load_file'WORDSBANK.yaml'
       @load_wordsbank.each do |i|
         @pc_wordsbank.push(i)
       end
     ## WORDSBANK.yamlがないとき(中身が空のとき)の処理(と言っても何もしない)
     rescue
     end
     ## 最後にWORDSBANK.yamlに(再)保存するために一時保管
     @temp_wordsbank=@pc_wordsbank
     ## wordsbankの空配列
     @wordsbank=[]
   end
 #  wordsbank=[]
   #### 出てきた言葉を保存するメソッド
   def store_words
     @temp_wordsbank.each do |i|
       @wordsbank.push(i)
     end
     @wordsbank.uniq!
     YAML.dump(@wordsbank,File.open('WORDSBANK.yaml', 'w'))
     exit
   end
   ####人間側の設定(キーボードから入力した文字を返すだけ。)
   def human_play
     print '俺> '
     return gets.chomp
   end
   #### pc側の設定(手持ちのリストから、該当する単語を探し出す。)
   def pc_play
     @pc_wordsbank.each do |w|
       if w[0] == @tail
         puts @names['yome'] + '> ' + w
         @pc_wordsbank.delete(w)
         return w
       end
     end
     puts @names['yome'] + '> うぅ~、「' + @tail + '」で始まる言葉を思い出せないわ。しかたないわね。今回だけは負けを認めてあげるわ。'
     @store_words
     exit
   end
   ####審判
   def judge
   ## すでに使われた単語か判断。
     @wordsbank.each do |w|
       if w == @word
         puts 'その言葉はもう出てます。残念でした。'
         store_words
       end
     end
     ## 「ん」で終わっていないか判断
     if @word[-1] == 'ん'
       puts '最後の言葉が「ん」です。残念でした。'
       @wordsbank.push(@word)
       store_words
     ## 前の単語の最後の文字で始まっていれば正常処理
     elsif @word[0] == @tail
       @wordsbank.push(@word)
       puts '次は「' + @word[-1] + '」で始まる言葉'
       return @word[-1]
     ## 前の言葉の最後の言葉と違う言葉で始まっていれば負け判定
     else
       puts @tail + 'で始まる言葉ではありません。残念でした。'
       @wordsbank.push(@word)
       store_words
     end
   end
   def play
     #### 試合開始
     puts 'はじめは' + @names['master'] + 'からどうぞ'
     @word=human_play
     @tail=@word[0]
     while true
       @tail=judge
       @word=pc_play
       @tail=judge
       @word=human_play
     end
   end
 end
 

learning.rb

 require 'yaml'
 require 'pp'
 class Learning
   def initialize
     @names=YAML.load_file'NAMES.yaml'
     begin
       @dictionary=YAML.load_file'DICTIONARY.yaml'
 #      pp @dictionary
     rescue
       @dictionary={}
     end
   end
   def ask
     puts '何か言葉を教えて。'
     print '単語> '
     @word=gets.chomp
     print '意味> '
     @mean=gets.chomp
     puts '「' + @word + '」とは「' + @mean + '」という意味なのね。覚えたわ。'
 #    @dict_value = []
 #    @dict_value = @dictionary[@word]
 #    @dict_value.push = @mean
 #    puts @dict_value
     @dictionary[@word] = [@dictionary[@word], @mean].flatten.compact
     YAML.dump(@dictionary,File.open('DICTIONARY.yaml', 'w'))
   end
 end
 

shiritori_learning.rb

 require 'yaml'
 #require './learning'
 require 'pp'
 class Shiritori_Learning
   def initialize
     @names=YAML.load_file'NAMES.yaml'
 #    super
     begin
       @dictionary=YAML.load_file'DICTIONARY.yaml'
     rescue
       @dictionary={}
     end
     begin
       @pc_wordsbank=YAML.load_file'WORDSBANK.yaml'
     rescue
       puts ('嫁>まだしりとりやったことないから、言葉を知らないの。')
       exit
     end
   end
   def ask
     #### しりとりデータベースからランダムに言葉を取り出す。
     select=rand(@pc_wordsbank.size)
     puts '「' + @pc_wordsbank[select] + '」てどういう意味なの?'
     print '単語> '
     @word=gets.chomp
     print '意味> '
     @mean=gets.chomp
     puts '「' + @word + '」とは「' + @mean + '」という意味なのね。覚えたわ。'
     @dictionary[@word] = [@dictionary[@word], @mean].flatten.compact
     YAML.dump(@dictionary,File.open('DICTIONARY.yaml', 'w'))
   end
 end
 

shittakaburi.rb

 require 'yaml'
 require 'pp'
 class Shittakaburi
   def initialize
     begin
       @dictionary=YAML.load_file'DICTIONARY.yaml'
     rescue
       puts '嫁>言葉を教えてあげようと思ったのだけれど、私の知っている言葉はただひとつ「AIしている?」だけ。'
       exit
     end
     ## ハッシュのキーを配列として取り出す。
     @wordslist=@dictionary.keys
   end
   def teach
     @word=@wordslist[rand(@wordslist.size)]
     puts '嫁>ねえ、「' + @word + '」の意味知ってる?'
     puts '嫁>それは「 ' +@dictionary[@word].sample + '」という意味なのよ。私って物知りでしょ?'
   end
 end