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