タグ別アーカイブ: python

大阪の居酒屋ランチのバイキングルールをPythonで実装してみた

タグ: , | 投稿日: 投稿者:

こんにちはベッチです。

昨日出張で大阪に行ってきました。

大阪っぽい食事をしたかったのですが事前調査など全くしていなかった結果、大阪駅近くにある「新梅田食堂街」という所にある「梅田木曽路」という居酒屋ランチを食べる事にしました。

梅田木曽路

バイキング形式で550円でした。

安い。

ただし、安いバイキングという事で独自のルールが課せられます。

以下がそのルールです。

木曽路バイキングルール

いやー、ルールがやかましいですね!

でもコストパフォーマンス優れてる事考えれば特に気になりません。

ただし、ルール守らないとちょっとこわいおばちゃんに叱られます。

気になる方は是非行ってみて下さい。

という前置きはさておき、この梅田木曽路のバイキングルールをPythonで実装してみました。

module.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

MAX_COUNT = 1 # おかわりは1回まで

AMOUNT_SMALL = '少なめ'
AMOUNT_REGULAR = '普通'

FOOD_RICE = 'ごはん'
FOOD_MISO_SOUP = 'みそ汁'
FOOD_SIDE_DISH = 'おかず'
FOOD_FRUITS = 'フルーツ'
FOOD_OMELET = '玉子焼'

class Food:

	def __init__(self, name, amount, human):
		self._name = name # 名前(ごはん、みそ汁、おかず、フルーツ、玉子焼)
		self._count = 0 # おかわり回数
		self._amount = amount # 量
		self._first_amount = amount # 量
		self._human = human # 食べる人

	def get_name(self):
		return self._name
	def set_name(self, name):
		self._name = name
	def del_name(self):
		del self._name
	name = property(get_name, set_name, del_name)

	def get_count(self):
		return self._count
	def set_count(self, count):
		self._count = count
	def del_count(self):
		del self._count
	count = property(get_count, set_count, del_count)

	def get_amount(self):
		return self._amount
	def set_amount(self, amount):
		self._amount = amount
	def del_amount(self):
		del self._amount
	amount = property(get_amount, set_amount, del_amount)

	def get_first_amount(self):
		return self._first_amount
	def set_first_amount(self, first_amount):
		self._first_amount = first_amount
	def del_first_amount(self):
		del self._first_amount
	first_amount = property(get_first_amount, set_first_amount, del_first_amount)

	def get_human(self):
		return self._human
	def set_human(self, human):
		self._human = human
	def del_human(self):
		del self._human
	human = property(get_human, set_human, del_human)

class Human:

	def __init__(self, name):
		self._name = name # 名前
		self._lunch = []

	def get_name(self):
		return self._name
	def set_name(self, name):
		self._name = name
	def del_name(self):
		del self._name
	name = property(get_name, set_name, del_name)

	def get_lunch(self):
		return self._lunch
	def set_lunch(self, lunch):
		self._lunch = lunch
	def del_lunch(self):
		del self._lunch
	lunch = property(get_lunch, set_lunch, del_lunch)

	# 最初の準備をする
	def ready(self, name, amount):
		food = Food(name, amount, self)
		self.lunch.append(food)
		print name + 'を準備しました'
		return food

	# 食べる
	def eat(self, food):
		print food.name + 'を食べます'
		if food.human != self:
			print '[店員]自分のものは自分で食べなさいよ!'
			return

		if food.amount is None:
			print '[店員]' + food.name + '食べたければ自分で準備しなさいよ!'

		print food.name + 'を食べました'
		food.amount = None

	# おかわり
	def get_seconds(self, food, amount):
		food.count = food.count + 1
		print food.name + 'のおかわりをします'

		for my_food in self.lunch:
			if my_food.name is food.name:
				if my_food != food:
					print '[店員]器は最初に用意したものをつかってくれ!'
					return

		if food.name == FOOD_OMELET:
			print '[店員]' + food.name + 'はおかわりできないよ!'
			return

		if food.name == FOOD_SIDE_DISH:
			for my_food in self.lunch:
				if my_food.name == FOOD_RICE and my_food.first_amount == AMOUNT_SMALL:
					print '[店員]最初のごはんの量が少ないからおかずのおかわりはできないよ!'
					return

		if food.count > MAX_COUNT:
			print '[店員]' + food.name + 'のおかわりは既に一回してるだろ!'
			return

		if not food.amount is None:
			print '[店員]全部食べきってからじゃないとおかわりできないよ!'
			return

		food.amount = amount
		print food.name + 'のおかわりをしました'
		self.eat(food)

	# 帰る
	def go_back(self):
		for my_food in self.lunch:
			if not my_food.amount is None:
				print '[店員]' + my_food.name + 'がまだ残っているわよ!'
				return
		print 'ごちそうさまでした'

kisojiLunch.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

if __name__ == "__main__":

	import module

	betchi = module.Human('betchi')

	rice = betchi.ready(module.FOOD_RICE, module.AMOUNT_SMALL);
	miso_soup = betchi.ready(module.FOOD_MISO_SOUP, module.AMOUNT_REGULAR);
	side_dish = betchi.ready(module.FOOD_SIDE_DISH, module.AMOUNT_REGULAR);
	omelet = betchi.ready(module.FOOD_OMELET, module.AMOUNT_REGULAR);

	betchi.eat(rice)
	betchi.get_seconds(rice, module.AMOUNT_REGULAR)
	betchi.eat(miso_soup)
	betchi.eat(side_dish)
	betchi.get_seconds(side_dish, module.AMOUNT_REGULAR)

	betchi.eat(omelet)
	betchi.get_seconds(omelet, module.AMOUNT_REGULAR)

	betchi.go_back()

pythonが実行できる環境で「python kisojiLunch.py」ってやってもらえれば実行できます。

実行結果はこんな感じです。

ごはんを準備しました
みそ汁を準備しました
おかずを準備しました
玉子焼を準備しました
ごはんを食べます
ごはんを食べました
ごはんのおかわりをします
ごはんのおかわりをしました
ごはんを食べます
ごはんを食べました
みそ汁を食べます
みそ汁を食べました
おかずを食べます
おかずを食べました
おかずのおかわりをします
[店員]最初のごはんの量が少ないからおかずのおかわりはできないよ!
玉子焼を食べます
玉子焼を食べました
玉子焼のおかわりをします
[店員]玉子焼はおかわりできないよ!
ごちそうさまでした

みなさんもたまには身の回りのものを実装してみてはいかがでしょうか。

それでは良い週末を。