Scopa?

in python ovviamente



Intro

Eccomi tornato con un nuovo progetto di coding!

Ma che sbadato, mi ero dimenticato il canonico “buonsalve”, lo volevate? Ora è qui :)

Non so se lo avete notato, ma ora il sito è animato! Tutto molto carino, animazioni lente che accompagnano la lettura, sono fiero del risultato :))

Parlando però del tema del pubblicazione (non la morte della regina d’Inghilterra) fremo dalla voglia di raccontarvi di come ho costruito il codice per questa partita a scopa in python.

info generali

Allora, premetto anche che codesta non sarà la versione finale dello script, infatti tramite la programmazione object-oriented riuscirò a scremarlo e renderlo sia più leggibile che leggero.

Ma allora perchè non ho utilizzato subito questo tipo di programmazione?

Sarò onesto: NON SONO CAPACE

O meglio, non credo di esserlo… Conosco le basi ma non sono certo di riuscire a costruire un progetto del genere, quindi mi sono complicato la vita :)

Dai, prima o poi escono sia “crucisberla V2” che “Scopa V2 Obj. Oriented”

Disclaimer

Vi ricordo che potete scaricare il codice sorgente dal mio profilo github

guardiamo il codice

Allora, partiamo? Che qua poi escono articoli da 234min e nessuno me li legge :/


import os
import random
import sys
import time

Qui ho semplicemente importato delle librerie, ma tranquilli, sono più di 500 linee di codice. Ci sarà da divertirsi.

Variabili globali

Qui sotto le variabili globali di cui il programma ha bisogno:


mazzo=[
            "1♥", "1♦", "1♣", "1♠",
            "2♥", "2♦", "2♣", "2♠",
            "3♥", "3♦", "3♣", "3♠",
            "4♥", "4♦", "4♣", "4♠",
            "5♥", "5♦", "5♣", "5♠",
            "6♥", "6♦", "6♣", "6♠",
            "7♥", "7♦", "7♣", "7♠",
            "J♥", "J♦", "J♣", "J♠",
            "Q♥", "Q♦", "Q♣", "Q♠",
            "K♥", "K♦", "K♣", "K♠"
            ]

mazzo_reset=[
            "1♥", "1♦", "1♣", "1♠",
            "2♥", "2♦", "2♣", "2♠",
            "3♥", "3♦", "3♣", "3♠",
            "4♥", "4♦", "4♣", "4♠",
            "5♥", "5♦", "5♣", "5♠",
            "6♥", "6♦", "6♣", "6♠",
            "7♥", "7♦", "7♣", "7♠",
            "J♥", "J♦", "J♣", "J♠",
            "Q♥", "Q♦", "Q♣", "Q♠",
            "K♥", "K♦", "K♣", "K♠"
            ]

carte_valori={
                "1"     :   1,
                "2"     :   2,
                "3"     :   3,
                "4"     :   4,
                "5"     :   5,
                "6"     :   6,
                "7"     :   7,
                "J"      :   8,
                "Q"    :    9,
                "K"     :    10
}

tavolo, manoplayerone,  manoplayertwo , mazzettoplayerone, mazzettoplayertwo   = []  ,  []  ,  []  ,  []  ,  []

player=1

scopeplayerone,scopeplayertwo=0,0

lastpickup=0

ultimamano=false

nomegiocatore1,nomegiocatore2="",""

finepartita=0

Le variabili sono abbastanza autoesplicative, sono chiamate con i nomi più leggibili possibile ahaha.

Dai, iniziamo a parlare delle funzioni, così entriamo ne vivo el programma

loading()

Come sempre, mi piace dare un tocco di “veridicità” ai miei script, quindi perchè non aggiungere un loading screen di presentazione?


