2013年1月1日火曜日

開発環境

『初めてのプログラミング 第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 poppy?
    @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 poppy?
      if @asleep
        @asleep = false
        puts "#{@name}が突然目を覚まします!"
      end
      puts "#{@name}がうんちのためにしゃがみ込みます。"
    end
  end
end

print "ドラゴンの名前を入力: "
name = gets.chomp
name = "匿名" if name =~ /^\s*$/
pet = Dragon.new name
while true
  print "コマンド(f/t/w/p/r/空白で終了/)を入力: "
  case command = gets.chomp
    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/空白で終了/)を入力: 
$ ./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
ノーバートを寝かしつけます。
ノーバートが突然目を覚まします。
ノーバートがお腹をすかせています。我慢できなくてあなたを食べました。
$ ./sample.rb
ドラゴンの名前を入力: 
匿名が生まれました。
コマンド(f/t/w/p/r/空白で終了/)を入力: ruby
コマンドを確認してください。
コマンド(f/t/w/p/r/空白で終了/)を入力: 
$

ちなみにJavaScriptの場合。

コード(BBEdit)

<label id="l0">
名前: <input id="name" type="text" value="ノーバート"/>
</label><input id="btn0"  type="button" value="ベビードラゴン誕生"/><br />
<label id="l1">コマンド
<select id="commands">
<option value="feed">餌を与える</option>
<option value="toss">高い高いをする</option>
<option value="walk">散歩に行く</option>
<option value="put_to_bed">寝かしつける</option>
<option value="rock">あやす</option>
</select>
</label>
<input id="btn1" type="button" value="コマンド" />
<script>
var Dragon = function(name){
  var name = name;
  var asleep = false;
  var stuff_in_belly = 10;
  var stuff_in_intestine = 0;
  $('#pre0').append(name + "が生まれました。\n");
  this.feed = function(){
    $('#pre0').append( name + "にご飯をあげます。\n");
    stuff_in_belly = 10;
    passage_of_time();
  };
  
  this.walk = function(){
    $('#pre0').append( name + "をトイレに連れていきます。\n");
    stuff_in_intestine = 0;
    passage_of_time()
  };
  this.put_to_bed = function(){
    $('#pre0').append( name + "を寝かしつけます。\n");
    asleep = true;
    for(var i = 0; i < 3; i++){
      if(asleep) passage_of_time();
      if(asleep) $('#pre0').append( name + "がいびきをかいて、部屋が煙だらけです。\n");
    }
    if( asleep ){
      asleep = false
      $('#pre0').append( name + "はゆっくり目覚めます。\n");
    }
  };
  this.toss = function(){
    $('#pre0').append( name + "に高い高いをします。\n");
    $('#pre0').append( name + "が笑ってあなたの眉毛が焦げます。\n");
    passage_of_time()
  };
  this.rock = function(){
    $('#pre0').append( name + "をやさしくあやします。\n");
    asleep = true;
    $('#pre0').append( name + "は少し居眠りをします。\n");
    passage_of_time();
    if( asleep ){
      asleep = false;
      $('#pre0').append( "しかし、やめると起きてしまいます。\n");
    }
  };
  
  var hungry = function(){
    return stuff_in_belly <= 2
  };
  var poppy = function(){
    return stuff_in_intestine >= 8
  };
  var passage_of_time = function(){
    if( stuff_in_belly > 0){
      stuff_in_belly -= 1
      stuff_in_intestine += 1
    } else {
      if( asleep ){
        asleep = false
        $('#pre0').append( name + "が突然目を覚まします。\n");
      }
      $('#pre0').append( name + "がお腹をすかせています。我慢できなくてあなたを食べました。\n");
      $('#l1').remove();
      $('#btn1').remove();
      return;
    }
    if( stuff_in_intestine >= 10 ){
      stuff_in_intestine = 0;
      $('#pre0').append( "うわっ、" + name + "がおもらしを・・・・・・\n");
    }
    if( hungry() ){
      if( asleep ){
        asleep = false;
        $('#pre0').append( name + "が突然目を覚まします!\n");
      }
      $('#pre0').append( name + "のお腹が鳴っています。\n");
    }
    if( poppy() ){
      if( asleep ){
        asleep = false;
        $('#pre0').append( name + "が突然目を覚まします!\n");
      }
      $('#pre0').append( name + "がうんちのためにしゃがみ込みます。\n");
    }
  };
};
var pet;
function clicked1(){
  var name = $('#name').val();
  if(/^\s*$/.test(name)) name = "匿名";
  pet = new Dragon(name);
  $('#l0').remove();
  $('#btn0').remove();
};
function clicked2(){
  if(!pet){
    $('#pre0').append("まだ赤ちゃんは誕生していません。\n");
    return;
  }
  var $select = $('#commands');
  var command = $('option:selected', $select).val();
  switch(command){
    case "feed": pet.feed(); break;
    case "toss": pet.toss(); break;
    case "walk": pet.walk(); break;
    case "put_to_bed": pet.put_to_bed(); break;
    case "rock": pet.rock(); break;
  }
}
$('#btn0').click(clicked1);
$('#btn1').click(clicked2);
$('#name').keydown(function(e){
  if(e.keyCode === 13) clicked1();
});
$('#commands').keydown(function(e){
  if(e.keyCode === 13) clicked2();
});
</script>



