SSブログ

学習型のしりとりプログラム(shiritori.rb) [Ruby]

#! ruby -Ks
# ───── for ruby 1.9 ─────
# ───── 2012.03.11 coded by 心如

class Shiritori
    attr_accessor :fname, :data, :aite, :henji, :used, :backup
   
    def initialize f
        @fname = f
        @data = readFromFile(fname)
        @aite = nil
        @henji = "しりとり"
        @used = {}
        @backup = cloneData(@data)
    end
   
    # ファイルのデータを読み込む
    def readFromFile f
        data = {}
        begin
            file = File.open(f)
            while(str = file.gets)
                str = str.chomp
                arr = str.split(",")
                key = arr[0]
                arr.shift
                data.store key, arr
            end
        rescue Exception => e
            puts "データファイルのオープンに失敗しました。ファイルが存在しないようです。(" + e.message + ")"
        ensure
            file.close if file != nil
        end
        return data
    end
   
    # ファイルにデータを書き出す
    def saveToFile f, data
        begin
            file = File.open( f, "w")
            file.flock(File::LOCK_EX)
            ka = []
            data.each do |key, arr|
                ka << key
            end
            (ka.sort).each do |key|
                arr = data[key]
                arr.sort!
                file.puts key + "," + arr.join(",")
            end
        rescue Exception => e
            puts "何らかの原因でデータの保存に失敗しました。(" + e.message + ")"
            return
        ensure
            if file != nil
                file.flock(File::LOCK_UN)
                file.close
            end
        end
    end
   
    # 最後の文字を返す
    def getLastChar str
        komoji = {"ぁ"=>"あ","ぃ"=>"い","ぅ"=>"う","ぇ"=>"え","ぉ"=>"お","ゃ"=>"や","ゅ"=>"ゆ","ょ"=>"よ","ゎ"=>"わ"}
        last = str[-1]
        last = str[-2] if last == "ー"
        last = komoji[last] if komoji.has_key?(last)
        return last
    end
   
    # データハッシュの複製
    def cloneData h1
        h2 = {}
        h1.each do |key, obj|
            h2.store key, obj.dup
        end
        return h2
    end
   
    # デバッグ用出力メソッド
    def printData d
        ka = []
        d.each do |key,arr|
            ka << key
        end
        ka.sort!
        (ka.size).times do |n|
            key = ka[n]
            arr = d[key]
            puts key + ": " + arr.join(",")
        end
    end
   
    # しりとり本体
    def shiritori
        puts "わたし:" + @henji
        mytop = @henji[0]
        mylast = getLastChar(@henji)
        puts mylast
        # 使った単語を使用済みハッシュに登録する
        @used.store @henji,"わたし"
        @data[mytop].delete @henji if @data.has_key?(mytop)
        # 相手の答えを得る
        print "あなた:"
        @aite = gets.chomp
        top = @aite[0]
        # 開始文字のチェック
        if mylast != top then
            puts "先頭の文字が異なります、あなたの負けです。"
            return false
        end
        # 最後の文字を取得し、小文字なら大文字に直す
        last = getLastChar(@aite)
        puts last
        @data[top].delete @aite if @data.has_key?(top)
        # "ん"で終わったときの処理
        if last == "ん" then
            puts "「ん」で終わっています、あなたの負けです。"
            return false
        end
        # 既に使われている単語かチェックし、
        # 未使用であれば使用済みに登録
        if @used.has_key?(@aite) then
            puts "それは前に、#{@used[@aite]}が使っています。"
            puts "あなたの負けです。"
            return false
        else
            @used.store @aite,"あなた"
        end
        # まだ知らない単語ならバックアップのハッシュに登録
        if @backup.has_key?(top) then
            flg = false
            @backup[top].each do |obj|
                flg = true if @aite == obj
            end
            @backup[top].push @aite if flg == false
        else
            @backup.store top,[@aite]
        end
        # 次の答えを準備
        # 答える単語がなければ負け
        if @data.has_key?(last) == false or @data[last].length == 0
            3.times do
                print "・"
                sleep 0.5
            end
            puts "思いつきません、あなたの勝ちです。"
            return false
        end
        num = rand(@data[last].length)
        @henji = @data[last][num]
        return true
    end
   
    # しりとりループ
    def playloop
        loop do
            begin
                while(shiritori)
                end
            rescue Exception => e
                puts "プログラムの実行時に問題が発生しました。(" + e.message + ")"
                return
            end
           
            # 再プレイの処理
            print "\nもう一度やりますか(はい/いいえ)? "
            break if gets.chomp == "いいえ"
            puts
            @data = cloneData(@backup)
            @used = {}
            @henji = "しりとり"
        end
    end
   
    # 終了処理
    def dispose
        puts "\nわたし:バイバイ!"
        saveToFile(@fname,@backup)
        puts "program end."
    end