def loading():
    for i in range(6):
        os.system('cls' if os.name == 'nt' else 'clear')
        print("\n")
        print("caricamento")
        print("° "*(i+1))
        time.sleep(0.5)

    time.sleep(1)
    
    os.system('cls' if os.name == 'nt' else 'clear')
    
    print("\n\n")
    print("  ______   ______   ______  _______   ______  \n /      \ /      \ /      \|       \ /      \ \n|  ▓▓▓▓▓▓\  ▓▓▓▓▓▓\  ▓▓▓▓▓▓\ ▓▓▓▓▓▓▓\  ▓▓▓▓▓▓\ \n| ▓▓___\▓▓ ▓▓   \▓▓ ▓▓  | ▓▓ ▓▓__/ ▓▓ ▓▓__| ▓▓\n \▓▓    \| ▓▓     | ▓▓  | ▓▓ ▓▓    ▓▓ ▓▓    ▓▓\n _\▓▓▓▓▓▓\ ▓▓   __| ▓▓  | ▓▓ ▓▓▓▓▓▓▓| ▓▓▓▓▓▓▓▓\n|  \__| ▓▓ ▓▓__/  \ ▓▓__/ ▓▓ ▓▓     | ▓▓  | ▓▓\n \▓▓    ▓▓\▓▓    ▓▓\▓▓    ▓▓ ▓▓     | ▓▓  | ▓▓\n  \▓▓▓▓▓▓  \▓▓▓▓▓▓  \▓▓▓▓▓▓ \▓▓      \▓▓   \▓▓")
    print("-------------------")
    print("╔═══╗    ╔═══╗╔═══╗\n║╔═╗║    ║╔═╗║║╔═╗║\n║║ ╚╝╔╗╔╗║╚══╗║║ ║║\n║║ ╔╗║║║║╚══╗║║║ ║║\n║╚═╝║║╚╝║║╚═╝║║╚═╝║\n╚═══╝╚══╝╚═══╝╚═══╝")
    print("-------------------")
    time.sleep(2.4)

    os.system('cls' if os.name == 'nt' else 'clear')

reset()

Poichè il gioco di carte “scopa” è basato su un molteplice numero di partite, mi serviva una funzione per sistemare tutto in vitsta della partita successiva. Letteralmente ripulisce i mazzetti dei giocatori, riforma il mazzo e da in output un messaggio di conferma


def reset():
    os.system('cls' if os.name == 'nt' else 'clear')
    mazzo=mazzo_reset
    tavolo, manoplayerone,  manoplayertwo , mazzettoplayerone, mazzettoplayertwo   = []  ,  []  ,  []  ,  []  ,  []
    scopeplayerone,scopeplayertwo=0,0
    lastpickup=0
    ultimamano=false
    print(f"eseguo il reset: \nmazzo={mazzo};\ntavolo={tavolo}; \nmanoplayerone={manoplayerone};\nmanoplayertwo={manoplayertwo}\nmazzettoplayerone={mazzettoplayerone};\nmazzettoplayertwo={mazzettoplayertwo};\nscopeplayerone={scopeplayerone};\nscopeplayertwo={scopeplayertwo};\nlastpickup={lastpickup};\nultimamano={ultimamano}")
    time.sleep(1.5)
    os.system('cls' if os.name == 'nt' else 'clear')

askBeforeStart()

Altra piccola chicca che mi piace sempre aggiungere: un tocco di ux semplice ma efficace, serve solo a rendere “personali” le partite; potevo semplicemente chiamare g1 e g2 i due concorrenti, ma chiedergli i rispettivi nomi semrava più cortese.


def askbeforestart(nomegiocatore1,nomegiocatore2,finepartita):
    while nomegiocatore1=="":
        nomegiocatore1=input("giocatore1, come ti chiami?\n")
    while nomegiocatore2=="":
        nomegiocatore2=input("giocatore2, come ti chiami?\n")
    while finepartita==0:
        finepartita=int(input("a quanti punti volete che la partita finisca? (solitamente si gioca a 11 o 21 punti)\n"))
    print(f"ottimo, benvenuti {nomegiocatore1} e {nomegiocatore2}, che vinca il migliore")

tableView()

Questa funzione serve a visualizzare ogni turno il tavolo con al suo interno le carte in gioco.


