2013年10月25日金曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスの作成と既存クラスの変更), 13.2(クラスの作り方)、13.3(インスタンス変数)、13.4(newとinitialize)、13.5(ベビードラゴンゲーム)、13.6(練習問題の続き)、対話的ベビードラゴン、を解いてみる。

その他参考書籍

対話的ベビードラゴン

コード(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 コメント:

コメントを投稿