end

# メインプログラム
game = Shiritori.new("data.txt")
game.playloop
game.dispose
─────

あ,あか,あけび,あとがき,あどばんてーじ,あな,あめ,あらいぐま,あんぷ
い,いえ,いか,いかり,いが,いぎ,いけ,いし,いす,いせ,いそ,いち,いちじく,いど,いなか,いぬ,いぼ,いりこ,いるか,いろ,いわ,いんか
う,うえ,うえき,うがい,うき,うきわ,うし,うじ,うそ,うた,うだつ,うちわけ,うど,うなぎ,うなじ,うば,うま,うみ,うめ,うめぼし,うり,うろこ,うわさ
え,えいが,えいず,えき,えくぼ,えころじー,えぞ,えだ,えのき,えま,えみ,えら,えんがわ
お,おく,おしり
か,かい,かいろ,かき,かぎ,かげ,かし,かじめ,かたつむり,かなづち,かね,かば,かぶと,かべ,かめ,かり
が,がそ,がっき,がっこう,がむ
き,きいろ,きかい,きかんしゃ,きが,きく,きこり,きごう,きざ,きしゃ,きす,きせつ,きせる,きそ,きたい,きって,きっぷ,きど,きなこ,きね,きび,きぼう,きまじめ,きみ,きめ,きょう,きょうき,きり,きろく,きんぎょ
ぎ,ぎし,ぎせい,ぎそく,ぎたー,ぎふと,ぎぼし,ぎむ,ぎょうざ,ぎょうしゃ,ぎょうれつ,ぎょぎょう,ぎんこう
く,くーる,くいず,くき,くぎ,くけい,くげ,くさり,くし,くすり,くせ,くだ,くつ,くび,くま,くら,くらし,くらりねっと,くり,くるま,くるみ,くろ,くろうと,くろっく
ぐ,ぐらんど,ぐるめ
け,けいこ,けいと,けし,けんこう
げ,げーむ,げい,げこう,げし,げすと,げた,げら,げるまにうむ,げれんで,げんき,げんこつ,げんたつ
こ,こーど,こい,こいぬ,こいびと,こいる,こうじ,こうそ,こげ,こたつ,ことり,こども,こび,こびと,こま,こや
ご,ごいし,ごきぶり,ごそう,ごま,ごりら,ごるふ,ごろ
さ,さぎ,さけ,さる
ざ,ざいす,ざいる
し,しおり,しか,しかい,しかく,しかご,しき,しけ,しけい,しこ,しこう,しごと,ししとう,しじ,しそ,した,しだ,しっぽ,しばふ,しへい,しぼう,しま,しまい,しまうま,しまりす,しみ,しめじ,しゃったー,しらが,しり,しりあ,しりかげる,しるし,しるばー,しろ
じ,じけんぼ,じこ,じしょ,じつじょう,じてんしゃ,じどう,じどうしゃ,じぬし,じゃんぷ,じゅう,じんぞう
す,すいか,すいす,すいそ,すき,すきー,すきま,すぎ,すし,すず,すずき,すずめ,すみれ,すり,するめ
ず,ずい,ずが,ずけい,ずこう,ずし,ずたぶくろ,ずっきーに,ずっく,ずぼら,ずるやすみ,ずわいがに
せ,せど,せみ,せんせい
そ,そーす,そーだ,そうじ,そうじき,そうだ,そけっと,そで,そば,そら,そり
ぞ,ぞう
た,たいこ,たいる,たきぎ,たきび,たこ,たすき,ただ,たばこ,たび
だ,だいく,だいず,だいち,だいばー,だいや,だちょう,だっそう,だむ,だるま
ち,ちーず,ちから,ちきゅう,ちけい,ちず
つ,つーる,ついーど,つかれ,つがる,つき,つぎはぎ,つしま,つば,つぼ,つま,つめ,つらら,つり,つりぼり,つるぎ,つるべ
て,てこ
と,とーてんぽーる,とい,といれ,といれっと,とうふ,とけい,とげ,とそ,とど,となかい,とび,とまと,とら,とらんく,とらんぺっと,とり,とるく,とんねる,とんぼ,とんま
ど,どーなっつ,どーなつ,どーむ,どあ,どいつ,どうぶつ,どき,どきょう,どぼく,どぼくけんちく,どら,どらいばー,どらま,どらむ,どる
な,ないふ,ながし,なげっと,なし,なつ,なのはな,なび,なふだ,なべ
に,にく,にわとり
ぬ,ぬーど,ぬいかた,ぬか,ぬし,ぬりえ
ね,ねぎ,ねこ,ねふだ,ねまき
の,のこ
は,はけ
ば,ばいく,ばか,ばぐ,ばす,ばっと,ばなな,ばらんす
ぱ,ぱいぷ,ぱぱ,ぱり,ぱんつ
ひ,ひる
び,びーる,びーるす,びく,びすけっと,びっくりばこ,びょうき,びりょく,びる,びわ
ふ,ふぃるむ,ふえ,ふき,ふたご,ふみ,ふらんす
ぷ,ぷーる,ぷりくら,ぷりんあらもーど,ぷりんと,ぷれいやー,ぷろせす
へ,へい
べ,べーす,べーる,べっこう,べっど,べらんだ,べる,べんち,べんつ
ぺ,ぺっと
ほ,ほし
ぼ,ぼーと,ぼーなす,ぼいらー,ぼうし,ぼらんてぃあ,ぼると,ぼんど
ぽ,ぽーず,ぽーと,ぽいんと,ぽっと,ぽんぷ
ま,まーく,まい,まいく,まいこ,まいる,まえ,まかお,まき,まく,まぐま,まぐろ,まげ,まご,まど,まなこ,まほう,まり,まわし,まんと
み,みーと,みえ,みき,みぎ,みけねこ,みせ,みせす,みそ,みぞ,みどり,みらい,みるく
む,むーど,むかし,むかで,むぎ,むし,むしめがね,むだ,むだげ
め,めーる,めい,めいく,めいじ,めいど,めいぼ,めいろ,めか,めかくし,めかにずむ,めがね,めごち,めし,めじろ,めそっど,めだか
も,もみ,もも
や,やず,やね,やま,ややこ,やり
ゆ,ゆめ
よ,よめ,よる
ら,らーゆ,らいす,らいだー,らいと,らいばる,らいふる,らくだ,らっこ,らっぱ,らぼ,らんぷ
り,りーがる,りーす,りーぜんと,りーむ,りーる,りありてぃー,りえき,りお,りか,りかい,りきがく,りきし,りく,りくち,りくつ,りけい,りこう,りし,りす,りすく,りそう,りぞっと,りちぎ,りっとる,りっぷ,りとますしけんし,りべっと,りゅっく,りゅっくさっく,りょうし,りょうり,りょこう,りんぐ,りんご
る,るー,るーく,るーと,るーばー,るーぶる,るーぺ,るーまにあ,るーる,るーれっと,るいべ,るしふぁ,るす,るび,るびー,るり
れ,れーる,れい,れこーど
ろ,ろう,ろうそ,ろうそく,ろくろ,ろし,ろば,ろびー,ろぼっと
わ,わがし,わざ,わた,わだち,わな,わび,わら
─────
ruby shiritori.jpg
─────
Rubyインターネットプログラミング教室―14歳からはじめる

Rubyインターネットプログラミング教室―14歳からはじめる

  • 作者: 掌田 津耶乃
  • 出版社/メーカー: ラトルズ
  • 発売日: 2007/03
  • メディア: 単行本

nice!(1)  コメント(0)  トラックバック(0) 

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。