def tableview():
    os.system('cls' if os.name == 'nt' else 'clear')
    print(f"carte nel mazzo: {len(mazzo)}")
    print("******"*len(tavolo),end="\n")
    print()
    print(" ---- "*len(tavolo))
    for ele in tavolo:
        print("|",end=" ")
        print(ele,end=" |")
    print()
    print(" ---- "*len(tavolo))
    print()
    print("******"*len(tavolo))
    print()
    print("la tua mano:")

shuffle()

Letteralmente mischia il mazzo, non saprei che altro aggiungere.


def shuffle():
    random.shuffle(mazzo)

start() e distro()

start() serve ad avviare il gioco, richiama shuffle() e distro(), la quale serve per “distribuire” le carte ai giocatori, infine, dispone 4 carte sul tavolo.


def start():
    shuffle()
    distro()
    for _ in range(4):
        tavolo.append(mazzo[0])
        del mazzo[0]
    drop(player)

def distro():
    for i in range (3):
        manoPlayerOne.append(mazzo[0])
        del mazzo[0]
        manoPlayerTwo.append(mazzo[0])
        del mazzo[0]

checkPickUp()

Quetsa funzione è essenziale per lo sviluppo del gioco, infatti serve per controllare in serie le possibilità di cattura: inizia con “carta a carta”, per poi passare alle somme, prima a d, poi a tre ed infine a 4 carte.

Un tratto interessante è che ho dovuto utilizzare un dizionario per inserire il valore e rendere leggibili le carte, quel dizionario “carte_valori” serve appunto per definire il valore alle figure, che sono state chiamate rispettivamente “J”, “Q” e “K”; tutto per rendere più fruibile la lettura delle carte durante la partita


def checkPickUp(player,carta):
    if len(tavolo)>=1:
        for j in range(len(tavolo)):
            cartaDaControllare=tavolo[j]
            val_cartaDaControllare=carte_valori[cartaDaControllare[0]]
            val_cartaGiocatore=carte_valori[carta[0]]
            if val_cartaGiocatore==val_cartaDaControllare:
                if player==1:
                    print(f"il giocatore {player} ha preso {cartaDaControllare} con {carta}")
                    mazzettoPlayerOne.append(carta)
                    mazzettoPlayerOne.append(cartaDaControllare)
                    tavolo.remove(cartaDaControllare)
                    lastPickup=1
                    turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)
                else:
                    print(f"il giocatore {player} ha preso {cartaDaControllare} con {carta}")
                    mazzettoPlayerTwo.append(carta)
                    mazzettoPlayerTwo.append(cartaDaControllare)
                    tavolo.remove(cartaDaControllare)
                    lastPickup=2
                    turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)

#------------------------

    if len(tavolo)>=2:
        for j in range(len(tavolo)-1):
            cartaDaControllare=tavolo[j]
            val_cartaDaControllare=carte_valori[cartaDaControllare[0]]
            val_cartaGiocatore=carte_valori[carta[0]]
            for t in range(j+1, len(tavolo)):
                cartaDaControllare2=tavolo[t]
                val_cartaDaControllare2=carte_valori[cartaDaControllare2[0]]
            if val_cartaGiocatore==(val_cartaDaControllare+val_cartaDaControllare2):
                    if player==1:
                        print(f"il giocatore {player} ha preso {cartaDaControllare} e {cartaDaControllare2} con {carta}")
                        mazzettoPlayerOne.append(carta)
                        mazzettoPlayerOne.append(cartaDaControllare)
                        mazzettoPlayerOne.append(cartaDaControllare2)
                        tavolo.remove(cartaDaControllare)
                        tavolo.remove(cartaDaControllare2)
                        lastPickup=1
                        turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)
                    else:
                        print(f"il giocatore {player} ha preso {cartaDaControllare} e {cartaDaControllare2} con {carta}")
                        mazzettoPlayerTwo.append(carta)
                        mazzettoPlayerTwo.append(cartaDaControllare)
                        mazzettoPlayerTwo.append(cartaDaControllare2)
                        tavolo.remove(cartaDaControllare)
                        tavolo.remove(cartaDaControllare2)
                        lastPickup=2
                        turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)

