これまでは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