2012年11月26日月曜日

開発環境

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

その他参考書籍

対話的ベビードラゴン

コード(TextWrangler)

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
      @alseep = 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 = false
        puts "#{@name}が突然目を覚まします!"
      end
      puts "#{@name}がうtんちのためにしゃがみ込みます。"
    end
  end
end

print "名前を入力: "
name = gets.chomp
name = "匿名" if name =~ /^\s*$/
pet = Dragon.new name
while true
  print "コマンド(餌をやる(f)トイレ(w)寝かす(p)遊ぶ(t)あやす(r)(中止(q))を入力: "
  case gets.chomp
    when 'q' then break
    when 'f' then pet.feed
    when 'w' then pet.walk
    when 'p' then pet.put_to_bed
    when 't' then pet.toss
    when 'r' then pet.rock
    else puts "コマンドを確認してください。"
  end
end

入出力結果(Terminal)

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

ちなみにJavaScriptの場合。

コード(TextWrangler)

try{
  var Dragon = function(name){
    var name = name;
    var asleep = false;
    var stuff_in_belly = 10;
    var stuff_in_intestine = 0;
    $('#d0').append(name + "が生まれました<br />");
    var hungry = function(){
      return stuff_in_belly <= 2;
    };
    var poopy = 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;
          $('#d0').append(name + "が突然目を覚まします!<br />");
        }
        $('#d0').append(name + "がお腹をすかせて我慢できなくてあなたを食べました<br />");
        this.pet = undefined;
        throw "ゲーム終了";
      }
      if(stuff_in_intestine >= 10){
        stuff_in_intestine = 0;
        $('#d0').append(name + "がおもらしを・・・<br />");
      }
      if(hungry()){
        if(asleep){
          asleep = false;
          $('#d0').append(name + "が突然目を覚まします!<br />");
        }
        $('#d0').append(name + "のお腹が鳴っています<br />");
      }
      if(poopy()){
        if(asleep){
          asleep = false
          $('#d0').append(name + "が突然目を覚まします!<br />");
        }
        $('#d0').append(name + "がうんちのためにしゃがみ込みます<br />");
      }
    };
    this.feed = function(){
      $('#d0').append(name + "にご飯をあげます<br />");
      stuff_in_belly = 10;
      passage_of_time();
    };
    this.walk = function(){
      $('#d0').append(name + "をトイレに連れていきます<br />");
      stuff_in_intestine = 0;
      passage_of_time();
    };
    this.put_to_bed = function(){
      $('#d0').append(name + "をねかしつけます<br />");
      asleep = true;
      for(var i = 0; i < 3; i++){
        if(asleep) passage_of_time();
        if(asleep) $('#d0').append(name + "がいびきをかいて部屋が煙だらけです<br />");
      }
      if(asleep){
        asleep = false;
        $('#d0').append(name + "がゆっくり目覚めます<br />");
      }
    };
    this.toss = function(){
      $('#d0').append(name + "に高い高いをします<br />");
      $('#d0').append(name + "が笑ってあなたの眉毛が焦げます<br />");
      passage_of_time();
    };
    this.rock = function(){
      $('#d0').append(name + "をやさしくあやします<br />");
      asleep = true;
      $('#d0').append(name + "は少し居眠りをします<br />");
      passage_of_time();
      if(asleep){
        asleep = false;
        $('#d0').append("しかしやめると起きてしまいます<br />");
      }
    };
  };
} catch(e){
  $('#d0').append(e + "<br />");
}
var pet;
function born(){
  var name = prompt("名前を入力",null);
  if(/^\s*$/.test(name)) name = "匿名";
  pet = new Dragon(name); 
}
function feed(){
  if(pet){
    pet.feed();
  } else {
    $('#d0').append("ベビードラゴンを育てるボタンを押してください<br />");
  }
}
function walk(){
  if(pet){
    pet.walk();
  } else {
    $('#d0').append("ベビードラゴンを育てるボタンを押してください<br />");
  }
}
function put_to_bed(){
  if(pet){
    pet.put_to_bed();
  } else {
    $('#d0').append("ベビードラゴンを育てるボタンを押してください<br />");
  }
}
function toss(){
  if(pet){
    pet.toss();
  } else {
    $('#d0').append("ベビードラゴンを育てるボタンを押してください<br />");
  }
}
function rock(){
  if(pet){
    pet.rock();
  } else {
    $('#d0').append("ベビードラゴンを育てるボタンを押してください<br />");
  }
}
</script>
<div id="d0">

</div>
<input type="button" value="ベビードラゴンを育てる" onclick="born()" />
<input type="button" value="餌を与える" onclick="feed()" />
<input type="button" value="散歩に行く" onclick="walk()" />
<input type="button" value="寝かしつける" onclick="put_to_bed()" />
<input type="button" value="高い高いをする" onclick="toss()" />
<input type="button" value="あやす" onclick="rock()" />

pythonの場合。

sample.py

コード(TextWrangler)

#!/usr/bin/env python
# -*- 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(self.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.alseep = False
          print("しかし、やめると起きてしまいます。")
        
    
    def hungry(self):
        if self.stuff_in_belly <= 2:
            return True
    
    def poopy(self):
        if self.stuff_in_intestine >= 8:
            return True
    
    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.poopy():
            if self.asleep:
                self.asleep = False
                print("{0}が突然目を覚まします!".format(self.name))
            print("{0}がうtんちのためにしゃがみ込みます。".format(self.name))
        
    


print("名前を入力: ", end="")
name = input()
import re
pattern = re.compile(r"^\s*$")
name = name if not re.match(pattern, name) else "匿名"
pet = Dragon(name)
while True:
  print("コマンド(餌をやる(f)トイレ(w)寝かす(p)遊ぶ(t)あやす(r)(中止(q))を入力: ", end="")
  command = input()
  if command == 'q': break
  elif command == 'f': pet.feed()
  elif command == 'w': pet.walk()
  elif command == 'p': pet.put_to_bed()
  elif command == 't': pet.toss()
  elif command == 'r': pet.rock()
  else: print("込まん田尾を確認してください。")

入出力結果(Terminal)

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

0 コメント:

コメントを投稿