#-----------------------

    if len(tavolo)>=3:
        for j in range(len(tavolo)-2):
            cartaDaControllare=tavolo[j]
            val_cartaDaControllare=carte_valori[cartaDaControllare[0]]
            val_cartaGiocatore=carte_valori[carta[0]]
            for t in range(j+1, len(tavolo)-1):
                cartaDaControllare2=tavolo[t]
                val_cartaDaControllare2=carte_valori[cartaDaControllare2[0]]
                for i in range (t+1, len(tavolo)):
                    cartaDaControllare3=tavolo[i]
                    val_cartaDaControllare3=carte_valori[cartaDaControllare3[0]]
                if val_cartaGiocatore==(val_cartaDaControllare+val_cartaDaControllare2+val_cartaDaControllare3):
                        if player==1:
                            print(f"il giocatore {player} ha preso {cartaDaControllare} e {cartaDaControllare2} e {cartaDaControllare3} con {carta}")
                            mazzettoPlayerOne.append(carta)
                            mazzettoPlayerOne.append(cartaDaControllare)
                            mazzettoPlayerOne.append(cartaDaControllare2)
                            mazzettoPlayerOne.append(cartaDaControllare3)
                            tavolo.remove(cartaDaControllare)
                            tavolo.remove(cartaDaControllare2)
                            tavolo.remove(cartaDaControllare3)
                            lastPickup=1
                            turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)
                        else:
                            print(f"il giocatore {player} ha preso {cartaDaControllare} e {cartaDaControllare2} e {cartaDaControllare3} con {carta}")
                            mazzettoPlayerTwo.append(carta)
                            mazzettoPlayerTwo.append(cartaDaControllare)
                            mazzettoPlayerTwo.append(cartaDaControllare2)
                            mazzettoPlayerTwo.append(cartaDaControllare3)
                            tavolo.remove(cartaDaControllare)
                            tavolo.remove(cartaDaControllare2)
                            tavolo.remove(cartaDaControllare3)
                            lastPickup=2
                            turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)

#-----------------------

    if len(tavolo)>=4:
        for j in range(len(tavolo)-3):
            cartaDaControllare=tavolo[j]
            val_cartaDaControllare=carte_valori[cartaDaControllare[0]]
            val_cartaGiocatore=carte_valori[carta[0]]
            for t in range(j+1, len(tavolo)-2):
                cartaDaControllare2=tavolo[t]
                val_cartaDaControllare2=carte_valori[cartaDaControllare2[0]]
                for i in range (t+1, len(tavolo)-1):
                    cartaDaControllare3=tavolo[i]
                    val_cartaDaControllare3=carte_valori[cartaDaControllare3[0]]
                    for w in range(i+1, len(tavolo)):
                        cartaDaControllare4=tavolo[w]
                        val_cartaDaControllare4=carte_valori[cartaDaControllare4[0]]
                        if val_cartaGiocatore==(val_cartaDaControllare+val_cartaDaControllare2+val_cartaDaControllare3+val_cartaDaControllare4):
                                if player==1:
                                    print(f"il giocatore {player} ha preso {cartaDaControllare} e {cartaDaControllare2} e {cartaDaControllare3} e {cartaDaControllare4} con {carta}")
                                    mazzettoPlayerOne.append(carta)
                                    mazzettoPlayerOne.append(cartaDaControllare)
                                    mazzettoPlayerOne.append(cartaDaControllare2)
                                    mazzettoPlayerOne.append(cartaDaControllare3)
                                    mazzettoPlayerOne.append(cartaDaControllare4)
                                    tavolo.remove(cartaDaControllare)
                                    tavolo.remove(cartaDaControllare2)
                                    tavolo.remove(cartaDaControllare3)
                                    tavolo.remove(cartaDaControllare4)
                                    lastPickup=1
                                    turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)
                                else:
                                    print(f"il giocatore {player} ha preso {cartaDaControllare} e {cartaDaControllare2} e {cartaDaControllare3} e {cartaDaControllare4} con {carta}")
                                    mazzettoPlayerTwo.append(carta)
                                    mazzettoPlayerTwo.append(cartaDaControllare)
                                    mazzettoPlayerTwo.append(cartaDaControllare2)
                                    mazzettoPlayerTwo.append(cartaDaControllare3)
                                    mazzettoPlayerTwo.append(cartaDaControllare4)
                                    tavolo.remove(cartaDaControllare)
                                    tavolo.remove(cartaDaControllare2)
                                    tavolo.remove(cartaDaControllare3)
                                    tavolo.remove(cartaDaControllare4)
                                    lastPickup=2
                                    turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)
    tavolo.append(carta)
    turnSwap(player,carta,ultimamano,scopePlayerOne,scopePlayerTwo)

