開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: 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 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 コメント:
コメントを投稿