18.05.27の状況

Last-modified: 2018-05-27 (日) 15:27:57

greeting.rb

他の機能を呼び出す窓口。
以前は、無脳ちゃんとユーザーを命名するファイルを別にしていたが、統合した。
また、以前は、無脳ちゃんとユーザーの名前をを変数に格納していたが、実行中に変えることはないので、定数にして、その結果だいぶスッキリした。

 

なお、全体として、まちがえて入力するとやり直しが効かないという不具合が残っている。
そのときは、テキストを直接直す。

 

greeting.rb

 require 'yaml'
 require 'pp'
 require './shiritori'
 require './learning'
 require './shiritori_learning'
 require './shittakaburi'
 begin
   names = YAML.load_file'NAMES.yaml'
   Yome = names[0]
   Ore = names[1]
   puts "#{Yome}> #{Ore}、何か用事なの?私だって忙しんだからね。でも、ちょっとだけならつきあってあげてもいいわよ。"
 rescue
   names={}
   puts '私の名前は?'
   Yome = gets.chomp
   puts "私の名前は#{Yome}っていうの?"
   puts 'あなたをなんと呼べばいいの?'
   Ore = gets.chomp
   puts "#{Ore}でいいのね?"
   YAML.dump([Yome, Ore],File.open("NAMES.yaml", "w"))
   puts "#{Yome}> 別に#{Ore}と知り合いになってもうれしくもないんだかれね。だけど、一応よろしくね。"
 end
 talk = rand(4)
 case talk
 when 0
   puts "#{Yome}> しりとりでもする?あ、勘違いしないでよね。ただの暇つぶしよ。ヒマツブシ。"
   Shiritori.new.play
 when 1
   puts "#{Yome}> 何か言葉を教えてよ。ま、あなたじゃ大した語彙なさそうだけどね。"
   Learning.new.ask
 when 2
   puts "#{Yome}> ちょっと、前しりとりに出てきた言葉の意味教えなさいよ。"
   Shiritori_Learning.new.ask
 when 3
   puts "#{Yome}> #{Ore}はあまり言葉知らなそうだから、私が少し教えてあげるわ。"
   Shittakaburi.new.teach
 end
 

他のファイル

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 "#{Ore}> "
     return gets.chomp
   end
   #### pc側の設定(手持ちのリストから、該当する単語を探し出す。)
   def pc_play
     @pc_wordsbank.each do |w|
       if w[0] == @tail
         puts "#{Yome}> " + w
         @pc_wordsbank.delete(w)
         return w
       end
     end
     puts "#{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 "#{Yome}> はじめは#{Ore}からどうぞ"
     @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'
     rescue
       @dictionary={}
     end
   end
   def ask
     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
 

shiritori_learning.rb

「Shiritori_Learning」クラスは「Shiritori」クラスのサブクラスにしました。

 require 'yaml'
 require './learning'
 require 'pp'
 class Shiritori_Learning < Learning
   def initialize
     @names = YAML.load_file'NAMES.yaml'
     begin
       @dictionary = YAML.load_file'DICTIONARY.yaml'
     rescue
       @dictionary = {}
     end
     begin
       @pc_wordsbank = YAML.load_file'WORDSBANK.yaml'
     rescue
       puts "#{Yome}> まだしりとりやったことないから、言葉を知らないの。"
       exit
     end
   end
   def ask
     #### しりとりデータベースからランダムに言葉を取り出す。
     select = rand(@pc_wordsbank.size)
     puts "「#{@pc_wordsbank[select]}」てどういう意味なの?"
     super  #Learningのaskメソッドを活用
   end
 end
 

shittakaburi.rb

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