lastChance()

Avete presente quando voi arrivate all’ultima mano e dovete “prendere tutte le carte rimaste”? Bene, questa funzione serve solo per quello, controlla chi sia stato l’ultimo a prendere e trasferisce le carte restanti nel suo mazzo.


def lastChance(tavolo):
    if lastPickup==1:
        for ele in tavolo:
            mazzettoPlayerOne.append(ele)
        print(f"essendo l'ultima mano, il giocatore 1 prende {tavolo}")
        tavolo=[]
    else:
        for ele in tavolo:
            mazzettoPlayerTwo.append(ele)
        print(f"essendo l'ultima mano, il giocatore 2 prende {tavolo}")
        tavolo=[]
    scoreCheck()

turnSwap()

Fosse così semplice “passare il turno” all’altro giocatore non avrei creato questa funzione… In realtà non è nulla di speciale, semplicemente mette un indicatore per definire a chi tocca, e permette al resto del programma di decidere quali mani visualizzare e a chi assegnare le carte prese durante quel turno.

Piccolo dettaglio che forse non avrete notato: questa funzione richiama anche “scoreCheck()”, la funzione per il conteggio finale dei punti… Ma di lei parleremo più tardi.


def turnSwap(player, carta, ultimamano,scopePlayerOne,scopePlayerTwo):
    if len(mazzo)==0 and len(manoPlayerOne)==0:
        ultimamano=True
    if len(tavolo)==0 and ultimamano==False:
        print(f"il giocatore {player} ha fatto scopa con {carta}")
        if player==1:
            scopePlayerOne+=1
        else:
            scopePlayerTwo+=1
    if player==1:
        player=2
    else:
        player=1
    if len(manoPlayerTwo)==0 and len(mazzo)>=6:
        distro()
    if len(manoPlayerTwo)==0 and ultimamano==True:
        lastChance(tavolo)
    #time.sleep(1.3)
    drop(player)

drop()

Aspettate! Ho mostrato tutte le funzioni “conseguenziali” al turno dei giocatori, ma come fare per “giocare”? Bene, ecco a voi la funzione “drop()”.

Essa avrà lo scopo di far scegliere al giocatore che carte “droppare” sul tavolo, poi richiamerà “checkPickUp()” per controllare se vi siano delle catture.


def drop(player):
    tableView()
    inp=0
    if player==1:
        print(manoPlayerOne,end="\n\n")
    else:
        print(manoPlayerTwo,end="\n\n")
    while not 1<=inp<=len(manoPlayerTwo) and inp!=" ":
        inp=int(input(f"Giocatore {player} che carta vuoi giocare?"))
    if player==1:
        carta=manoPlayerOne[inp-1]
        del manoPlayerOne[inp-1]
        checkPickUp(player,carta)
    else:
        carta=manoPlayerTwo[inp-1]
        del manoPlayerTwo[inp-1]
        checkPickUp(player,carta)

carte(), ori(), settebello() e primiera()

Queste sono le 4 principali fuzioni di conteggio punti, verranno richiamate dalla funzione “scoreCheck()” che ho annunciato poc’anzi.

Credo che la loro funzione sia abbastanza autoesplicativa, letteralmente controllano chi abbia ottenuto il punto secondo determinati conteggi: chi ha più carte, chi ha più “ori”, chi ha il “settebello” e chi ha la “primiera”