pythonの場合。

sample.py

コード(BBEdit)

#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-

class Dragon:
    def __init__(self, name):
        self._name = name
        self._asleep = False
        self._stuff_in_belly = 10
        self._stuff_in_intestine = 0
        print( "{0}が生まれました。".format(name))
    def feed(self):
        print( "{0}にご飯をあげます".format(self._name))
        self._stuff_in_belly = 10
        self._passage_of_time()
        
    def walk(self):
        print( "{0}をトイレに連れていきます。".format(self._name))
        self._stuff_in_intestine = 0
        self._passage_of_time()
      
    def put_to_bed(self):
        print( "{0}を寝かしつけます。".format(self._name))
        self._asleep = True
        for x in range(3):
            if self._asleep:
                self._passage_of_time()
            if self._asleep:
                print( "{0}がいびきをかいて、部屋が煙だらけです。".format(self._name))
        
        if self._asleep:
            self._asleep = False
            print( "{0}はゆっくり目覚めます。".format(self._name))

    def toss(self):
        print( "{0}に高い高いをします。".format(self._name))
        print( "{0}が笑ってあなたの眉毛が焦げます。".format(self._name))
        self._passage_of_time()
          
    def rock(self):
        print( "{0}をやさしくあやします。".format(self._name))
        self._asleep = True
        print( "{0}は少し居眠りをします。".format(self._name))
        self._passage_of_time()
        if self._asleep:
            self._asleep = False
            print( "しかし、やめると起きてしまいます。".format(self._name))
        
    def _hungry(self):
        return self._stuff_in_belly <= 2
          
    def _poppy(self):
        return self._stuff_in_intestine >= 8
      
    def _passage_of_time(self):
        if self._stuff_in_belly > 0:
           self._stuff_in_belly -= 1
           self._stuff_in_intestine += 1
        else:
            if self._asleep:
                self._asleep = False
                print( "{0}が突然目を覚まします。".format(self._name))
            print( "{0}がお腹をすかせています。我慢できなくてあなたを食べました。".format(
              self._name))
            import sys
            sys.exit()
        if self._stuff_in_intestine >= 10:
            self._stuff_in_intestine = 0
            print( "うわっ、{0}がおもらしを・・・・・・".format(self._name))
        
        if self._hungry():
            if self._asleep:
                self._asleep = False
                print( "{0}が突然目を覚まします!".format(self._name))
            print( "{0}のお腹が鳴っています。".format(self._name))
        
        if self._poppy():
            if self._asleep:
                self._asleep = False
                print( "{0}が突然目を覚まします!".format(self._name))
            print( "{0}がうんちのためにしゃがみ込みます。".format(self._name))
        
    
name = input("ドラゴンの名前を入力: ")

import re

if re.search(r"^\s*$", name):
    name = "匿名"
pet = Dragon(name)
commands = {'f':pet.feed, 't':pet.toss, 
            'w':pet.walk, 'p':pet.put_to_bed,
            'r':pet.rock}
while True:
    command = input("コマンド(f/t/w/p/r/空白で終了/)を入力: ")
    if re.search(r"^\s*$", command): break
    if not command in commands:
        print("コマンドを確認してください。")
    else:
        commands[command]()

入出力結果(Terminal)

$ ./sample.py
ドラゴンの名前を入力: 
匿名が生まれました。
コマンド(f/t/w/p/r/空白で終了/)を入力: python
コマンドを確認してください。
コマンド(f/t/w/p/r/空白で終了/)を入力: 
$ ./sample.py
ドラゴンの名前を入力: ノーバート
ノーバートが生まれました。
コマンド(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
ノーバートを寝かしつけます。
ノーバートが突然目を覚まします。
ノーバートがお腹をすかせています。我慢できなくてあなたを食べました。
$

0 コメント:

コメントを投稿