Simulazione Tombola

di il
3 risposte

Simulazione Tombola

Salve ragazzi, ho bisogno di qualche consiglio su come far funzionare perfettamente questo programmino.
In pratica volevo realizzare/simulare una specie di tombola, dove c'è il "dealer" o banco, il "player" ed una lista dinamica di giocatori .
Il codice è molto rudimentale perché è un mix di prove ecc ecc; comunque in pratica il programma ci chiede all'inizio quanti giocatori siamo ed ognuno di noi deve scegliere una cartella, da 1 a 6 (ogni cartella è composta da 15 numeri).
Finita questa prima fase, il bancone (dentro un while) inizierà a sorteggiare dei numeri random (1,90) ognuno diverso dall'altro fino a quando il giocatore[j-esimo] presente nella lista non farà tombola; uscito dal while il programma dovrà dirmi il giocatore x dopo quante estrazioni ha fatto tombola, in modo che alla fine si possa stabilire che realmente ha fatto per primo tombola.
Per quanto riguarda ambo, terna, quaterna e cinquina lo vedrò in seguito; per ora mi interessa farlo funzionare così.

il problema che riscontro è che una volta che il programma mi dice che il player x ha fatto tombola dopo ad esempio 80 numeri estratti, non riesco ad azzerargli correttamente i numeri estratti in modo che riparta da capo col giocatore [j-esimo] seguente, senza la presenza di " bug".

CODICE BANCO

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tombola1Player
{/// <summary>
/// Banco has to generate random numbers from 1 to 90 each time he's called
/// </summary>
    class Banco
    {
        public Banco() { }
        List<int> listaEstrazioni = new List<int>();
        Random rnd = new Random();
       public int numeroGenerato=0;

        public int estraiNumero()
        {
             
            for (; ; ) {
                numeroGenerato = rnd.Next(1, 91);
                if (!listaEstrazioni.Contains(numeroGenerato))
                {
                    listaEstrazioni.Add(numeroGenerato);
                    return numeroGenerato;
                }
            }
        }  
    }
}

