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