Cerca con Google

Translate

25 novembre 2011

Tutorial 27 - Distribuire carte da Poker (ciclo "while", random e array)


Su richiesta di un amico lettore, vediamo oggi un applicazione realizzata con App Inventor che prenda un ipotetico mazzo di carte da Poker e le distribuisca in maniera casuale a quattro giocatori.

Il tutorial di oggi si avvarrà solo di screenshot e testo, il video risulterebbe troppo lungo e noioso, non vi spaventate, cercherò di essere il più chiaro possibile.

Questa app è solo un esempio di come si potrebbe creare un gioco di Texas Hold'em o di Video Poker, la strada da fare è tanta e complicata ma seguendo questo tutorial imparerete comunque cose interessanti sui cicli "while", sulle liste e sulle funzioni random di App Inventor.
Come prima cosa ci serve definire le carte da gioco, lo facciamo in forma testuale, ognuna di essa sarà rappresentata da un numero e da una sigla per il segno (C=Cuori,P=Picche e così via)


Poi inizializzeremo 6 liste:

  • MazzodiCarte contiene la lista ordinata della carte
  • MazzoCorrente contiene la lista mescolata delle carte
  • CarteG1-G4 contengono la lista delle carte di ogni singolo giocatore


Vediamo la parte di Design Editor dove avrò una serie di screen arrangement dei button e delle text label per la visualizzazione di:
  • Il mazzo di carte mescolato
  • Le carte distribuite ai quattro giocatori
  • I due pulsanti per mescolare e distribuire le carte
  • Uno sfondo con una carta da Poker per l'abbellimento dell'app

Vediamo adesso il "cuore" dell'app, ovvero l'algoritmo che mescola le carte:



Inizializzo il contatore col numero 52 (il numero totale della carte da gioco)
Poi creo MazzodiCarte come una lista ordinata prendendo gli elementi dalla stringa Carte e splittando ogni elemento ad ogni ripetizione del carattere ","
MazzoCorrente invece lo inizializzo vuoto

Ora uso il ciclo "while", per chi non lo sapesse, questo ciclo verifica la condizione scritta nella parte "test" e finché tale condizione è vera ripete il ciclo di codice inserito nella parte "do" (se la condizione è falsa esce dal ciclo)

Vediamo quindi ad ogni ciclo cosa farà la mia routine:

  • con "pick random item" pesco una carta a caso dal mazzo ordinato e la salvo in "CartaCorrente"
  • rimuovo questa carta dal mazzo ordinato
  • aggiungo questa carta al mazzo che sto mescolando
  • decremento di uno il mio contatore
Capite quindi che ad ogni ciclo sposto una carta "a caso" dal mazzo ordinato a quello da mescolare.
Dopo il primo ciclo avrò 51 carte nel mazzo ordinato e 1 in quello mescolato...dopo 52 cicli avrò solo più carte nel "Mazzo Corrente" che sarà così perfettamente mescolato.
Finito il mescolamento delle carte, visualizzo il risultato nella label MazzoCarte

Siamo a buon punto, il grosso del lavoro è fatto, non ci resta ora che distribuire queste carte ai nostri 4 giocatori di Poker, lo faccio col seguente codice:


Questa volta la procedura è più "lineare", ovvero finché il contatore è inferiore o uguale a 52 eseguo le seguenti operazioni (quindi uso anche questa volta un ciclo "while"):
  • Aggiungo alla lista delle carte del giocatore 1 la prima carta dal mazzo corrente (contatore_i)
  • Aggiungo alla lista delle carte del giocatore 2 la seconda carta dal mazzo corrente (contatore_i + 1)
  • Aggiungo alla lista delle carte del giocatore 3 la terza carta dal mazzo corrente (contatore_i + 3)
  • Aggiungo alla lista delle carte del giocatore 4 la quarta carta dal mazzo corrente (contatore_i + 4)
  • incremento di 4 il contatore
Quindi è come se il mazziere distribuisse in senso ciclico e ordinato le carte prese dal mazzo mescolato in precedenza a tutti e 4 i giocatori seduti al tavolo verde.
Per finire sorteggio il giocatore che avrà la prima mano usando la funzione "random integer"

Vediamo in azione l'app con le seguenti schermate, qui dopo che ho premuto il pulsante "mescola":


e qui dopo che ho premuto il pulsante "distribuisci" (in rosso il giocatore sorteggiato come primo di mano)


Come avete visto usando App Inventor siamo riusciti a mettere le basi per la creazione di un gioco di carte (sta a voi se vi interessa modificare l'app per poi implementare le regole che vi permettano di giocare a Video Poker, Texas Hold'em, BlackJack o quant'altro)

Potete scaricare il sorgente dell app da qua


9 commenti:

  1. ho scaricato iol block editor e mi chiede un codice per attivarlo qual'è

    RispondiElimina
    Risposte
    1. Nessun codice, sicuro di avere installato tutto correttamente?

      Elimina
  2. dovrebbe essere carino ma senza video rinuncio, incomprensibile!!! meglio che continuo con la grafica la programmazione proprio non mi entra

    RispondiElimina
  3. davvero bello questo tutorial, non lo avevo visto su youtube appunto perche è solo testuale ma perfettamente comprensibile, almeno per chi ha fatto c++ e turbo pascal.
    Sei proprio bravo, continua cosi, ti seguo sempre....

    RispondiElimina
    Risposte
    1. grazie! i complimenti son sempre bene accetti, alcuni tutorial sono solo testuali ma spero piacciano lo stesso :)

      Elimina
  4. ciao sebastiano!
    come faccio a generare a random un elenco di nomi (presi da una lista) senza che ci siano ripetizioni?
    perché ho provato con la lista, ma il "remove list item" ha la proprietà index che è impostabile solo con i numeri quindi non posso fargli togliere dalla lista il nome che esce random

    RispondiElimina
    Risposte
    1. Ciao Roberto, usa sempre l'index anche per estrarre i nomi dalla lista,
      quindi il random ti da sempre un valore numerico,
      a quel punto copi il nome corrispondente al numero in una nuova lista e poi rimuovi dalla lista coi nomi originaria lo stesso indice.
      Alla fine del ciclo la tua prima lista sarà vuota e la seconda riempita con i nomi "mescolati"
      fammi sapere se risolvi, ciao

      Elimina