CODICE GIOCATORE

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tombola1Player
{
    class Giocatore
    {
        int id = 0;
        int count = 0;
        Banco bancone = new Banco();
        List<int> cartellaPlayer = new List<int> {21,19,17,31,14,6,12,71,22,10,2,57,37,4};
        List<int> cartellaPlayer2 = new List<int> { 7,13,21,35,37,49,43,51,63,75,77,83,91,27 };
        List<int> cartella1 = new List<int> { 8,30,41,62,71,14,24,39,54,82,19,25,44,59,89};
        List<int> cartella2 = new List<int> { 1,20,40,55,81,16,36,65,75,87,3,18,21,69,78};
        List<int> cartella3 = new List<int> { 11,35,50,60,70,6,42,53,79,83,28,37,48,68,86 };
        List<int> cartella4 = new List<int> { 12,23,45,51,90,4,15,33,47,72,9,27,38,58,66 };
        List<int> cartella5 = new List<int> { 22,34,56,61,80,2,13,29,43,76,7,17,63,77,85 };
        List<int> cartella6 = new List<int> { 5,10,46,52,64,26,31,57,73,84,32,49,67,74,88 };


        public Giocatore(int x)
        {
            id = x;
        }

        public Giocatore() { }

              
        /// <summary>
        /// Player checks the extract number and if he has that number 
        /// he will mark up the corrispondent one on his table.
        /// </summary>
        /// <returns></returns>
        public void controllaNumero(int n)
        {
            if (cartellaPlayer.Contains(n))
            {                
                count++;  
            }
          
        }



        /// <summary>
        /// return true if player made Tombola!, false if not!
        /// </summary>
        /// <returns></returns>
        public bool tombola()
        {
            if (count == 15)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        public void verificaTombola()
        {
            Console.WriteLine("Player"+id+ ": Ecco i miei numeri-- > ");
            for (int i = 0; i < cartellaPlayer.Count; i++)
            {
                Console.Write(cartellaPlayer[i]+" || ");
            }
        }

        public int GetNomeGiocatore()
        {
            return id;
        }

        public void SetCartella(List <int>cartella)
        {
            cartellaPlayer = cartella;
        }



        /// <summary>
        /// Questa funzione mi permette di far selezionare al giocatore la cartella con cui giocare
        /// </summary>
        /// <param name="x"></param>
        public void SelezionaCartella(int x)
        {
            switch (x)
            {
                case 1:
                    SetCartella(cartella1);
                    Console.WriteLine("Hai selezionato la Cartella 1. ");
                    break;

                case 2:
                    SetCartella(cartella2);
                    Console.WriteLine("Hai selezionato la Cartella 2. ");
                    break;

                case 3:
                    SetCartella(cartella3);
                    Console.WriteLine("Hai selezionato la Cartella 3. ");
                    break;

                case 4:
                    SetCartella(cartella4);
                    Console.WriteLine("Hai selezionato la Cartella 4. ");
                    break;

                case 5:
                    SetCartella(cartella5);
                    Console.WriteLine("Hai selezionato la Cartella 5. ");
                    break;

                case 6:
                    SetCartella(cartella6);
                    Console.WriteLine("Hai selezionato la Cartella 6. ");
                    break;
                default:
                    Console.WriteLine("[ATTENZIONE, devi inserire un numero da 1 a 6!]");
                    break;
            }


        }


    }
}
CODICE Program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tombola1Player
{
    class Program
    {
        static void Main(string[] args)
        {
            Banco dealer = new Banco();
            Giocatore player = new Giocatore();
           // Multigiocatore multiPlayer = new Multigiocatore();
            List<Giocatore> ListaGiocatori = new List<Giocatore>();
            int nmrCartella = 0;
            int numeroGiocatori = 0;
            Console.WriteLine("CIAO, Quanti giocatori siete?:  ");
            numeroGiocatori = Convert.ToInt32(Console.ReadLine());

                
            

            for (int k = 1; k< numeroGiocatori+1; k++)
            {
                player = new Giocatore(k);
               ListaGiocatori.Add(player);
               
            }

            
            for (int y = 0; y < numeroGiocatori; y++)

            {
                    Console.Write("\nGiocatore "+ (y+1) +" quale cartella vuoi?:  ");
                    nmrCartella = Convert.ToInt32(Console.ReadLine());
                   ListaGiocatori[y].SelezionaCartella(nmrCartella);
                
            }

            int i = 0;

           for (int j = 0; j < ListaGiocatori.Count; j++)
            {
             
                while (i < 90 && !ListaGiocatori[j].tombola())
                {
                    int num = dealer.estraiNumero();
                  //  Console.WriteLine("Numero Estratto: " + num);
                   ListaGiocatori[j].controllaNumero(num);
                    i++;
                }

                Console.Write("\n\nIl giocatore " + ListaGiocatori[j].GetNomeGiocatore() + " ha fatto tombola dopo: ");
                Console.WriteLine(i+ " numeri estratti");
                ListaGiocatori[j].verificaTombola();

                
                
           }
            Console.ReadKey();

        }
    }
}
Aspetto un vostro riscontro

3 Risposte

  • Re: Simulazione Tombola

    Non ho capito il problema che hai .. (bug? Quale bug?)
  • Re: Simulazione Tombola

    oregon ha scritto:


    Non ho capito il problema che hai .. (bug? Quale bug?)
    Ciao, grazie per aver risposto.
    In pratica, per come è il programma ora un possibile risultato potrebbe essere:
    "
    Ciao, quanti giocatori siete? : 3

    Giocatore 1 quale cartella vuoi? 4
    Cartella selezionata:4

    Giocatore 2 quale cartella vuoi? 2
    Cartella selezionata:2

    Giocatore 3 quale cartella vuoi? 1
    Cartella selezionata:1


    Il giocatore 1 ha fatto tombola dopo 85 estrazioni .
    La mia cartella è : bla bla bla bla

    Il giocatore 2 ha fatto tombola dopo 90 estrazioni.
    la mia cartella è : bla bla bla

    Il giocatore 3 ha fatto tombola dopo 90 estrazioni.
    la mia cartella è: bla bla bla
    "
    Praticamente io voglio che contemporaneamente tutti i giocatori all'interno della lista controllino la loro scheda e quando qualcuno di loro fa tombola esca fuori dal while e lo stampi a video.
    Siccome non sono riuscito a fare una cosa del genere volevo ovviare, per adesso, valutando dopo quante estrazioni ogni singolo player avesse fatto tombola e quello con minor numero vinceva.
    Però a video è sempre il giocatore 1 ad aver fatto tombola per primo, perchè giustamente il for parte da lui... e non so come aggiustare il tutto...
  • Re: Simulazione Tombola

    Subito dopo l'istruzione:
    public int numeroGenerato = 0;
    Aggiungi:
    public int QNumeriGenerati = 0; // Inidca la quantità di numeri generati

    Dopo l'istruzione:
    listaEstrazioni.Add(numeroGenerato);
    Aggiungi:
    QNumeriGenerati = QNumeriGenerati +1; // Incrementa il valore del conteggio della quantità dei numeri generati VALIDI e aggiunti in lista univoca

    Il vincitore è colui che ha fatto tombola con il QNumeriGenerati più basso.
    Potrebbero esserci casi in cui più giocatori ottengono una combinazione vincente allo stesso turno, per cui occorre impostare la regola di assegnazione della vittoria in quel caso.

    Il ciclo while va tolto,
    Ad ogni EVENTO estrazione va fatto il controllo delle combinazioni vincenti per ciascuna cartella in gioco.
    Oppure ciclare da 0 o 1 fino alla quantità delle estrazioni e se si trova la prima cartella vincente assegnare alla variabile Vincitore il giocatore con la cartella vincente e impedire la verifica di altre vincite.
    Se OkVincitoreTrovato = False allora controlla se ci sono vincite,
    Se OkVincitoreTrovato = true non assegnare altri vincitori.
Devi accedere o registrarti per scrivere nel forum
3 risposte