Accademia:TrovaPepita.py
Ultima versione, aggiornata dagli alunni dell'Accademia :
#!/usr/bin/env python3 """ Gioco dimostrativo creato per l'Accademia debianizzati. Copyright 2011 risca <risca at altervista (cancella questo)dot org> Copyright 2011 TuxErrante <trimurtide at gmail (delete this)dot com> GPLv2 or later """ import sys import random errore = [] benvenuto = """Benvenuto nella miniera TuxErrante & Risca co.! Sarò lieto di condividere con te il nostro oro, a patto che tu riesca a trovarlo! Hai {0} cariche di esplosivo e {1} cave da esplorare. Sei pronto?""" # Definisco come stampare l'ascissa def stampa_ascissa(campo): print(" ", end=' ') for i in range(campo): print('{:2}'.format(i+1), end=' ') print() def stampa_cantiere(campo,pepita=[-10,-10], errore=errore): print("-"*3*(campo+2)) # stampa un divisore largo come il campo stampa_ascissa(campo) # Stampa la griglia di gioco for r in range(campo): print('{:2}'.format(r+1), end=' ') for c in range(campo): if [r , c] in errore: print(" O ",end='') elif r == pepita[0] and c == pepita[1]: print(" X ",end='') else: print(" . ",end='') print('{:2}'.format(r+1), end=' ') print() # manda a capo per ogni nuova riga stampa_ascissa(campo) print("-"*3*(campo+2)) # stampa un divisore largo come il campo def trova_pepita(tent,campo): """ Crea una matrice di dimensione campo*campo dove pone una 'pepita' in modo casuale attraverso la funzione randomint(), che bisognerà cercare di trovare per vincere. Se la distanza tra la 'cava' inserita e quella della pepita è di uno, ci avvertirà della vicinanza. Puo' essere invocato senza argomenti, nel caso in cui i valori di default saranno 6 tentativi e una matrice 6x6, altrimenti accetta due numeri dove il numero dei tentativi deve essere inferiore al numero delle cave. """ # controlla che il gioco non sia troppo facile troppi_tent = int(campo**2 / 3) if tent >= troppi_tent: exit("Così non si può giocare! È troppo facile, abbassa il numero di " "tent almeno a {}".format(troppi_tent)) # assegna casualmente le coordinate della pepita all'interno del campo pepita = [random.randint(0,campo-1), random.randint(0,campo-1)] messaggio = benvenuto.format(tent,campo**2) avviso = '' while tent > 0: print('\n'*30) print(" " * int(campo/2), end=' ') print("La MINIERA di Tux&risca") stampa_cantiere(campo) print(messaggio) print(avviso) print("_"*50) print("Inserisci le coordinate in cui vuoi piazzare la mina" " comprese tra [1 ..{}]".format(campo)) bangx = input(" x = ") bangy = input(" y = ") # verifica che sia stato inserito un numero try: bangx, bangy = int(bangx)-1, int(bangy)-1 except ValueError: avviso = "Inserisci delle coordinate numeriche per favore!" else: # fai ripetere l'input se le coordinate sono già state inserite if ([bangx,bangy] in errore): avviso = ("Errare è umano ma perseverare è diabolico!" + " Con queste hai già provato...") # se le coordinate inserite sono ammissibili procedi elif 0 <= bangx < campo and 0 <= bangy < campo: avviso = '' if (pepita[0] == bangx) and (pepita[1] == bangy): # Hai indovinato! Svela dove è la pepita ! messaggio = "coordinate segrete {},{}".format(pepita[0],pepita[1]) stampa_cantiere(campo,pepita,errore) exit("Complimenti!! L'hai trovata! Siamo ricchiiiii\n" "Ci devi una percentuale, ricordatelo!!") else: # Non hai indovinato, continua a giocare tent -=1 errore.append([bangx, bangy]) # inserisco nella lista errori # Avvisa se sei andato vicino/vicinissimo/lontano alla pepita testX = abs(pepita[0] - bangx) testY = abs(pepita[1] - bangy) if (testX <= 1) and (testY <= 1): messaggio = "Sei davvero VICINISSIMO!!!" elif ((testX == 2) and (testY <= 2)) or ((testY == 2) and (testX <= 2)): messaggio = "Sei abbastanza vicino!" else: messaggio = "No, no, non ci siamo. \n" # Stampa tentativi rimasti if tent > 1: messaggio += ("Dai ritenta ancora! Hai ancora {} tentativi".format(tent)) elif tent == 1: messaggio += ("ATTENTO: hai l'ultimissimo tentativo! ") else: avviso = ("Per favore inserisci delle coordinate corrette!" + "\nRicorda che quelli che hai in mano sono esplosivi!!") print("\n Peccato che tu abbia finito l'esplosivo!!!\nEcco dov'era:") stampa_cantiere(campo,pepita,errore) # chiamata della funzione principale # se viene chiamata senza argomenti gli verranno passati di default 6 e 6 # chiamare lo script con '-h' per vedere la documentazione if len(sys.argv) == 3: trova_pepita(int(sys.argv[1]), int(sys.argv[2])) elif len(sys.argv) == 2 and sys.argv[1] == '-h': print (trova_pepita.__doc__) else: trova_pepita(6,6)
Versione precedente:
#!/usr/bin/env python3 """ Gioco dimostrativo creato per l'Accademia debianizzati. Copyright 2011 risca <risca at altervista (cancella questo)dot org> Copyright 2011 TuxErrante <trimurtide at gmail (delete this)dot com> GPLv2 or later """ import sys import random errore = [] benvenuto = "\n \n \n \n \n \nBenvenuto nella miniera TuxErrante & Risca co.!\n\ Sarò lieto di condividere con te il nostro oro, a patto che \ tu riesca a trovarlo!\n\ Hai {0} cariche di esplosivo e {1} cave da esplorare.\n\ Sei pronto?\nEcco lo schema del cantiere\n" #pepita = [-10, -10] def stampaCantiere(campo,pepita=[-10,-10], errore=[]): # se passo la pepita allora deve controllare cella per cella # quale sia quella giusta dove metterla print("-"*50) print(" ", end=' ') for i in range(campo): if i < 9: print("{} ".format(i+1), end=' ') else: print("{}".format(i+1), end=' ') print() for r in range(campo): if r < 9: print(' {}'.format(r + 1), end=' ') else: print(r + 1, end=' ') for c in range(campo): if [r , c] in errore: print(" O ",end='') elif r == pepita[0] and c == pepita[1]: print(" X ",end='') else: print(" . ",end='') print() # manda a capo per ogni nuova riga def trovaPepita(tent,campo): """\nCrea una matrice di dimensione campo*campo dove pone una 'pepita' in modo casuale attraverso la funzione randomint(), che bisognerà cercare di trovare per vincere. Se la distanza tra la 'cava' inserita e quella della pepita è di uno, ci avvertirà della vicinanza. \n Puo' essere invocato senza argomenti, nel caso in cui i valori di default saranno 6 tentativi e una matrice 6x6, altrimenti accetta due numeri dove il numero dei tentativi deve essere inferiore al numero delle cave.""" if tent >= campo * campo: exit(" Così non si puo' giocare! ") print(benvenuto.format(tent,campo*campo)) # prendi le coordinate della pepita casualmente tra 0 # e la dimensione del campo-1 pepita = [random.randint(0,campo-1), random.randint(0,campo-1)] stampaCantiere(campo) # stampa il campo vuoto while tent > 0: bangx = input("\n Inserisci le coordinate in cui vuoi piazzare la mina \ comprese tra [1 ..{}] \n x = ".format(campo)) bangy = input(" y = ") if not bangx.isnumeric() or not bangy.isnumeric(): print(" Inserisci delle coordinate numeriche per favore! \n") continue else: bangx, bangy = int(bangx), int(bangy) bangx -= 1 bangy -= 1 if bangx < 0 or bangx >= campo or bangy < 0 or bangy >= campo: print(" Per favore inserisci delle coordinate corrette ! \n \ Ricorda che quelli che hai in mano sono esplosivi !! \n") continue else: # coordinate inserite ammissibili if (pepita[0] == bangx) and (pepita[1] == bangy): # svela dove è la pepita ! print("coordinate segrete {},{}".format(pepita[0],pepita[1])) stampaCantiere(campo,pepita,errore) exit(" Complimenti!! L'hai trovata! Siamo ricchiiiii \n \ Ci devi una percentuale, ricordatelo!!") elif ([bangx,bangy] in errore): print(" errare è umano perseverare è diabolico!") continue else: # dice se si è lontani o meno dalla pepita tent -=1 errore.append([bangx, bangy]) # inserisco nella lista errori print("\n") stampaCantiere(campo,[-10,-10],errore) testX = abs(pepita[0] - bangx) testY = abs(pepita[1] - bangy) if (testX == 1 or testX == 0) and (testY == 1 or testY == 0): print(" Ci sei vicino !!") else: print(" No, no, non ci siamo. \n") if tent >= 1: print(" Dai ritenta !!") else: print("\n Peccato che abbia finito l'esplosivo !!\n Ecco dov'era :") stampaCantiere(campo,pepita,errore) # chiamata della funzione principale # se viene chiamata senza argomenti gli verranno passati di default 6 e 6 # chiamare lo script con '-h' per vedere la documentazione if len(sys.argv) == 3: trovaPepita(int(sys.argv[1]), int(sys.argv[2])) elif len(sys.argv) == 2 and sys.argv[1] == '-h': print (trovaPepita.__doc__) else: trovaPepita(6,6)