IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Génération d'un carton de loto


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut Génération d'un carton de loto
    Bonjour à tous,

    Je pense être tombé sur un os et j'aurai besoin d'un petit coup de main svp.
    Mon but est de générer, en php, un carton de loto traditionnel dont les conditions sont les suivantes :

    • 3 lignes
    • 9 colonnes
    • pas plus de 2 nombres par colonne
    • 5 nombres par ligne obligatoirement
    • pas 2 fois le même nombre


    Mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    91
    92
    93
    94
     
    $numbers = array(
    		'1' => array(
    				1, 2, 3, 4, 5, 6, 7, 8, 9
    			),
    		'2'	=>	array(
    				10, 11, 12, 13, 14, 15, 16, 17, 18, 19
    			),
    		'3'	=>	array(
    				20, 21, 22, 23, 24, 25, 26, 27, 28, 29
    			),
    		'4'	=>	array(
    				30, 31, 32, 33, 34, 35, 36, 37, 38, 39
    			),
    		'5'	=>	array(
    				40, 41, 42, 43, 44, 45, 46, 47, 48, 49
    			),
    		'6'	=>	array(
    				50, 51, 52, 53, 54, 55, 56, 57, 58, 59
    			),
    		'7'	=>	array(
    				60, 61, 62, 63, 64, 65, 66, 67, 68, 69
    			),
    		'8'	=>	array(
    				70, 71, 72, 73, 74, 75, 76, 77, 78, 79
    			),
    		'9'	=>	array(
    				80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90
    			)
    );
     
    echo '<table border="1">';
    for ($l=1; $l < 4; $l++) { 
    	echo '<tr>';
    	$nbChoix = 0;
    	$nbReste = 9;
    	for ($c=1; $c < 10; $c++) {		
    		if ($nbChoix < 5) {
    			$rAnd = rand(0,1);
    			if ($l!=1) {
    				if ($rAnd == 1 && (9 - $nbChoix) > 4) {
    					if ($selection[$l-1][$c] == null) {
    						$nbChoix++;
    						$getNumber = array_rand($numbers[$c], 1);
    						echo '<td>'.$numbers[$c][$getNumber].'</td>';
    						$selection[$l][$c] = $numbers[$c][$getNumber];
    					} else {
    						if ((5 - $nbChoix) >= ($nbReste - $nbChoix) && ($selection[$l-2][$c] == NULL || $selection[$l-1][$c] == null)) {
    							$nbChoix++;
    							$getNumber = array_rand($numbers[$c], 1);
    							echo '<td>'.$numbers[$c][$getNumber].'</td>';
    							$selection[$l][$c] = $numbers[$c][$getNumber];
    						} else {
    							echo '<td>&nbsp;</td>';
    							$selection[$l][$c] = null;
    						}
    					}
    				} else if ($rAnd == 0 && (5 - $nbChoix) >= ($nbReste - $nbChoix)) {
    					$nbChoix++;
    					$getNumber = array_rand($numbers[$c], 1);
    					echo '<td>'.$numbers[$c][$getNumber].'</td>';
    					$selection[$l][$c] = $numbers[$c][$getNumber];
    				} else {
    					echo '<td>&nbsp;</td>';
    					$selection[$l][$c] = null;
    				}
    			} elseif ($l==1) {
    				if ($rAnd == 1 && (9 - $nbChoix) > 4) {
    					$nbChoix++;
    					$getNumber = array_rand($numbers[$c], 1);
    					echo '<td>'.$numbers[$c][$getNumber].'</td>';
    					$selection[$l][$c] = $numbers[$c][$getNumber];
    				} else if ($rAnd == 0 && (5 - $nbChoix) >= ($nbReste - $nbChoix)) {
    					$nbChoix++;
    					$getNumber = array_rand($numbers[$c], 1);
    					echo '<td>'.$numbers[$c][$getNumber].'</td>';
    					$selection[$l][$c] = $numbers[$c][$getNumber];
    				} else {
    					echo '<td>&nbsp;</td>';
    					$selection[$l][$c] = null;
    				}
    			} else {
    				echo '<td>&nbsp;</td>';
    				$selection[$l][$c] = null;
    			}			
    		} else {
    			echo '<td>&nbsp;</td>';
    			$selection[$l][$c] = null;
    		}
    		$nbReste--;
    	}
    	echo '</tr>';
    }
    echo '</table>';
    Mon problème ? Je n'arrive pas à obliger les 5 nombres par ligne et a empêcher les 3 nombres par colonne.

    Quelqu'un aurait une idée, svp ?

    Un grand merci d'avance!

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    je vois pas où est la difficulté :
    tu as une grille de 3 lignes sur 9 colonnes
    Règle de remplissage : 5 numéros par ligne et pas plus de 3 par colonne.
    Ce qui veut dire que quoi qu'il arrive, la condition n°2 est respectée (tu peux avoir 1, 2 ou 3 numéros par colonne).
    Tu n'as plus qu'à positionnner au hasard tes 5 numéro sur tes 9 cases de chaque ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ----------------------------
    1 |  |  |  |  |  |  |  |  |  |
      ----------------------------
    2 |  |  |  |  |  |  |  |  |  |
      ----------------------------
    3 |  |  |  |  |  |  |  |  |  |
      ----------------------------

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut
    Oups, effectivement je me suis mal exprimé ^^

    Donc en fait, c'est pas plus de 2 par colonne (sinon ça serait, comme tu l'as dit, trop simple).

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    La précision c'est important

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut
    oui clairement

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bon j'espère que cela n'est pas un devoir, sinon je te cartonne rouge
    Voici une soluce au problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
     
    // on tire 15 numéros au hasard parmi 90
    $nums   = array_rand(array_fill_keys(range(1, 90), 0), 15);
    // numéros des places dipsonibles numérotées de 11 à 19, 21 à 29, 31 à 39
    $places = array_merge(range(11, 19), range(21, 29), range(31, 39));
    // emplacements disponibles
    $silo   = array_combine($places, $places);
    // grille résultat
    $grid   = array(
        1 => array(),
        2 => array(),
        3 => array()
    );
     
    // positionnement des 15 numéros dans la grille
    foreach($nums as $num) {
        $placed = false;
        while( ! $placed) {
            $pos  = array_rand($silo, 1);
            // si la place tirée est de la première ligne
            // on vérifie que les places symétriques des lignes suivantes sont bien disponibles
            if ($pos < 20) {
                $row  = 1;
                $rows = array(2, 3);
            }
            // si la place tirée est de la deuxième ligne
            // on vérifie que les places symétriques de la ligne précédente et de la suivante sont bien disponibles
            else
            if ($pos < 30) {
                $row  = 2;
                $rows = array(1, 3);
            }
            // si la place tirée est de la troisième ligne
            // on vérifie que les places symétriques des lignes précédentes sont bien disponibles
            else {
                $row  = 3;
                $rows = array(1, 2);
            }
     
            // on vérifie le nombre d'élements définis sur la ligne
            $nb = count($grid[$row]);
            // ligne pleine
            if ($nb === 5) {
                $start = $row * 10 + 1;
                $silo  = array_diff($silo, range($start, $start + 9));
                continue;
            }
     
            $place = $pos - ($row * 10);
     
            if ( ! isset($grid[$rows[0]][$place], $grid[$rows[1]][$place])) {
                unset($silo[$pos]);
                $grid[$row][$place] = $num;
                $placed             = true;
            }
            else {
                $a = $rows[0] * 10 + $place;
                $b = $rows[1] * 10 + $place;
                unset($silo[$a], $silo[$b]);
            }
        }
    }
     
    echo '<table border="1">';
    foreach($grid as $row => $nums) {
        echo '<tr>';
        for($i = 1; $i <= 9; ++$i) {
            echo '<td width="20" align="center">', ((isset($nums[$i])) ? $nums[$i] : '&nbsp;') , '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
    EDIT: Attention : j'ai modifié la ligne 5

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] génération d'un EJB avec GenIc
    Par Stessy dans le forum JOnAS
    Réponses: 65
    Dernier message: 31/01/2005, 11h50
  2. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 14h14
  3. Génération programmatique d'un UUID
    Par jIdJo dans le forum MFC
    Réponses: 2
    Dernier message: 18/07/2003, 03h50
  4. [Lomboz] Génération de code pour EJB
    Par paikan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 09/07/2003, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo