開発環境
- 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 コメント:
コメントを投稿