2013年3月16日土曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスの作成と既存クラスの変更), 13.6(練習問題)対話的ベビードラゴン を解いてみる。

その他参考書籍

対話的ベビードラゴン

コード(BBEdit)

sample.rb

#!/usr/bin/env ruby1.9
#-*- coding: utf-8 -*-

class Dragon
    def initialize name
        @name = name
        @asleep = false
        @stuff_in_belly = 10
        @stuff_in_intestine = 0
        
        puts "#{@name}が生まれました。"
    end
    
    def feed
        puts "#{@name}にご飯をあげます。"
        @stuff_in_belly = 10
        passage_of_time
    end
    
    def walk
        puts "#{@name}をトイレに連れていきます。"
        @stuff_in_intestine = 0
        passage_of_time
    end
    
    def put_to_bed
        puts "#{@name}を寝かしつけます。"
        @asleep = true
        3.times do
            passage_of_time if @asleep
            puts "#{@name}がいびきをかいて、部屋が煙だらけです。" if @asleep
        end
        if @asleep
            @asleep = false
            puts "#{@name}はゆっくり目覚めます。"
        end
    end
    
    def toss
        puts "#{@name}に高い高いをします。"
        puts "#{@name}が笑ってあなたの眉毛が焦げます。"
        passage_of_time
    end
    
    def rock
        puts "#{@name}をやさしくあやします。"
        @asleep = true
        puts "#{@name}は少し居眠りをします。"
        passage_of_time
        if @asleep
            @asleep = false
            puts "しかし、やめると起きてしまいます。"
        end
    end
    
    private
    
    def hungry?
        @stuff_in_belly <= 2
    end
    
    def poopy?
        @stuff_in_intestine >= 8
    end
    
    def passage_of_time
        if @stuff_in_belly > 0
            @stuff_in_belly -= 1
            @stuff_in_intestine += 1
        else
            if @asleep
                @asleep = false
                puts "#{@name}が突然目を覚まします!"
            end
            puts "#{@name}がお腹をすかせています。我慢できなくなってあなたを食べました。"
            exit
        end
        
        if @stuff_in_intestine >= 10
            @stuff_in_intestine = 0
            puts "うわっ、#{@name}がおもらしを…"
        end
        
        if hungry?
            if @asleep
                @asleep = false
                puts "#{@name}が突然目を覚まします!"
            end
            puts "#{@name}のお腹が鳴っています。"
        end
        
        if poopy?
            if @asleep
                @asleep = falseputs "#{@name}が突然目を覚まします!"
            end
            puts "#{@name}がうんちのためにしゃがみ込みます。"
        end
    end
end

pet = Dragon.new 'ノーバート'

while true
    print "コマンド(f/t/w/p/r)を入力(空白で終了): "
    command = gets.chomp
    case command
        when /^\s*$/ then break
        when 'f' then pet.feed
        when 't' then pet.toss
        when 'w' then pet.walk
        when 'p' then pet.put_to_bed
        when 'r' then pet.rock
        else puts "入力コマンドを確認を確認してください。"
    end
end

入出力結果(Terminal)

$ ./sample.rb
ノーバートが生まれました。
コマンド(f/t/w/p/r)を入力(空白で終了): f
ノーバートにご飯をあげます。
コマンド(f/t/w/p/r)を入力(空白で終了): t
ノーバートに高い高いをします。
ノーバートが笑ってあなたの眉毛が焦げます。
コマンド(f/t/w/p/r)を入力(空白で終了): w
ノーバートをトイレに連れていきます。
コマンド(f/t/w/p/r)を入力(空白で終了): p
ノーバートを寝かしつけます。
ノーバートがいびきをかいて、部屋が煙だらけです。
ノーバートがいびきをかいて、部屋が煙だらけです。
ノーバートがいびきをかいて、部屋が煙だらけです。
ノーバートはゆっくり目覚めます。
コマンド(f/t/w/p/r)を入力(空白で終了): r
ノーバートをやさしくあやします。
ノーバートは少し居眠りをします。
しかし、やめると起きてしまいます。
コマンド(f/t/w/p/r)を入力(空白で終了): p
ノーバートを寝かしつけます。
ノーバートが突然目を覚まします!
ノーバートのお腹が鳴っています。
コマンド(f/t/w/p/r)を入力(空白で終了): p
ノーバートを寝かしつけます。
ノーバートが突然目を覚まします!
ノーバートのお腹が鳴っています。
コマンド(f/t/w/p/r)を入力(空白で終了): p
ノーバートを寝かしつけます。
ノーバートが突然目を覚まします!
ノーバートのお腹が鳴っています。
ノーバートがうんちのためにしゃがみ込みます。
コマンド(f/t/w/p/r)を入力(空白で終了): p
ノーバートを寝かしつけます。
ノーバートが突然目を覚まします!
ノーバートがお腹をすかせています。我慢できなくなってあなたを食べました。
$

