コード例 #1
0
ファイル: ui_yahtzee.py プロジェクト: iAmMortos/YahtzeeApp
class YahtzeeView (ui.View):
	
	def __init__(self):
		self._yahtzee = Yahtzee()
	
	def did_load(self):
		self.right_button_items = [ui.ButtonItem(image=ui.Image('iob:ios7_reload_32'), action=lambda s: self.restart(prompt=True))]
		self._highscore = highscore.get()
		self._update_title()
		
		self._dice_view = self['dice']
		self._dice_view.onrollfinished = self._handle_roll_finished
		self._dice_view.onholdchange = self._handle_hold_changed
		self._rolling = False
		
		self._roll_btn = self['roll_btn']
		self._roll_btn.action = lambda s: self._roll()	
		self._score_lbl = self['score']
		
		self._sv = self['categories']
		self._top_bonus_lbl = self._sv['top_bonus_slbl']
		self._top_total_lbl = self._sv['top_total_slbl']
		self._bonus_yahtzee_lbl = self._sv['bonus_yahtzee_slbl']
		self._bonus_yahtzee_ticks = self._sv['bonus_yahtzee_ticks']
		self._bot_total_lbl = self._sv['bot_total_slbl']
		
		self._category_buttons = {}
		self._init_score_buttons()
		self._update_views()
		
	def layout(self):
		x,y,w,h = self.frame
		dx,dy,dw,dh = self._dice_view.frame
		bx,by,bw,bh = self._roll_btn.frame
		sx,sy,sw,sh = self._sv.frame
		lx,ly,lw,lh = self._score_lbl.frame
		
		nby = dy + dh + 8
		self._roll_btn.frame = (bx,nby,bw,bh)
		self._score_lbl.frame = (lx,nby,lw,lh)
		
		nsy = nby + bh + 8
		nsh = h - 6 - dh - 8 - bh - 8
		self._sv.frame = (sx,nsy,sw,nsh)
		
	def _update_title(self):
		hs = self._highscore
		msg = ''
		if hs['score']:
			if hs['name'] != '':
				msg = ' (High Score: %s - %s)' % (hs['name'][:4], hs['score'])
			else:
				msg = ' (High Score: %s)' % hs['score']
		self.name = 'Yahtzee!%s' % msg
		
	def _make_category_dict(self, lst):
		d = {}
		for cat in lst:
			n,c = cat
			d[c] = self._make_category_btn(n, c)
		return d
		
	def _make_category_btn(self, name, category):
		btn = self._sv[name]
		btn.background_color = '#64c800'
		btn.tint_color = '#000'
		def press_action(sender):
			self._dice_view.release_all()
			score = self._yahtzee.score_dice_as(category)
			self._update_views()
			
			if self._yahtzee.is_game_over():
				self._game_over()
		btn.action = press_action
		
		return btn
		
	def _init_score_buttons(self):
		self._category_buttons = self._make_category_dict([
			('ones_sbtn', SC.ONES),
			('twos_sbtn', SC.TWOS),
			('threes_sbtn', SC.THREES),
			('fours_sbtn', SC.FOURS),
			('fives_sbtn', SC.FIVES),
			('sixes_sbtn', SC.SIXES),
			('toak_sbtn', SC.THREE_OF_A_KIND),
			('foak_sbtn', SC.FOUR_OF_A_KIND),
			('full_house_sbtn', SC.FULL_HOUSE),
			('smstr_sbtn', SC.SM_STRAIGHT),
			('lgstr_sbtn', SC.LG_STRAIGHT),
			('chance_sbtn', SC.CHANCE),
			('yahtzee_sbtn', SC.YAHTZEE)])
		
	def _update_views(self):
		actions = self._yahtzee.available_actions
		
		self._dice_view.enabled = GA.HOLD in actions
		
		self._roll_btn.enabled = not self._rolling and GA.ROLL in actions
		self._roll_btn.title = 'Roll (%s left)' % str(3 - self._yahtzee.cur_rolls)
		
		scorecard = self._yahtzee.scorecard
		self._score_lbl.text = 'Score\n%s' % scorecard.score
		
		self._top_bonus_lbl.text = str(scorecard.top_bonus)
		self._top_total_lbl.text = str(scorecard.top_score)
		self._bonus_yahtzee_ticks.text = '/'*scorecard.num_bonus_yahtzees
		self._bonus_yahtzee_lbl.text = str(scorecard.bonus_yahtzees)
		self._bot_total_lbl.text = str(scorecard.bottom_score)
		
		for cat in SC:
			btn = self._category_buttons[cat]
			score = self._yahtzee.scorecard.get_score_for(cat)
			btn.enabled = False
			if score is not None:
				btn.enabled = True
				btn.action = lambda s: None
				btn.title = str(score)
				btn.background_color = '#fff'
				btn.tint_color = '#000'
			else:
				if GA.SCORE in actions and not self._rolling:
					btn.enabled = True
					btn.title = '(%s)' % self._yahtzee.get_potential_score_for(cat)
				else:
					btn.title = ''
		
	def _roll(self):
		self._rolling = True
		self._yahtzee.roll()
		self._dice_view.roll_to(self._yahtzee.dice)
		self._update_views()
		
	@ui.in_background
	def _game_over(self):
		score = self._yahtzee.score
		msg = 'Your score is: %s' % score
		if score > self._highscore['score']:
			name = console.input_alert('High Score! Enter your name:')
			highscore.set(name, score)
			self._highscore = highscore.get()
			msg += '\nNew High Score!'
			self._update_title()
		result = dialogs.alert('GAME OVER!', msg, 'Restart', 'Quit', hide_cancel_button=True)
		if result == 1:
			self.restart()
			
	@ui.in_background
	def restart(self, prompt=False):
		result = 1
		if not self._yahtzee.is_game_over() and prompt:
			result = dialogs.alert('Start Over?', 'Progress will be lost.', 'Restart', 'Nevermind', hide_cancel_button=True)
			
		if result == 1:
			self._dice_view.reset()
			self._yahtzee.restart()
			self._init_score_buttons()
			self._update_views()
		
	def _handle_roll_finished(self):
		self._rolling = False
		self._update_views()
		
	def _handle_hold_changed(self, idx, val):
		if val:
			self._yahtzee.hold(idx)
		else:
			self._yahtzee.release(idx)