n° 219
Novembre 2017
Maggio 28, 2018, 05:41:49 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Creare cartelle della tombola  (Letto 618 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
kar
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 6


Mostra profilo E-mail
« inserita:: Gennaio 14, 2018, 07:42:49 »

Salve. Sto cercando da giorni, ormai, di creare un algoritmo per generare, in maniera casuale, le cartelle della tombola.

Di seguito il codice che ho già scritto (sicuramente migliorabile ...) nella speranza che possiate darmi qualche dritta che mi faccia uscire dall'empasse....

Codice:
namespace Tombola
{
    public partial class formStampa : Form
    {

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

        private int[,,] cartella = new int[6, 3, 9];

        public formStampa()
        {
            InitializeComponent();

        }


        private void button2_Click(object sender, EventArgs e)
        {

            // posiziona almeno un numero per decina su ogni cartella
            int col = 0;
            int dal = 0;
            int al = 0;
            int riga2 = 0;
            int quantiPerRiga = 0;

            for (int serie2 = 0; serie2 <= 5; serie2++)
            {
                for (int colo = 0; colo <= 8; colo++)
                {
                    if (colo == 0)
                    {
                        dal = 1;
                        al = 9;
                        riga2 = 1;
                    }
                    if (colo == 1)
                    {
                        dal = 10;
                        al = 19;
                        riga2 = 2;
                    }
                    if (colo == 2)
                    {
                        dal = 20;
                        al = 29;
                        riga2 = 0;
                    }
                    if (colo == 3)
                    {
                        dal = 30;
                        al = 39;
                        riga2 = 1;
                    }
                    if (colo == 4)
                    {
                        dal = 40;
                        al = 49;
                        riga2 = 0;
                    }
                    if (colo == 5)
                    {
                        dal = 50;
                        al = 59;
                        riga2 = 0;
                    }
                    if (colo == 6)
                    {
                        dal = 60;
                        al = 69;
                        riga2 = 2;
                    }
                    if (colo == 7)
                    {
                        dal = 70;
                        al = 79;
                        riga2 = 0;
                    }
                    if (colo == 8)
                    {
                        dal = 80;
                        al = 90;
                        riga2 = 2;
                    }


                    if (cartella[serie2, riga2, colo] == 0)
                    {
                        Random random = new Random();
                        int numeroDecina = random.Next(dal, al);

                        while (numeriCol1.IndexOf(numeroDecina) == -1)
                        {
                            random = new Random();
                            numeroDecina = random.Next(dal, al);
                        }

                        cartella[serie2, riga2, colo] = numeroDecina;  // cartella[serie, RIGA, 0] = numeroDecina;
                        numeriCol1.Remove(numeroDecina);

                        stampacartelle();

                        numeroserie.Text = numeroDecina.ToString();
                        numeroserie.Update();
                        numeriMancanti.Text = numeriCol1.Count.ToString();
                        numeriMancanti.Update();
                    }
                    else
                    {
                        MessageBox.Show("Doppione");
                    }
                }

            }

            // ora posiziono tutti gli altri numeri
            col = 0;
            quantiPerRiga = 0;

            while (numeriCol1.Count != 0)
            {
                Random random = new Random();
                int numeroDecina = random.Next(numeriCol1.Min(), numeriCol1.Max() + 1);
                while (numeriCol1.IndexOf(numeroDecina) == -1)
                {
                    Application.DoEvents();
                    numeroDecina = random.Next(numeriCol1.Min(), numeriCol1.Max() + 1);
                }

                if (numeroDecina < 10)
                {
                    col = 0;
                }
                else if (numeroDecina == 90)
                {
                    col = 8;
                }
                else
                {
                    col = numeroDecina / 10;
                }

                bool trovato = true;
                int tentativi = 0;

                while (trovato)
                {
                    if (tentativi > 15 && numeriCol1.Count <= 4)
                    {
                        MessageBox.Show("Soluzione non trovata. Ritentare");
                        trovato = false;
                    }
                    Random random2 = new Random();
                    int riga = random2.Next(0, 3);

                    Random random3 = new Random();
                    int serie = random3.Next(0, 6);


                    quantiPerRiga = 0;
                    for (int y = 0; y <= 8; y++)
                    {
                        if (cartella[serie, riga, y] != 0)
                            quantiPerRiga++;
                    }

                    if (quantiPerRiga < 5)
                    {
                        if (cartella[serie, riga, col] == 0)
                        {
                            cartella[serie, riga, col] = numeroDecina;
                            numeriCol1.Remove(numeroDecina);

                            stampacartelle();

                            numeroserie.Text = numeroDecina.ToString();
                            numeroserie.Update();
                            numeriMancanti.Text = numeriCol1.Count.ToString();
                            numeriMancanti.Update();

                            trovato = false;
                        }
                        else
                        {
                            tentativi++;
                        }
                    }

                }
            }

            MessageBox.Show("Finito");



        }

        private void stampacartelle()

        {
            label55.Text = "";
            label56.Text = "";
            label57.Text = "";
            label58.Text = "";
            label59.Text = "";
            label60.Text = "";
            label61.Text = "";
            label62.Text = "";
            label63.Text = "";
            label64.Text = "";
            label65.Text = "";
            label66.Text = "";
            label67.Text = "";
            label68.Text = "";
            label69.Text = "";
            label70.Text = "";
            label71.Text = "";
            label72.Text = "";

            char pad = '0';
            for (int s = 0; s <= 6; s++)
            {
                for (int r = 0; r <= 3; r++)
                {
                    for (int c = 0; c <= 8; c++)
                    {
                        // CARTELLA 0  
                        if (s == 0 && r == 0)
                        {

                            label55.Text = label55.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label55.Update();
                        }
                        if (s == 0 && r == 1)
                        {

                            label56.Text = label56.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label56.Update();
                        }
                        if (s == 0 && r == 2)
                        {

                            label57.Text = label57.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label57.Update();
                        }

                        // CARTELLA 1
                        if (s == 1 && r == 0)
                        {

                            label60.Text = label60.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label60.Update();
                        }
                        if (s == 1 && r == 1)
                        {

                            label59.Text = label59.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label59.Update();
                        }
                        if (s == 1 && r == 2)
                        {

                            label58.Text = label58.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label58.Update();
                        }

                        // CARTELLA 2
                        if (s == 2 && r == 0)
                        {

                            label63.Text = label63.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label63.Update();
                        }
                        if (s == 2 && r == 1)
                        {

                            label62.Text = label62.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label62.Update();
                        }
                        if (s == 2 && r == 2)
                        {

                            label61.Text = label61.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label61.Update();
                        }

                        // CARTELLA 3
                        if (s == 3 && r == 0)
                        {

                            label66.Text = label66.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label66.Update();
                        }
                        if (s == 3 && r == 1)
                        {

                            label65.Text = label65.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label65.Update();
                        }
                        if (s == 3 && r == 2)
                        {

                            label64.Text = label64.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label64.Update();
                        }

                        // CARTELLA 4
                        if (s == 4 && r == 0)
                        {

                            label69.Text = label69.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label69.Update();
                        }
                        if (s == 4 && r == 1)
                        {

                            label68.Text = label68.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label68.Update();
                        }
                        if (s == 4 && r == 2)
                        {

                            label67.Text = label67.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label67.Update();
                        }

                        // CARTELLA 5
                        if (s == 5 && r == 0)
                        {

                            label72.Text = label72.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label72.Update();
                        }
                        if (s == 5 && r == 1)
                        {

                            label71.Text = label71.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label71.Update();
                        }
                        if (s == 5 && r == 2)
                        {

                            label70.Text = label70.Text + (cartella[s, r, c].ToString().PadLeft(2, pad)) + "  ";
                            label70.Update();
                        }

                    }
                }
            }
        }



        }
    }
}
Le regole da seguire sono:

1) cartelle da 3 righe e 9 colonne
2) numeri per decina per colonna (prima colonna 1-9, seconda 10-19 ..... nona 80-90)
3) nella serie da 6 cartelle tutti i 90 numeri presenti, nessuno ripetuto
4) cinque numeri per riga (e quattro spazi vuoti)
5) numeri in cartella ordinati in ordine decrescente per colonna (considerando gli eventuali valori "0" come spazi) (non implementato nel codice postato)
6) non più di due numeri per colonna (non implementato nel codice postato)

Il lungo codice postato presenta principalmente questo problema:

1) a volte il ciclo non si chiude in quanto restano 1 /2 numeri che impossibile sistemare (per esempio, resta il numero 19 e l'unica riga dove sistemarlo (in quanto contiene 4 numeri) è questa __/10/__/__/47/52/__/70/__/. A questo punto il programma non trovando disponibile il posto delle decine libero va in loop e si blocca)

quindi immagino sia scritto in maniera errata (va forse utilizzata una ricorsività ? che io non so implementare ....)

Spero qualcuno possa aiutarmi.

Grazie.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines