#coding=utf-8 #modificato da daniele.zambelli@inwind.it # class Pot(object): def __init__(self,name,capacity,volume=0): self._capacity=capacity self._volume=volume self._name=name def __str__(self): # return "%s: %s" % (self._name, self._volume) return self._name def name_and_vol(self): return "%s: %s" % (self._name, self._volume) def pour_into(self, other): """Travasa il contenuto di self in other. A volte ci sta tutto, a volte solo una parte.""" # Se riteniamo accettabili i travasi inutili, # il primo if si dovrebbe poter eliminare, # con i corrispondenti messaggi. if self._volume==0: print messages["vuoto"] elif other._volume==other._capacity: print messages["pieno"] else: if self._volume > (other._capacity - other._volume): self._volume -= (other._capacity - other._volume) other._volume=other._capacity else: other._volume += self._volume self._volume = 0 class State(object): def __init__(self, da, a, v0, v1, v2): self.da=da self.a=a self.v0=v0 self.v1=v1 self.v2=v2 def __str__(self): return ("%s --> %s:\t%s\t%s\t%s" % (self.da, self.a, self.v0, self.v1, self.v2)) def print_volumes(): print ("situazione attuale\t\t%s\t%s\t%s\n" % (pots['A'].name_and_vol(), pots['B'].name_and_vol(), pots['C'].name_and_vol())) def control_input(pots): print messages["inserisci"], while True: pot_name=raw_input() if pot_name.lower() == "quit": return None, None if len(pot_name) != 2: print messages["lettere_numero"]+"\n"+messages["inserisci"], else: p0, p1 = pot_name[0].upper(), pot_name[1].upper() if p0==p1: print messages["lettere_uguali"]+"\n"+messages["inserisci"], elif not (p0 in pots and p1 in pots): print messages["lettere_sbagliate"]+"\n"+messages["inserisci"], else: return pots[p0], pots[p1] def instructions(): print '''Hai tre contenitori A, B, C che possono contenere rispettivamente 80, 50, 30 litri. Non ci sono misure intermedie, quindi non puoi versare con esattezza metà del contenuto. Inizialmente hai il primo contenitore da 80 litri pieno e gli altri due vuoti. Lo scopo del gioco è, tramite una serie di travasi, arrivare ad avere esattamente 40, 40 e 0 litri nei rispettivi contenitori A, B ,C. Per indicare il travaso semplicemente scrivi la lettera del contenitore da cui vuoi versare e la lettere del contenitore in cui vuoi versare. Ad esempio: AB AC e premi invio. Per interrompere il gioco digita 'quit'" ''' print "\t\t\t\tA\tB\tC" print "capienza\t\t\tA: 80\tB: 50\tC: 30" print "" #---SI COMINCIA--- messages ={ "lettere_uguali": "non puoi inserire due lettere uguali", "lettere_numero": "devi inserire due lettere, né più né meno", "lettere_sbagliate": "devi inserire solo A, B o C", "vuoto": "Il contenitore da cui vuoi versare è vuoto! Scegline un'altro", "pieno": "il contenitore in cui vuoi versare è pieno! Scegline un altro", "quit": "Gioco interrotto", "vinto": "\n\nHai vinto!", "tentativi": "Hai fatto %s tentativi\n", "inserisci":"inserisci i contenitori"} pots = {"A": Pot("A",80,80), "B": Pot("B",50), "C": Pot("C",30)} #Dà le informazioni all'utente instructions() print_volumes() #Avvio il CICLO PRINCIPALE tentatives=0 moves=[] while not (pots["A"]._volume == 40 and pots["B"]._volume == 40): p0, p1 = control_input(pots) if p0==None: break p0.pour_into(p1) moves.append(State(p0._name, p1._name, pots["A"]._volume, pots["B"]._volume, pots["C"]._volume)) print_volumes() tentatives += 1 print messages['tentativi'] % tentatives # ad ogni tentativo stampo il contatore if p0 != None: print messages['vinto'] print messages['tentativi'] % tentatives for state in moves: print state else: print messages["quit"]