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