雨のち晴れ

北海道在住。緑色のハムスターだハム

pythonの勉強-自動販売機システムの作成-2

前回の続き pythonの勉強-自動販売機システムの作成です。
morisoba-delo02.hatenablog.com





前回の設定した目標は

  • メニューにランダムを追加しランダムを選択した場合はメニュー内からランダムに商品を選ぶ
  • コードをきれいに書く、ただ処理を書いていくのではなくてオブジェクト指向?とやらを意識する


上記のことを踏まえ

  • menulist.txt に random:120を追加しrandomが選択された場合にランダムに他のメニューが選択されるようにした。
  • 購入処理の関数 purchase を作成

menulist.txtの内容

orange:110
apple:150
cola:200
random:120

以下、今回書いたソースコード

# coding: utf-8
import random
r = open("menulist.txt","r") #自販機のメニューが書いてあるテキストファイルの読み込み
menu = r.read()	#自販機のメニュー
menu_line = menu.split("\n")	#自販機のメニューを行ごとに分割し代入
menu_num = len(menu_line)-1	#メニューの数を代入
print(menu_line)

def purchase(word):	#購入処理
	change = int(purchase_info[1]) - int(word[1])
	print("order:"+ word[0])
	print("insert_money:"+ purchase_info[1])
	print("change:"+ str(change))

while(True):
	
	print("""please input bevarage menu and insert money!
	
	bevarage menu:money
	
	if you want to close application, please input exit!""")
	
	input_info = raw_input()
	if(input_info == "exit"):
		break
		
	purchase_info = input_info.split(":")	#入力情報をコロンで分割しそれぞれpurchase_infoに代入
		 
	if(len(purchase_info)) != 2 or purchase_info[1].isdigit() != True:	#purchse_infoの長さが2じゃない場合、数字が入力されていない場合のエラー処理
		print("error! input is incorrect")
		continue
	
	for menu_info in menu_line:	#メニューの情報をmenu_infoに代入
		word = menu_info.split(":")	#メニューの情報をコロンで分割しwordに代入
		
		if int(word[1]) > int(purchase_info[1]):#入力した金額が購入金額より少ない場合のエラー処理
			print("error! money is not enough!")
			break
			
		if word[0] == "random":	#randomを選択した時の処理
			ran_choice = menu_line[random.randint(0,menu_num-1)]
			word = ran_choice.split(":")
			purchase(word)
			break
			
		if word[0] == purchase_info[0]:#入力した情報がメニュー内にある場合の処理(購入)
			purchase(word)
			break

多少前回よりはプログラムが綺麗になった気がするけど、まだまだ改善の余地があると思う。
変数名をもっとわかりやすくすると可読性が上がると思うけどなかなか良いのが浮かばない…

とりあえず自動販売機システムは一旦これで終了。