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

Turbo Pascal Discussion :

Jeu de Sudoku (en Pascal) [TPW]


Sujet :

Turbo Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Jeu de Sudoku (en Pascal)
    Bonjour,
    Je rencontre un problème en essayant de faire le puzzle du jeu "Sudoku" dans une matrice (9x9) .. en faite, ça m'a donné un message d'erreur: "NTVDM.exe à cesser de fonctionner" .. peut-être à cause d'une boucle infinie.., voici les lignes de 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
    type
      short = 1..9;
     
    var
      i, k, j, n, l, p, q, limk1, limk2, limi1, limi2: short;
      ch, num: string[1];
      x, y: integer;
      b, t: boolean;
      key: char;
      M: array [1..9, 1..9] of string[1];
      xy: array [1..2, 1..81] of integer;
     
    label
      theend, randoms;
     
    begin
      randomize;
      for k := 1 to 9 do
      begin
        if k in [1..3] then
        begin
          limk1 := 1;
          limk2 := 3;
        end
        else if k in [4..6] then
        begin
          limk1 := 4;
          limk2 := 6;
        end
        else
        begin
          limk1 := 7;
          limk2 := 9;
        end;
     
        for i := 1 to 9 do
        begin
          if i in [1..3] then
          begin
            limi1 := 1;
            limi2 := 3;
          end
          else if i in [4..6] then
          begin
            limi1 := 4;
            limi2 := 6;
          end
          else
          begin
            limi1 := 7;
            limi2 := 9;
          end;
     
     
          randoms:
            randomize;
          str(random(9) + 1, ch);
          b := True;
          for j := 1 to 9 do
            b := b and (ch <> M[j, k]);
          for l := 1 to 9 do
            b := b and (ch <> M[i, l]);
          for p := limk1 to limk2 do
            for q := limi1 to limi2 do
              b := b and (ch <> M[q, p]);
          if b = True then
            M[i, k] := ch
          else
            goto randoms;
        end;
      end;
    ...

    J'espère quelqu'un peut m'aider, et merci.

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Sans doute que sur ce forum, il y une aide potentiellement non négligeable
    et pour Pascal je pourrais même mettre la main à la pâte mais ...
    ... un minimum de présentation dans le code (indentation) serait nécessaire, non ?


    Et puis des indications sur l'algorithme employé faciliterait et donnerait sans doute
    envie de jeter un coup d'oeil dans le code en ce qui me concerne
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Bonjour,

    +1

    et de plus quand je vois des labels et des goto, je vais voir ailleurs sans me poser d'autres questions.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par droggo Voir le message
    ...
    et de plus quand je vois des labels et des goto, ...
    Le "goto" est un sujet d'actualité sur developpez

    http://www.developpez.com/actu/10675...n-utilisation/
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par vttman Voir le message
    Sans doute que sur ce forum, il y une aide potentiellement non négligeable
    et pour Pascal je pourrais même mettre la main à la pâte mais ...
    ... un minimum de présentation dans le code (indentation) serait nécessaire, non ?


    Et puis des indications sur l'algorithme employé faciliterait et donnerait sans doute
    envie de jeter un coup d'oeil dans le code en ce qui me concerne
    Bon, l'idée est simple.. c'est de choisir un nombre aléatoire entre 1 et 9, le convertir en chaine[1] :p et tester s'il n'existe pas sur colonne, ligne, et puis box (3x3), alors qu'il sera mis dans M[i,k] (M c'est la matrice) , sinon repeter ce traitement jusqu'à cette condition soit vrai .. x)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par FChrisF Voir le message
    Je n'ai pas vraiment regardé le code, mais la compilation indique un warning concernant la non initialisation du tableau M à la ligne 60 (et après). Ce qui me semble a priori exact.

    De toute façon, très rapidement le programme boucle de façon infinie avec (par exemple) les lignes suivantes pour M (on voit que seules certaines valeurs sont stockées):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    69172!34256!58714!96521!21439!73865!45697!17983!8234!
    Pouvez-vous expliquer davantage svp? .. x)

  7. #7
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Citation Envoyé par Crymfox Voir le message
    Pouvez-vous expliquer davantage stp? .. x)
    Désolé, vous avez été trop rapide pour moi. J'ai en effet supprimé mon post, car je me suis aperçu après-coup que votre sujet portait sur l'utilisation de TPW (j'aurais du le lire plus attentivement la 1ère fois). Il se peut donc que ma précédente remarque ne soit pas pertinente (pour le moins).

    Ceci étant, je pense tout de même que votre programme boucle dans la partie randoms/goto randoms. Affichez en sortie le contenu de votre tableau M, et vous verrez très rapidement qu'il n'est plus modifié et qu'il est incomplet (enfin pour ce que crois comprendre).

    Par exemple:
    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
     
    var
    ...
       var1,var2: short;
    ...
     
          str(random(9) + 1, ch);
          for var1 := 1 to 9 do
            begin
              for var2 := 1 to 9 do
                write(M[var1,var2]);
              write('!');
            end;
          writeln;
          b := True;
    ...

  8. #8
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Je propose de placer
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i := 1 to 9 do
      for j := 1 to 9 do
     m[i,j] := '*';
    au démarrage

    et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for j := 1 to 9 do
     for l := 1 to 9 do
      begin
       if (l=9) then
         writeln(m[j,l],' ')
       else
         write(m[j,l],' ');
      end;
    readln;
    juste avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if b = True then
            M[i, k] := ch
          else
            goto randoms;
    histoire de progresser ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par FChrisF Voir le message
    Désolé, vous avez été trop rapide pour moi. J'ai en effet supprimé mon post, car je me suis aperçu après-coup que votre sujet portait sur l'utilisation de TPW (j'aurais du le lire plus attentivement la 1ère fois). Il se peut donc que ma précédente remarque ne soit pas pertinente (pour le moins).

    Ceci étant, je pense tout de même que votre programme boucle dans la partie randoms/goto randoms...
    ...
    Merci bien.., mais je voulais vous dire que j'ai déja fait la partie de l'affichage.
    mon code était comme ça , c'est exécutable.. essai le.. :

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    program sudoku;
    uses wincrt;
    type
    short=1..9;
    var
    i,k,j,n,l,p,q,limk1,limk2,limi1,limi2:short;
    ch,num:string[1];
    x,y:integer;
    b,t:boolean;
    key:char;
    M:array [1..9,1..9] of string[1];
    xy:array [1..2,1..81] of integer;
    label
    theend,randoms;
    begin
     
     
    gotoxy(11,11);
    write('*Welcome to Sudoku Game!*');
    gotoxy(11,12);
    write('(Press Enter to start...)');
    gotoxy(9,24);
    write('All rights reserved to CrYmFoX 2016.');
    gotoxy(11,13);
    readln;
     
    clrscr;
     
     
    writeln(' _____________________________________________________ ');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
    writeln('|     |     |     |     |     |     |     |     |     |');
    writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
     
    randomize;
    for k:=1 to 9 do
    begin
    if k in [1..3] then
    begin
    limk1:=1;
    limk2:=3;
    end
    else if k in [4..6] then
    begin
    limk1:=4;
    limk2:=6;
    end
    else
    begin
    limk1:=7;
    limk2:=9
    end;
     
    for i:=1 to 9 do
    begin
    if i in [1..3] then
    begin
    limi1:=1;
    limi2:=3;
    end
    else if i in [4..6] then
    begin
    limi1:=4;
    limi2:=6;
    end
    else
    begin
    limi1:=7;
    limi2:=9
    end;
     
     
    str(random(9)+1,ch);
    b:=true;
    for j:=1 to 9 do
    b:=b and (ch <> M[j,k]);
    for l:=1 to 9 do
    b:=b and (ch <> M[i,l]);
    for p:=limk1 to limk2 do
    for q:=limi1 to limi2 do
    b:=b and (ch <> M[q,p]);
    if b=true then
    M[i,k]:=ch;
    end;
    end;
     
     
     
    x:=4;
    for k:=1 to 9 do
    begin
    y:=2;
    for i:=1 to 9 do
    begin
    gotoxy(x,y);
    write(M[i,k]);
    if M[i,k] <> '' then
    begin
    xy[1,k]:=x;
    xy[2,k]:=y
    end;
    y:=y+2
    end;
    x:=x+6
    end;
     
     
     
     
    x:=4;
    y:=2;
    gotoxy(x,y);
    repeat
     
     
    key:=readkey;
    case key of
    'z' : y:=y-2;
    's' : y:=y+2;
    'd' : x:=x+6;
    'q' : x:=x-6;
    'p' : goto TheEnd;
    '1' .. '9' : num:=key;
    end;
     
    case y of
    0 : y:=2;
    20 : y:=18;
    end;
    case x of
    -2 : x:=4;
    58 : x:=52;
    end;
    gotoxy(x,y);
     
    write(num);
     
    gotoxy(x,y);
     
    num:='';
     
     
    until keypressed;
     
     
    TheEnd:
    clrscr;
    gotoxy(16,16);
    write('The game is over, press Alt+F4 to exit...')
     
    end.
    mais quand j'ai essayé de jouer avant de passer vers l'étape suivante.. j'été surpris que le code générateur des puzzles n'était pas correcte., c'est pour ça j'avais une idée pour remplir tout la matrice M (Solution).. puis faire un autre code pour mettre en vide des cases de positions aléatoires..

    J'espère que vous avez bien compris ma situation...

  10. #10
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par vttman Voir le message
    Je propose de placer
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i := 1 to 9 do
      for j := 1 to 9 do
     m[i,j] := '*';
    au démarrage
    ...
    Merci bien mais pouvez vous m'expliquer davantage à propos du 2ème code ?.. x)

    (ça ne marche pas)

  11. #11
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Cela fait très, très, très longtemps que je ne me suis plus intéressé au Sudoku, mais je pense que votre algorithme de génération est incorrect: car il ne vous permet pas de revenir en arrière lorsque vous êtes dans une situation où il n'y a plus de solution possible pour les chiffres restants.

    Toutes les combinaisons ne sont en effet pas possibles. En cas de blocage, généralement on revient en arrière (jusqu'à ce qu'il n'y ait plus de blocage), et on teste alors d'autres combinaisons. Ce qui n'est pas votre cas.

    Je suis certain que vos trouverez de nombreux exemples d'algorithmes sur ce forum.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    D'accord.. et en tt cas merci pour votre coopération..

  13. #13
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par Crymfox Voir le message
    Merci bien mais pouvez vous m'expliquer davantage à propos du 2ème code ?.. x)

    (ça ne marche pas)
    En fait je voulais afficher la matrice au fur et à mesure
    Nom : Capture.JPG
Affichages : 1364
Taille : 15,8 Ko
    Ici on voit que l'algorithme boucle car il ne peut pas choisir la valeur 1, ok ...

    Mais là si je le relance, je ne vois pas pour l'instant ce qui coince ?

    Nom : Capture1.JPG
Affichages : 1375
Taille : 16,5 Ko

    Des algorithmes, c'est vrai il doit y en avoir des tas, mais c'est toujours intéressant de voir ce qui cloche,
    donc je vais regarder de plus près l'algorithme de mon coté
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  14. #14
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Générer une grille de Sudoku revient à résoudre une grille vide.

    Et la résolution passe nécessairement (à ma connaissance) par des retours en arrière lorsque l'on arrive à une situation bloquée: i.e. aucune valeur possible pour la prochaine case à remplir, compte tenu des valeurs déjà existantes pour les autres cases.

    Hors, l'algorithme de Crymfox ne prend en aucun cas compte de ces blocages. Une fois une situation de blocage atteinte (ce qui arrive très souvent), son programme boucle alors indéfiniment: car il se contente juste d'essayer -potentiellement- toutes les valeurs (de 1 à 9).

    Quelques liens concernant le Sudoku sur ce forum:
    - un défi en Delphi: http://delphi.developpez.com/defi/de...sudoku-solver/
    - un descriptif de solution (manifestement issu de ce défi): http://fsoriano.developpez.com/defis...sudoku-solver/

  15. #15
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par FChrisF Voir le message
    ...
    Hors, l'algorithme de Crymfox ne prend en aucun cas compte de ces blocages.
    ...
    ça me parait bien ça en effet ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  16. #16
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci a tous.. j'ai déja découvert mon problème (blocage, boucle infinie..) même avant de lire vos réponses en placant ces lignes en oranger :p :
    Nom : Sans titre3.png
Affichages : 1676
Taille : 181,7 Ko
    donc on vois ici qu'il manque le 1,7 et 9 dans la 5ème colonne et qu'il existent déja dans la 7ème ligne .. c pour ça le programme se bloque.. x)
    en faite je vais essayer de remplir correctement la matrice d'une autre manière.. :p
    et merci une autre fois..

  17. #17
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bon voici mon code à l'ancienne Crymfox ;-)
    je n'ai pas réussi à modifier ton algorithme et gérer les box 3*3
    Ce programme prévoit l'imprévisible et il trouve de temps en temps des grilles sudoku
    Maintenant il est sans doute perfectible ... c'est juste pour dire, voir les commentaires pour les explications
    et cerise sur le gâteau j'ai laissé un GOTO

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    program sudoku9;
    const
        randomlim = 100;
        bouclemax = 10000;
    type
      Ms = array [1..9, 1..9] of string[1];  // Matrice 9 * 9
      Tab = array [1..2*9] of string[1];
      // Tab : pour une intersection ligne/colonne de la position courante
      // et stockage de toutes les valeurs présentes (ligne + colonne)
      Posx = array [1..9] of integer; // table des compteurs colonnes
      Sstr = string[1];
    var
      i, j, bp ,bs: integer; // bp : indic colonne et bs : indic ligne
      compt:longint;
      ch : string[1];
      trouve, indic ,nb,noway : boolean;
      m: Ms;
      pos:Posx;
      nboucle:longint; // Nombre de tentative
    label deb;
     
    procedure affichCont (m :Ms; pos:PosX);    // Affichage matrice
    var i, j :integer;
    begin
      for j := 1 to 9 do
          begin
            for i := 1 to 8 do
              write(m[i,j],' ');
            writeln(m[9,j],' ');
          end;
      writeln('---------');
      for i := 1 to 8 do
          write(pos[i],' ');
      writeln(pos[9],' ');
      writeln('---------');
    end;
    procedure init (var m :Ms; var pos:Posx); // Remplissage matrice '*'
    var i, j :integer;
    begin
        for i := 1 to 9 do
        begin
          for j := 1 to 9 do
              m[i,j] := '*';
          pos[i]:=0;
        end;
    end;
    function norandom (m:Ms):Sstr;
    // si on n'arrive pas à trouver une valeur
    // par la fonction random alors on passe en recherche 'manuelle'
    var i : integer ;
      ch:string[1];
      sauveur:boolean;
      var t:tab;
    begin
      sauveur:=false;
      For i:=1 to 9 do
        t[i] := M[i, bs] ;   // Stockage des valeurs lignes
      For i:=1 to 9 do
        t[9+i] := M[bp, i];  // Ajout des valeurs colonnes
      i:=0       ;
      while ((i < 9) and (not sauveur)) do
        begin
          i:=i+1 ;
          sauveur:=true;
          str(i, ch);
          for j:=1 to 2*9 do  // nbre de ligne + nbre de colonne
              begin
                 if (t[j] = ch) then
                     sauveur := false;
               end;
        end;
        if sauveur then
              norandom :=ch
        else norandom :=''; // Impasse
    end;
     
    begin
      nboucle:=0;
      deb:
      nboucle:=nboucle+1;
      writeln('Nombre essai->',nboucle);
      randomize;
      init(m,pos);
      bp:=0;
      noway:=false;
      while ((bp < 9) and (not noway)) do
          begin
          bp:=bp+1;
          bs:=0;
          while ((bs < 9) and (not noway)) do
            begin
              bs:=bs+1;
              compt:=0;
              indic := false;
              while ((compt < randomlim) and (not indic)) do
                begin
                  compt:=compt + 1;
                  str(random(9) + 1, ch);
                  i:=0;
                  trouve:=false;
                  while ((i < bp) and (not trouve)) do
                    begin
                      i:=i+1;
                      if (ch = M[i, bs]) then trouve:=true;
                    end;
                  j:=0;
                  while ((j < bs) and (not trouve)) do
                    begin
                      j:=j+1;
                      if (ch = M[bp, j]) then trouve:=true;
                    end;
                  if not trouve then
                     begin
                       M[bp, bs] := ch ;
                       pos[bp] := bs;
                       indic:=true;
                       // Ma matrice 9 * 9 est remplie
                       if ((bp = bs) and (bp = 9)) then
                           noway:=true;
     
                     end;
                end;
                if (not indic) then
                   begin
                     // Le random ne marche pas alors recherche 'manuelle'
                     ch:=norandom(m);
                     if ( ch <> '') then
                         begin
                           // Recherche 'manuelle' OK
                           M[bp, bs] := ch ;
                           pos[bp] := bs;
                           indic:=true;
                         end
                      else
                           begin
                             noway:=true;
                           end;
                    end;
     
     
            end;
          end;
      trouve:=false;
     
      for i:=1 to 9 do
             if (pos[i] <> 9) then trouve:=true;
      if ((trouve = false) or (nboucle > 10000)) then
          begin
            if not trouve then
                writeln('SUDOKU COMPLETE avec ',nboucle,' ESSAIS et en niveau RANDOM:',randomlim)
            else
               begin
                  writeln('SUDOKU INCOMPLETE avec ',nboucle,' ESSAIS et en niveau RANDOM:',randomlim);
                  writeln('UNLUCKY : Relancer ou changer le nombre d''essais ou niveau random ...');
               end;
               affichCont(m,pos);
            readln;
     
          end
      else goto deb;
    end.
    Nom : Capture.JPG
Affichages : 1394
Taille : 20,7 Ko
    Nom : Capture1.JPG
Affichages : 1295
Taille : 16,9 Ko

    Allez je vais faire un tour de vélo ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  18. #18
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Il semble que c une bonne idée.. une grande MERCI pour vous , mais malheureusement je trouve des difficultés à comprendre le code car je n'ai pas encore étudier les sous-programmes.. . en plus que ça quand j'essaye d'exécuter votre programme ça me donne une message d'erreur Runtime comme ce ci :
    Nom : Sans titre4.png
Affichages : 1509
Taille : 225,5 Ko

  19. #19
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    En fait je viens de relire à l'instant la règle du sudoku
    auquel je ne joue pas et je lis ceci
    "
    Un sudoku classique contient neuf lignes et neuf colonnes, donc 81 cases au total. Le but du jeu est de remplir ces cases avec des chiffres allant de 1 à 9 en veillant toujours
    à ce qu'un même chiffre ne figure qu'une seule fois par colonne, une seule fois par ligne, et une seule fois par carré de neuf cases."

    Et ceci
    =>
    "une seule fois par carré de neuf cases", je ne m'en suis pas préoccupé et c'est seulement maintenant que je fais le lien avec les fameuses box 3*3

    donc oublie cette version de programme, elle génère des sudoku "non conforme"

    [EDIT] J'utilise Lazarus 1.6.2 pour tester ce programme en Pascal
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  20. #20
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Code modifié pour avoir une vraie grille de sudoku,
    bon à tester ...

    [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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    program sudoku9;
    const
        randomlim = 100;
        bouclemax = 10000;
    type
      Ms = array [1..9, 1..9] of string[1];  // Matrice 9 * 9
      Tab = array [1..2*9] of string[1];
      // Tab : pour une intersection ligne/colonne de la position courante
      // et stockage de toutes les valeurs présentes (ligne + colonne)
      Posx = array [1..9] of integer; // table des compteurs colonnes
      Sstr = string[1];
    var
      i, j, bp ,bs: integer; // bp : indic colonne et bs : indic ligne
      compt:longint;
      ch : Sstr;
      trouve, indic ,nb,noway : boolean;
      m: Ms;
      pos:Posx;
      nboucle:longint; // Nombre de tentative
    label deb;
    
    procedure affichCont (m :Ms; pos:PosX);    // Affichage matrice
    var i, j :integer;
    begin
      for j := 1 to 9 do
          begin
            for i := 1 to 8 do
              write(m[i,j],' ');
            writeln(m[9,j],' ');
          end;
      writeln('---------');
      for i := 1 to 8 do
          write(pos[i],' ');
      writeln(pos[9],' ');
      writeln('---------');
    end;
    procedure init (var m :Ms; var pos:Posx); // Remplissage matrice '*'
    var i, j :integer;
    begin
        for i := 1 to 9 do
        begin
          for j := 1 to 9 do
              m[i,j] := '*';
          pos[i]:=0;
        end;
    end;
    function norandom (m:Ms):Sstr;
    // si on n'arrive pas à trouver une valeur
    // par la fonction random alors on passe en recherche 'manuelle'
    var i : integer ;
      ch:string[1];
      sauveur:boolean;
      var t:tab;
    begin
      sauveur:=false;
      For i:=1 to 9 do
        t[i] := M[i, bs] ;   // Stockage des valeurs lignes
      For i:=1 to 9 do
        t[9+i] := M[bp, i];  // Ajout des valeurs colonnes
      i:=0       ;
      while ((i < 9) and (not sauveur)) do
        begin
          i:=i+1 ;
          sauveur:=true;
          str(i, ch);
          for j:=1 to 2*9 do  // nbre de ligne + nbre de colonne
              begin
                 if (t[j] = ch) then
                     sauveur := false;
               end;
        end;
        if sauveur then
              norandom :=ch
        else norandom :=''; // Impasse
    end;
    function box33 (bp:integer;bs:integer;ch:Sstr):boolean;
    var i,j,bp1, bp2, bs1, bS2 : integer;
    
    begin
        box33:= false;
        if bp in [1..3] then
           begin
             bp1 := 1;bp2 := 3;
           end
        else if bp in [4..6] then
          begin
             bp1 := 4;bp2 := 6;
          end
        else
          begin
            bp1 := 7;bp2 := 9;
          end;
        if bs in [1..3] then
           begin
             bs1 := 1;bs2 := 3;
           end
        else if bs in [4..6] then
          begin
             bs1 := 4;bs2 := 6;
          end
        else
          begin
            bs1 := 7;bs2 := 9;
          end;
        for i := bp1 to bp2 do
            for j := bs1 to bs2 do
              begin
                if ch = M[i, j] then box33:= true;
              end;
    
    end;
    
    begin
      nboucle:=0;
      deb:
      nboucle:=nboucle+1;
      writeln('Nombre essai->',nboucle);
      randomize;
      init(m,pos);
      bp:=0;
      noway:=false;
      while ((bp < 9) and (not noway)) do
          begin
          bp:=bp+1;
          bs:=0;
          while ((bs < 9) and (not noway)) do
            begin
              bs:=bs+1;
              compt:=0;
              indic := false;
              while ((compt < randomlim) and (not indic)) do
                begin
                  compt:=compt + 1;
                  str(random(9) + 1, ch);
                  i:=0;
                  trouve:=false;
                  while ((i < bp) and (not trouve)) do
                    begin
                      i:=i+1;
                      if (ch = M[i, bs]) then trouve:=true;
                    end;
                  j:=0;
                  while ((j < bs) and (not trouve)) do
                    begin
                      j:=j+1;
                      if (ch = M[bp, j]) then trouve:=true;
                    end;
                  if not trouve then
                     if box33(bp,bs,ch) then
                        trouve:=true;
    
                  if not trouve then
                     begin
                       M[bp, bs] := ch ;
                       pos[bp] := bs;
                       indic:=true;
                       // Ma matrice 9 * 9 est remplie
                       if ((bp = bs) and (bp = 9)) then
                           noway:=true;
    
                     end;
                end;
                if (not indic) then
                   begin
                     // Le random ne marche pas alors recherche 'manuelle'
                     ch:=norandom(m);
                     if ( ch <> '') then
                         begin
                           // Recherche 'manuelle' OK
                           M[bp, bs] := ch ;
                           pos[bp] := bs;
                           indic:=true;
                         end
                      else
                           begin
                             noway:=true;
                           end;
                    end;
    
    
            end;
          end;
      trouve:=false;
    
      for i:=1 to 9 do
             if (pos[i] <> 9) then trouve:=true;
      if ((trouve = false) or (nboucle > 10000)) then
          begin
            if not trouve then
                writeln('SUDOKU COMPLETE avec ',nboucle,' ESSAIS et en niveau RANDOM:',randomlim)
            else
               begin
                  writeln('SUDOKU INCOMPLETE avec ',nboucle,' ESSAIS et en niveau RANDOM:',randomlim);
                  writeln('UNLUCKY : Relancer ou changer le nombre d''essais ou niveau random ...');
               end;
               affichCont(m,pos);
            readln;
    
          end
      else goto deb;
    end.
    Nom : Capture.JPG
Affichages : 1304
Taille : 16,8 Ko

    Pour l'algorithme
    Je prends un chiffre aléatoire en position (i,j), et je vérifie s'il n'apparait pas entre 1 et i en colonne et 1 et j en ligne,
    si c'est bon je vérifie dans ma box 3*3 s'il n'apparait pas non plus
    Si ça n'est pas le cas, je reboucle dans une certaine limite ici 100
    Si ça n'est toujours pas le cas je parcours les chiffres de 1 à 9 pour en trouver un qui convienne (partie "manuelle")
    Si aucun chiffre ne convient c'est que ma grille est bloquée donc je relance tout mon programme dans la limite de 10000 essais

    Pour les procédures et fonctions, c'est des bouts de programmes que l'on peut réutiliser, pour la clarté et réutilisation du code ... maintenant
    en jetant un coup d'oeil on peut s'y retrouver par exemple la fonction box33 qui renvoie un VRAI ou FAUX selon que le chiffre a été trouvé ou non dans la box 3*3 en cours
    Images attachées Images attachées  
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 15
    Dernier message: 20/04/2015, 19h58
  2. Jeu du Sudoku
    Par Hero13 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 06/10/2014, 11h07
  3. Interface graphique pour jeu de Sudoku
    Par Stradithehutt dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 01/11/2006, 11h43

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