def carte():
    if len(mazzettoPlayerOne) >20:
        return(1)
    elif len(mazzettoPlayerOne)==20:
        return("patta")
    else:
        return(2)

def ori():
    ori=0
    for ele in mazzettoPlayerOne:
        if ele[1]=="♦":
            ori+=1
    if ori>5:
        return(1)
    elif ori==5:
        return("patta")
    else:
        return(2)

 def settebello():
    if "7♦" in mazzettoPlayerOne:
        return(1)
    else:
        return(2)

def primiera():
    q, p, c, f=False , False, False, False
    puntiPrimiera1=0
    puntiPrimiera2=0
    for ele in mazzettoPlayerOne:
        if ele[0]=="7":
            if ele[1]=="♦" and q==False:
                q=True
                puntiPrimiera1+=21
            if ele[1]=="♠" and p==False:
                p=True
                puntiPrimiera1+=21
            if ele[1]=="♥" and c==False:
                c=True
                puntiPrimiera1+=21
            if ele[1]=="♣" and f==False:
                c=True
                puntiPrimiera1+=21
    if puntiPrimiera1 < 70:
        for ele in mazzettoPlayerOne:
            if ele[0]=="6":
                if ele[1]=="♦" and q==False:
                    q=True
                    puntiPrimiera1+=18
                if ele[1]=="♠" and p==False:
                    p=True
                    puntiPrimiera1+=18
                if ele[1]=="♥" and c==False:
                    c=True
                    puntiPrimiera1+=18
                if ele[1]=="♣" and f==False:
                    c=True
                    puntiPrimiera1+=18
    if puntiPrimiera1 < 70:
        for ele in mazzettoPlayerOne:
            if ele[0]=="1":
                if ele[1]=="♦" and q==False:
                    q=True
                    puntiPrimiera1+=16
                if ele[1]=="♠" and p==False:
                    p=True
                    puntiPrimiera1+=16
                if ele[1]=="♥" and c==False:
                    c=True
                    puntiPrimiera1+=16
                if ele[1]=="♣" and f==False:
                    c=True
                    puntiPrimiera1+=16

    q, p, c, f=False , False, False, False 
    for ele in mazzettoPlayerTwo:
        if ele[0]=="7":
            if ele[1]=="♦" and q==False:
                q=True
                puntiPrimiera2+=21
            if ele[1]=="♠" and p==False:
                p=True
                puntiPrimiera2+=21
            if ele[1]=="♥" and c==False:
                c=True
                puntiPrimiera2+=21
            if ele[1]=="♣" and f==False:
                c=True
                puntiPrimiera2+=21
    if puntiPrimiera2 < 70:
        for ele in mazzettoPlayerTwo:
            if ele[0]=="6":
                if ele[1]=="♦" and q==False:
                    q=True
                    puntiPrimiera2+=18
                if ele[1]=="♠" and p==False:
                    p=True
                    puntiPrimiera2+=18
                if ele[1]=="♥" and c==False:
                    c=True
                    puntiPrimiera2+=18
                if ele[1]=="♣" and f==False:
                    c=True
                    puntiPrimiera2+=18
    if puntiPrimiera2 < 70:
        for ele in mazzettoPlayerOne:
            if ele[0]=="1":
                if ele[1]=="♦" and q==False:
                    q=True
                    puntiPrimiera2+=16
                if ele[1]=="♠" and p==False:
                    p=True
                    puntiPrimiera2+=16
                if ele[1]=="♥" and c==False:
                    c=True
                    puntiPrimiera2+=16
                if ele[1]=="♣" and f==False:
                    c=True
                    puntiPrimiera2+=16
    
    if puntiPrimiera1>puntiPrimiera2:
        return(1)
    elif puntiPrimiera1 < puntiPrimiera2:
        return(2)
    else:
        return("patta")

scoreCheck()

Ora che abbiamo visto come conta i punti il mio script, addentriamoci nella funzione dedita al salvataggio degli stessi: “scoreCheck()”

