Accademia:TrovaPepita.py

Versione del 1 mar 2011 alle 15:11 di Tuxerrante (discussione | contributi) (ultima versione script)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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)



Tuxerrante
Risca86