ちなみにJavaScriptの場合。

ソースコード(BBEdit)

HTML

<div id="d0">
</div>
<div id="d1">
<label>名前: <input id="pet_name" typd="text" value="ノーバート" /></label>
<input type="button" value="born" onclick="born()" />
</div>

JavaScript

var $d1 = $('#d1'),
    Dragon = function( name ) {
        var p = 0;
        var name = name,
            asleep = false,
            stuff_in_belly = 10,
            stuff_in_intestine = 0,
            $d0 = $('#d0'),
            $pre1 = $(document.createElement('pre')),
            isHungry = function(  ) {
                return stuff_in_belly <= 2;
            },
            isPoopy = function (  ) {
                return stuff_in_intestine >= 8;
            },
            passage_of_time = function (  ) {
                if ( stuff_in_belly > 0 ) {
                    stuff_in_belly -= 1;
                    stuff_in_intestine += 1;
                } else {
                    if ( asleep ) {
                        asleep = false;
                        $pre1.append(name + "が突然目を覚まします。\n");
                    }
                    $pre1.append(name + "がお腹をすかせています。" +
                        "我慢できなくてあなたを食べました。\n" +
                        "ゲームオーバー 得点: " + p + "点\n");
                    $d1.html(
                        '<label>名前: <input id="pet_name" typd="text" value="ノーバート" /></label>' +
                        '<input type="button" value="born" onclick="born()" />');
                    return;
                }
                if ( stuff_in_intestine >= 10 ) {
                    stuff_in_intestine = 0;
                    $pre1.append("うわっ、" + name + "がおもらしを…\n");
                }
                if ( isHungry() ) {
                    if ( asleep ) {
                        asleep = false
                        $pre1.append( name + "が突然目を覚まします!\n" );
                    }
                    $pre1.append( name + "のお腹が鳴っています。\n");
                }
                if ( isPoopy() ) {
                    if ( asleep ) {
                        asleep = false;
                        $pre1.append( name + "が突然目を覚まします!\n");
                    }
                    $pre1.append( name + "がうんちのためにしゃがみ込みます。\n");
                }
            },
            point = function ( ) {
                p += 1;
                if ( p % 5 === 0 ) {
                    alert( p + "点突破!");
                }
            },
            i;
        this.feed = function (  ) {
            point();
            $pre1.append( name + "にご飯をあげます。\n");
            stuff_in_belly = 10;
            passage_of_time();
        },
        this.walk = function (  ) {
            point();
            $pre1.append( name + "をトイレに連れていきます。\n");
            stuff_in_intestine = 0;
            passage_of_time();
        };
        this.putToBed = function (  ) {
            point();
            $pre1.append( name + "を寝かしつけます。\n");
            asleep = true;
            for( i = 0; i < 3; i += 1 ) {
                if ( asleep ) {
                    passage_of_time();
                }
                if ( asleep ) {
                    $pre1.append( name + "がいびきをかいて、部屋が煙だらけです。\n");
                }
            }
            if ( asleep ) {
                asleep = false;
                $pre1.append( name + "はゆっくり目覚めます。\n");
            }
        },
        this.toss = function(  ) {
            point();
            $pre1.append( name + "に高い高いをします。\n" + 
                name + "が笑ってあなたの眉毛が焦げます。\n");
            passage_of_time();
        },
        this.rock = function (  ) {
            point();
            $pre1.append( name + "をやさしくあやします。\n");
            asleep = true
            $pre1.append( name + "は少し居眠りをします。\n");
            passage_of_time();
            if ( asleep ) {
                asleep = false;
                $pre1.append("しかし、やめると起きてしまいます。\n");
            }
        };
        $('#d0').html('');
        $pre1.append(name + "が生まれました。\n");
        $d0.append($pre1);
    },
    pet,
    born = function (  ) {
        var commands = ["feed", "walk", "putToBed","toss","rock"],
            result = "",
            i, max;
        this.pet = new Dragon($('#pet_name').val());
        for (i = 0, max = commands.length; i < max; i += 1) {
            result += '<input type="button" value="' + commands[i] + 
                '" onclick="pet.' + commands[i] + '()" />';
        }
        $d1.html(result);
    };

0 コメント:

コメントを投稿