開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語:Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスのオブジェクト), 13.6(練習問題の続き)対話的ベビードラゴン を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
対話的ベビードラゴン
コード(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 コメント:
コメントを投稿