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