venerdì 2 ottobre 2015

Mescolare bene le carte!!!





A volte i giocatori di Scala 40, Ramino e Machiavelli contattano il supporto tecnico per fare qualche osservazione sul gioco ed in particolare su come gestisco la casualità e la forza dei giocatori.



Rispondo sempre a tutti (si io sono il supporto tecnico, l'assistenza clienti, lo sviluppatore, quello che scrive il blog, segue la pagina facebook, si occupare del marketing, un "one man band") sempre gentilmente, anche capita di ricevere qualche mail molto risentita a volte insolenti (ma molto molto di rado), alcune con toni vagamente minacciosi...




 Ecco qualche estratto dalle mail ricevute (solo da quelle educate):

ribadisco algoritmo di gestione carte completamente inadeguato.
Le carte devono essere solo "casualità" e non "gestione dei vincitori"
Mi dispiace, spero possiate apportare gli opportuni accorgimenti, diversamente non acquisterò la versione pro.
È la terza volta che capita 6/7 partite.. alcune delle quali erano praticamente vinte,poi la cpu ha iniziato a non darmi più una carta,ma averle fortunatamente buone tutte per se,pescando ogni jolly possibile.. mi sembra un pó troppo per definirle sfortunate combinazioni.. la sfortuna dura da parecchi giorni direi (lavoro in un campo che di notte mi lascia anche troppo tempo), visto che da non si vince una partita da mercoledì scorso con sconfitte a dir poco imbarazzanti e irritanti (tutte le carte scartate sono buone per la cpu,ogni jolly e suo,chiusure al secondo giro senza neanche finire di scartare le 3 o 4 doppie..)..
 le carte non sono mai equilibrate! 
Ingiocabile!!!
Il sistema gestisce le carte per accontentare tutti. Spesso si ha l'apertura in mano e con due pescate si chiude.....spesso gli avversari hanno l'apertura e successiva chiusura in due mani.
Non si tiene conto dell'unica regole delle carte: l'assoluta casualità 


Salve, mi chiamo ..... ....... e ho la versione a pagamento di scala 40. Premetto che sono stato un giocatore di carte per anni e cobosco molto bene i giochi e le statistiche. Uso frequentemente la Vs app e ultimamente mi sono accorto giocando contro il computer in partite a 2, ma non escludo che possa succedere anche a 4, che il computer apre continuamente di prima o al massimo in seconda mano, sempre con 2 o 3 giochi, questo non mi ricordo che sia possibile nella realtà. Chiaramente non escludo un mio errore di valutazione, ma non è piacevole pensare di non vincere mai, passa la voglia di giocare.

Insomma, queste persone non sono contente di me, ho realizzato giochi che non simulano correttamente la realtà, che non li soddifsano, che fanno vincere l'altro troppo spesso, che la casualità è una cosa differente, ecc.ecc. è doppiamente frustrante, sia per i giocatori che persono, sia per me, ricevere lamentele da un utente non è mai gradevole. Le lamentele per fortuna sono poche, ma sarebbe bello capire se c'è realmente un problema e, nel caso, se posso rimediare.

La mia risposta varia di volta in volta (non copio ed incollo le risposte), ma il senso generale è il seguente: queste persone sono proprio vittime del caso, succede di perdere molte partite di fila, come può succedere di vincerne tante sempre di fila, come può succedere di vincerne e perderne in modo equilibrato. La casualità non prevede che esista una certo bilanciamento, un equilibrio negli eventi, si potrebbero fare considerazioni sulla probabilità o non probabilità che un fatto si verifichi e molte molte parole, ma di solito chi è scontento non ascolta  ed insiste dicendo che c'è qualcosa che non va che al bar è differente.

Mi vengono in mente alcune scene al bar, nei paesini, dove giocatori incalliti si sfidano a carte e qualcuno impreca perchè ha una giornata no. Mi vengono in mente partite in cui ho vinto molto facilmente  con gli amici perché le carte erano sempre buone e non perché fossi un buon giocatore (non sono mai stato bravo a carte, non ho memoria, il gioco dopo un po mi annoia, preferisco stare all'aria aperta e andare a spasso)

Come fare a  spiegare che non c'é trucco nei miei giochi?  Ho qualche reminiscenza sul calcolo combinatorio inculcatami da un professore di matematica ormai defunto che amava fumare le "nazionali senza filtro" in classe terrorizzandoci con il suo atteggiamento autoritario, ma non sono sufficienti per spiegare come mai a volte si è sofrtunati al gioco, non lo saprei fare chiaramente.
(Se qualcuno leggesse quasto mio post e ha elementi per aiutarmi accetto di certo suggerimenti!)

Io distinguerei due cose, "come il gioco mischia le carte" e "come giocano gli avversari automatici"
 
"come il gioco mischia le carte"

il gioco le mischia,  eccome se le mischia! usa proprio un sistema basato sulla casualità, non c'è nulla che mi consenta di controllare e decidere quali carte andranno in mano ai singoli avversari, siano essi automi, umani, online oppure offline (online sono solo umani, non ci sono automi o robot online)

posso mostrarvi come faccio, di seguito sia il codice che  un paio di link che ho usato per capire come mischiare correttamente un mazzo di carte.  Se avete osservazioni e suggerimenti autorevoli sarò felice di valutarli.

ecco quindi un estratto dal codice sorgente dei miei giochi
quello che segue è un metodo (una funzione), scritta in ObjectiveC, potete mostrarla a qualunque informatico di vostra conoscenza per chiedergli se sbaglio qualcosa, se c'e' un qualche errore di fondo che mi sfugge


//
// ----------------------------------------------------------------------------
// Algoritmo di mescolmento delle carte presenti nel mazzo
// ----------------------------------------------------------------------------
// fonti che ho utilizzato per scegliere quale alrogimo adottare:
//
//  http://nshipster.com/random///  http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
// ---------------------------------------------------------------------------- 
//
+ (void) mischiaCarte:(NSMutableArray*)arrayDiCarte
{
    NSUInteger count = arrayDiCarte.count;

    if (count > 1) {
        for (NSUInteger i = count - 1; i > 0; --i) {
            [arrayDiCarte exchangeObjectAtIndex:i 

                                           withObjectAtIndex:arc4random_uniform((int32_t)(i + 1))];
        }
    }
}


[Aggiornamento del 15 settembre 2018]
ho aggiornato di recente un paio di giochi (Pinnacola e Machiavelli)
questi sono scritti in linguaggio Swift ed usano un sistema differente per mescolare le carte
a tendere tutti i giochi useranno un algoritmo scritto in Swift 4.2 che si occupa di mescolare una collezione elementi (nel nostro caso le carte)

perché uso un algoritmo differente? in realtà il funzionamento interno è sempre lo stesso, ma dovendo aggiornare tutto al linguaggio Swift mi adeguo a quanto fornito da Apple (tutti gli algoritmo sono egualmente validi e garantiscono la giusta casualità nel mescolamento delle carte)

Ecco l'implementazione per Machiavelli (dal 2018)
// versione Swift 4.1 usa la funzione di GameKit specifica per mescolare una collezione di oggetti
func shuffle()
{
   let shuffledCards =      
        GKRandomSource.sharedRandom().arrayByShufflingObjects(
             in: cards) as! [CCard]
        cards.removeAll()
        cards.append(contentsOf: shuffledCards)
}

Ed ecco l'implementazione per Pinnacola (dal giugno 2018), questa sarà usata anche in tutte le versioni future di Scala 40 e Ramino
 (ed in futuro questo varrà per tutti i giochi)

// versione Swift 4.2 usa la funzione nativa per mescolare una collezione di oggetti
func shuffle()
{
   cards.shuffle() // Swift 4.2
}

[Aggiornamento del 26 Febbraio 2019]

Dal Febbraio 2019 tutti i giochi che ho realizzato sono stati riscritti in linguaggio Swift
ed ora viene usata la  versione 4.2 ( a seguire la 5 più avanti nell'anno )
orma il solo algoritmo usato per mescolare le carte in tutti i giochi e' il seguente

// versione Swift 4.2 usa la funzione nativa per mescolare una collezione di oggetti
func shuffle()
{
   cards.shuffle() // Swift 4.2
}

l'utilizzo della funzione di shuffle degli array in Swift 4.2 è descritta qui sul sito di Apple
https://developer.apple.com/documentation/swift/array/2994753-shuffle

mentre l'implementazione della funzione di shuffle e del generatore di numeri casuali adottato da Apple si trova qui:
https://github.com/apple/example-package-fisheryates/blob/master/Sources/FisherYates/Fisher-Yates_Shuffle.swift

https://github.com/apple/example-package-fisheryates/blob/master/Sources/FisherYates/random.swift

se avete osservazioni vi prego di inviarmele o segnalare direttamente ad Apple


"come giocano gli avversari automatici"


qui non considero il gioco online, nel gioco online non ci sono automi, quindi se prendete delle batoste online, oltre alla sfortuna che vi potrebbe sempre perseguitare dovrete considerare anche se siete più o meno forti dell'avversario

il gioco online sicuramente è più divertente perchè gli avversari sono reali, siete di fronte al bar più grosso che si possa immaginare

nel gioco offline sfidate degli automi, dei giocatori che ho creato simulando un po il mio stile personale di gioco, con tutti i limiti che può avere la mia capacità di giocare oltre a quella di programmare un computer per farlo

in linea di massima gli automi dei miei giochi analizzano tutte le possibili giocate effettuabili, lo fanno in modo un po brutale, anche stupido, ma in poco tempo, sfruttando la velocità del computer riescono ad arrivare ad un buon numero di possibili giocate alternative che potrebbero fare durante il loro turno, una volta che queste giocate ipotetiche sono disponibili ne scelgono selezionandola tra tutte in base ad una strategia (ad esempio una strategia che punta a chiudere al più presto, a rimanere con poche carte in mano con valori bassi, aprire e chiudere in mano, e altre simili)

ho realizzato tre automi, Forte, Medio e Debole
il giocatore Forte, a differenza degli altri due, è in grado di ricordare tutte le carte scartate nel pozzo degli scarti (come farebbe ogni buon giocatore)

il Medio ed il Debole sono più smemorati, non conoscono le carte del pozzo, e non analizzano tutte le giocate possibili ed immaginabili, ma solo un sottoinsieme scelto in modo casuale tra tutte quelle possibili (di nuovo la casualità anche qui)

in base alle impostazioni di gioco potete scegliere se sfidare giocatori Forti, Medi o Deboli
o, di nuovo affidandovi al caso, potete scegliere che sia il gioco ad assegnarvi avversari di forza differente scelta casualmente, in questa modalità potreste ritrovarvi in una partita a 4 sfidando un giocatore forte e due medi, o tre deboli, o due forti ed un debole,  e così via....

ci sono molto configurazioni possibili nel gioco offline, potete cambiare un po le regole del gioco, alternado su queste impostazioni potete fare si che gli avversari si comportino in modo differente rispetto al comportamento standard (ma attenzione le regole cambieranno anche per voi)


Conclusioni
  • il caso c'è eccome, e quindi la fortuna e la sfortuna
  • sicuramente gli automi che ho realizzato sono un po monotoni e sarei più bravo se riuscissi a crearne di più vari e realistici inventando strategie di gioco eterogenee, ho il sospetto che siano proprio gli automi ad annoiare i giocatori e a dar loro la percezione di avere giorante nere, non tanto il come vengono mischiate le carte
  • potrei fare una cosa, ma non sono convinto sia onesta...
    • potrei cercare di tenermi stretti i clienti insoddisfatti e barare
    • barare come? in che senso?
    •  non per far vincere il gioco, al contrario per farlo perdere, per far vincere i giocatori insoddisfatti
    • potrei tracciare le partite vinte e perse e di fronte a continue sconfitte da parte del giocatore umano potrei decidere di fare giocare male gli automi, molto male, al punto che non possano  vincere
    • non saprei dire se questo si chiama barare o solo cercare di adattare la capacità del gioco a quella dell'avversario umano, per rendere tutto più bilanciato
    • non so, non sono convinto, ma se avete opinioni in merito mi piacerebbe parlarne con qualcuno di voi
credo sia il post più lubngo che ho scritto sul mio blog, come sempre avrà un bassissimo numero di lettori, spero che tra questi ci sia qualche giocatore incallito ed esperto che possa darmi dei consigli

buona giornata a tutti

1 commento:

  1. Buongiorno, la mia personale convinzione è che non si può accontentare tutti e ci sarà sempre qualcuno insoddisfatto. La cosa è da intendere in senso lato, non solo per quanto riguarda questo caso specifico.
    Io gioco a questa scala 40 online da diverso tempo e mi piace molto; la trovo realistica e ben fatta, con in più tante opzioni attivabili da chi gioca con regole non proprio "pure". Premetto che amo parecchio questo gioco fatto "dal vivo" e quindi sono un cliente piuttosto critico. L'immagine da lei data di un gigantesco bar con cui giocare è molto calzante.
    Non mi intendo di algoritmi e su questo non posso dare alcun parere ma chi è un giocatore di carte sa bene che, come dice lei, esiste la sfortuna ed esistono anche i momenti, a volte piuttosto lunghi, di buone o cattive carte; mi piace molto pensare che, come ho sentito dire da giocatori incalliti, le carte sono "bianche" e siamo noi a "colorarle" nel momento in cui le giriamo, quindi, se il nostro stato d'animo non è propositivo, siamo noi stessi a portarci un po' di sfortuna :-)))))
    Il problema sostanzialmente è che molte persone mancano di obiettività riguardo alle proprie reali capacità di gioco, concentrazione e livello di abilità rispetto agli avversari e si rivalgono sul sistema o, peggio, cercano scorciatoie poco oneste.
    Concludendo: a me questa scala 40 piace molto e aspetto, spero al più presto, il nuovo aggiornamento per risolvere i problemi esistenti.
    Buona giornata.
    Laura Balzarro

    RispondiElimina