Sukudo solver avec des cases préremplies

Soyez le premier à donner votre avis sur cette source.

Vue 9 129 fois - Téléchargée 498 fois

Description

logiciel permet de trouver au moins une solution possible pour le jeu japonais sukudo avec des cases préremplées

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

John Dogget
Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
-
Le sukudo, ça existe pas, le sudoku par contre ...
Ensuite, à 2/3 bidouilles près, c'est exactement la même source que celle qui a été retiré du site.

Donc c'est toujours aussi maladroit :
- boucle à n'en plus finir
- structure de données pas adaptés
- l'ecriture du code n'est pas regulière

Il faudrait (simple conseil) :
- étudier mieux tes algos pour eviter d'utiliser des "goto" ou des boucles sur 20 lignes
- choisir des structures de données adaptés à ce que tu fais, dans ce cas l'utilisation de tableaux serait judicieuse (ça evite d'avoir des tonnes de variables, ça simplifie l'écriture du code etc)
- tu dois absolument te trouver une manière d'ecrire ton code proprement et regulièrement, si tu décides par exemple de l'indenter, tu devra le faire sur toute ta source et pas sur deux lignes
f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26 -
tu devrait commencer ici :

borland delphi style guide, ou tu vas apprendre a ecrire ton code correctement :

http://dn.codegear.com/article/10280

pour le reste, je ne saurai que trop te conseiller d'etudier d'autres sources, de lire des exemples, de faire des recherches sur le net pour apprendre les mecanismes et algorithmes.

deja, on peu voir que tu t'as totalement mis a coté de la plaque, puisqu'a aucun moment
on ne vois ceci :

TSudoku = array[0..8,0..8] of ...

qui est la base meme d'un jeu de sudoku (une grille 9,9)

ensuite, il est interdit de placer un goto dans une boucle qui renvois a l'exterieur de cette boucle. c'est inconcevable de voir cela.

de plus, 51 variables c'est trop! tableau tableau tableau et tableau!
plus simple a manipuler, plus propre.

logiquement un sudoku se presente donc comme cela :

{ la grille de sudoku }
type
TSudoku = array[0..8,0..8] of byte;


{ notre grille de jeu }
var
Sdk : TSudoku;


{ des grilles pour verifier le bon fonctionnement de nos fonctions de test }
const
{ Convertion du boolean }
BTC : array[boolean] of string = ('La grille est fausse','La grille est bonne');

{ Grille de test bonne }
SdkCheckTestTrue : TSudoku = ((1,2,3,4,5,6,7,8,9),
(7,8,9,1,2,3,4,5,6),
(4,5,6,7,8,9,1,2,3),
(9,1,2,3,4,5,6,7,8),
(6,7,8,9,1,2,3,4,5),
(3,4,5,6,7,8,9,1,2),
(8,9,1,2,3,4,5,6,7),
(5,6,7,8,9,1,2,3,4),
(2,3,4,5,6,7,8,9,1));
{ Grille de test fausse }
SdkCheckTestFalse : TSudoku = ((1,2,3,4,5,6,7,8,9),
(9,1,2,3,4,5,6,7,8),
(8,9,1,2,3,4,5,6,7),
(7,8,9,1,2,3,4,5,6),
(6,7,8,9,1,2,3,4,5),
(5,6,7,8,9,1,2,3,4),
(4,5,6,7,8,9,1,2,3),
(3,4,5,6,7,8,9,1,2),
(2,3,4,5,6,7,8,9,1));


{ verifie que la ligne a l'index donné comporte bien 1 a 9 sans doublons }
function CheckRow(const Sudoku : TSudoku; const index : integer) : boolean;
var N : integer;
S : set of byte;
begin
S := [];
result := true;
for N := 0 to 8 do
begin
result := result and (not (Sudoku[index,N] in S));
if result then
S := S + [Sudoku[index,N]]
else
exit;
end;
end;

{ verifie que la colone a l'index donné comporte bien 1 a 9 sans doublons }
function CheckCol(const Sudoku : TSudoku; const index : integer) : boolean;
var N : integer;
S : set of byte;
begin
S := [];
result := true;
for N := 0 to 8 do
begin
result := result and (not (Sudoku[N,Index] in S));
if result then
S := S + [Sudoku[N,Index]]
else
exit;
end;
end;

{ verifie que le bloc 3,3 a l'index donné comporte bien 1 a 9 sans doublons }
function CheckCub(const Sudoku : TSudoku; const index : integer) : boolean;
var X,Y : integer;
S : set of byte;
const
ITX : array[0..8] of byte = (0,3,6,0,3,6,0,3,6);
ITY : array[0..8] of byte = (0,0,0,3,3,3,6,6,6);
begin
S := [];
result := true;
for Y := ITY[Index] to ITY[Index]+2 do
for X := ITX[Index] to ITX[Index]+2 do
begin
result := result and (not (Sudoku[Y,X] in S));
if result then
S := S + [Sudoku[Y,X]]
else
exit;
end;
end;

{ Test des fonction avec la grille bonne }
procedure TForm1.Button1Click(Sender: TObject);
var N : integer;
B : boolean;
begin
B := true;
for N := 0 to 8 do
begin
B := B and CheckCol(SdkCheckTestTrue,N)
and CheckRow(SdkCheckTestTrue,N)
and CheckCub(SdkCheckTestTrue,N);
if not B then
break;
end;
Button1.Caption := BTC[B];
end;

{ test des fonction avec la grille fausse }
procedure TForm1.Button2Click(Sender: TObject);
var N : integer;
B : boolean;
begin
B := true;
for N := 0 to 8 do
begin
B := B and CheckCol(SdkCheckTestFalse,N)
and CheckRow(SdkCheckTestFalse,N)
and CheckCub(SdkCheckTestFalse,N);
if not B then
break;
end;
Button2.Caption := BTC[B];
end;


voila comment doit fonctionner un sudoku ...
Nicolas___
Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2 -
hé bien voila le voila notre sudoku , merci Foxi ;)

hé mihoubi ctrl+c, ctrl+v :)

Ciao
cs_Lassal
Messages postés
27
Date d'inscription
jeudi 7 novembre 2002
Statut
Membre
Dernière intervention
21 mai 2008
-
Que de variable... Pas super optimisé tout celà.
Et l'indentation, au secours.
Faudrait voir à faire un effort quand même par respect pour ceux qui regardent les sources.
Un minimum de commentaires, une indentation lisible.
Après en ce qui concerne le code, il y a pas mal de chose à faire pour faire un truc plus propre, mais justement ce site est aussi là pour ça, donc pas de souci de ce côté là.

Mais s'il te plait, fais un effort pour diffuser des sources plus lisible car c'est nawak là.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.