Questa serve per salvare i dati in un file di cache e mostrarli ai giocatori che potranno decidere di giocare un’altra partita trsamite la funzione “replay()” ed accumulare i suddetti punti, oppure eliminarli tramite la funzione “destroy()” e ricominciare da zero una nuova avventura.

Come prevedibile, “destroy()”” “ripulirà” il file dei punti, in questo caso basta aprirlo in “sovracrittura” e richiuderlo lasciandolo vuoto.

D’altro canto, “replay() “resetta il mazzo ed il gioco tramite a funzione “reset()”, già spiegata prima, infine avvia il gioco con “start()”


def scoreCheck():
os.system('cls' if os.name == 'nt' else 'clear')
f=open("cache.txt", "r")
l=f.readlines()
if len(l)==4:
    puntiTotPlayerOne=int(l[1])
    puntiTotPlayerTwo=int(l[3])
else:
    puntiTotPlayerOne=0
    puntiTotPlayerTwo=0

puntoCarte=carte()
puntoOri=ori()
puntoSettebello=settebello()
puntoPrimiera=primiera()

punteggi=[puntoCarte, puntoOri, puntoSettebello, puntoSettebello]

for ele in punteggi:
    if ele==1:
        puntiTotPlayerOne+=1
    elif ele==2:
        puntiTotPlayerTwo+=1

puntiTotPlayerOne+=scopePlayerOne
puntiTotPlayerTwo+=scopePlayerTwo

print(f"Ecco i risultati della partita:")
print(f"Carte\t{puntoCarte}")
print(f"Ori\t{puntoOri}")
print(f"Settebello\t{puntoSettebello}")
print(f"Primiera\t{puntoPrimiera}")
print(f"Scope giocatore1\t{scopePlayerOne}")
print(f"Scope giocatore2\t{scopePlayerTwo}")
f.close()
f=open("cache.txt","w")
f.write("Punti giocatore1:\n")
f.write(str(puntiTotPlayerOne)+"\n")

f.write("Punti giocatore2:\n")
f.write(str(puntiTotPlayerTwo)+"\n")

f.close()
f=open("cache.txt", "r")
l=f.readlines()
puntiPartitaP1=l[1]
puntiPartitaP2=l[3]
if puntiPartitaP1 or puntiPartitaP2>=finePartita:
    os.system('cls' if os.name == 'nt' else 'clear')
    if puntiPartitaP1>puntiPartitaP2:
        print(f"Complimenti {nomeGiocatore1}, hai vinto contro {nomeGiocatore2} con un totale di {puntiPartitaP1} a {puntiPartitaP2}!")
        sys.exit()
else:
    print(f"Il vostro punteggio è di {puntiPartitaP1} a {puntiPartitaP2} per {nomeGiocatore1}")
    risp=""
    while risp !="sì" or risp!="no" or risp!="si":
        risp=input("Volete continuare a giocare?\n")
        risp=risp.lower()
    if risp=="sì" or risp=="si":
        print("Ottimo!")
        replay()
    elif risp=="no":
        print("Va bene, allora dite addio ai vostri progressi :) ")
        destroy()

def destroy():
    f=open("cache.txt", "w")
    f.close()

def replay():
    reset()
    start()

main()

Eccoci alla fine del programma, ormai la funzione madre può essere chiara per tutti.

Nel nostro caso “main()” richiama: “loading()”, “askBeforeStart()” ed infine “start()”. Nulla di più semplice.


def main():
    loading()
    askBeforeStart(nomeGiocatore1,nomeGiocatore2,finePartita)
    start()

Il prigramma finito

Ormai lo sapete, mi piace inserire il canonico if __name__ == "__main__": ed ecco qui il risultato:


if __name__ == "__main__":
    main()

Conclusioni

Eccoci alla fine di questo interminabile articolo, che ne pensate? Vi ricordo che se volete potete scaricare il codice sorgente da profilo github, lì sarà sempre aggirnato e vi caricherò anche la V2 Obj. Oriented che citai ad inizio articolo.