開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- Ruby (プログラミング言語)
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスの作成と既存クラスの変更), 13.2(クラスの作り方)、13.3(インスタンス変数)、13.4(newとinitialize)、13.5(ベビードラゴンゲーム)、13.6(練習問題の続き)、対話的ベビードラゴン、を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
対話的ベビードラゴン
コード(BBEdit)
sample.rb
#!/usr/bin/env ruby #-*- 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 if @asleep passage_of_time end if @asleep puts "#{@name}がいびきをかいて、部屋が煙だらけです。" end 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 = @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}がうんちのためにしゃがみ込みます。" end end end print 'ベビードラゴンの名前を入力してください: ' name = gets.chomp name = '匿名' if name =~ /^\s*$/ pet = Dragon.new name while true print 'コマンド(feed/walk/bed/toss/rock)を入力: ' command = gets.chomp case command when /^\s*$/ then break when 'feed' then pet.feed when 'walk' then pet.walk when 'bed' then pet.put_to_bed when 'toss' then pet.toss when 'rock' then pet.rock else puts 'コマンドを確認してください。' end end
入出力結果(Terminal)
$ ./sample.rb ベビードラゴンの名前を入力してください: ノーバート ノーバートが生まれました。 コマンド(feed/walk/bed/toss/rock)を入力: feed ノーバートにご飯を上げます。 コマンド(feed/walk/bed/toss/rock)を入力: toss ノーバートに高い高いをします。 ノーバートが笑ってあなたの眉毛が焦げます。 コマンド(feed/walk/bed/toss/rock)を入力: walk ノーバートをトイレに連れていきます。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートがいびきをかいて、部屋が煙だらけです。 ノーバートがいびきをかいて、部屋が煙だらけです。 ノーバートがいびきをかいて、部屋が煙だらけです。 ノーバートはゆっくり目覚めます。 コマンド(feed/walk/bed/toss/rock)を入力: rock ノーバートをやさしくあやします。 ノーバートは少し居眠りをします。 しかし、やめると起きてしまいます。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします! ノーバートのお腹が鳴っています。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします! ノーバートのお腹が鳴っています。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします! ノーバートのお腹が鳴っています。 ノーバートがうんちのためにしゃがみ込みます。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします! ノーバートがお腹をすかせています。我慢できなくてあなたを食べました。 $
ちなみにpython3.4の場合。
コード(BBEdit)
sample.py
#!/usr/bin/env python3 #-*- coding: utf-8 -*- import sys import re 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('{}にご飯を上げます。'.format(self._name)) self._stuff_in_belly = 10 self._passageOfTime() def walk(self): print('{0}をトイレに連れていきます。'.format(self._name)) self._stuff_in_intestine = 0 self._passageOfTime() def putToBed(self): print('{0}を寝かしつけます。'.format(self._name)) self._asleep = True for i in range(3): if self._asleep: self._passageOfTime() 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._passageOfTime() def rock(self): print('{0}をやさしくあやします。'.format(self._name)) self._asleep = True print('{0}は少し居眠りをします。'.format(self._name)) self._passageOfTime() if self._asleep: self._asleep = False print('しかし、やめると起きてしまいます。') def _isHungry(self): return self._stuff_in_belly <= 2 def _isPoopy(self): return self._stuff_in_intestine >= 8 def _passageOfTime(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}が突然目を様s増す!'.format(self._name)) print('{0}がお腹をすかせています。我慢できなくてあなたを食べました。'. format(self._name)) sys.exit() if self._stuff_in_intestine >= 10: self._stuff_in_intestine = 0 print('うわっ、{0}がお漏らしを…'.format(self._name)) if self._isHungry(): if self._asleep: self._asleep = False print('{0}が突然目を覚まします。'.format(self._name)) print('{0}のお腹が鳴っています。'.format(self._name)) if self._isPoopy(): if self._asleep: print('{0}が突然目を覚まします。'.format(self._name)) print('{0}がうんちのためにしゃがみ込みます。'.format(self._name)) name = input('ベビードラゴンの名前を入力してください。') if re.match(r'^\s*$', name): name = '匿名' pet = Dragon(name) while True: command = input('コマンド(feed/walk/bed/toss/rock)を入力: ') if re.match(r'^\s*$', command): break if command == 'feed': pet.feed() elif command == 'walk': pet.walk() elif command == 'bed': pet.putToBed() elif command == 'toss': pet.toss() elif command == 'rock': pet.rock() else: print('コマンド入力を確認してください。')
入出力結果(Terminal)
$ ./sample.py ベビードラゴンの名前を入力してください。ノーバート ノーバートが生まれました。 コマンド(feed/walk/bed/toss/rock)を入力: feed ノーバートにご飯を上げます。 コマンド(feed/walk/bed/toss/rock)を入力: toss ノーバートに高い高いをします。 ノーバートが笑ってあなたの眉毛が焦げます。 コマンド(feed/walk/bed/toss/rock)を入力: walk ノーバートをトイレに連れていきます。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートがいびきをかいて、部屋が煙だらけです。 ノーバートがいびきをかいて、部屋が煙だらけです。 ノーバートがいびきをかいて、部屋が煙だらけです。 ノーバートはゆっくり目覚めます。 コマンド(feed/walk/bed/toss/rock)を入力: rock ノーバートをやさしくあやします。 ノーバートは少し居眠りをします。 しかし、やめると起きてしまいます。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします。 ノーバートのお腹が鳴っています。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします。 ノーバートのお腹が鳴っています。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を覚まします。 ノーバートのお腹が鳴っています。 ノーバートがうんちのためにしゃがみ込みます。 コマンド(feed/walk/bed/toss/rock)を入力: bed ノーバートを寝かしつけます。 ノーバートが突然目を様s増す! ノーバートがお腹をすかせています。我慢できなくてあなたを食べました。 $
0 コメント:
コメントを投稿