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