[c]generateur de sudoku [terminal]

Contenu du snippet

Il s'agit d'un générateur de grille de sudoku!
Programmé de manière inédite et beaucoup plus facile que celles que j'ai déjà vu...
Simple affichage des nombres pour assurer la probabilité du code.
Ou affichage complexifier pour système Unix avec couleurs... (enlevez les /**/)
Un mode jeux est en cours mais limitera le caractère portable de ce code (mode raw)

Source / Exemple :


/* Generateur de grille de SudoKu
     by Van der Elst, Olivier*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NbrHole 25
static void init(void);
static void aff(void);
static int GSDK[9][9][3];
int main(void)
{
	srand((unsigned)time(NULL));
	init();
	aff();
	return 0;
}
void init(void)
{
	int i, j, k, l;
	int region[9];
	
	int cond;
	for(j=0;j<=8;j++)
	{
		k=(rand()%9)+1;
		cond=1;
		while(cond)
		{
			cond=0;
			for(i=0;i<=8;i++) if(region[i]==k) cond=1;
			if(cond)
			{
				k++;
				if(k==10) k=1;
			}
		}
		region[j]=k;
	}
	
	j=0;
	l=0;
	while(j!=9)
	{
		k=j;
		for(i=0;i<=8;i++)
		{
			GSDK[i][l][0]=region[k];
			k++;
			if(k>8) k=k-9;
		}
		l++;
		switch(j)
		{
			case 0 : j=3; break;
			case 3 : j=6; break;
			case 6 : j=7; break;
			case 7 : j=1; break;
			case 1 : j=4; break;
			case 4 : j=5; break;
			case 5 : j=8; break;
			case 8 : j=2; break;
			case 2 : j=9; break;
		}
	}
	
	i=0;			//mix col dans reg
	j=(rand()%2)+1;
	for(k=0;k<=8;k++)
	{
		if(k==3||k==6) j=rand()%3;
		switch(k)
		{
			case 0 : 
			case 1 :
			case 2 : region[i]=j; break;
			case 3 : 
			case 4 :
			case 5 : region[i]=j+3; break;
			case 6 : 
			case 7 :
			case 8 : region[i]=j+6; break;
		}
		j++;
		i++;
		if(j==3) j=0;
	}
	
	int temp[9][9];
	for(i=0;i<=8;i++)
	{
		for(j=0;j<=8;j++)
		{
			k=region[i];
			temp[i][j]=GSDK[k][j][0];
		}
	}
	
	k=6;
	i=0;
	while(k!=9)
	{
		for(j=0;j<=8;j++)
		{
			GSDK[i][j][1]=temp[k][j];
			GSDK[i+1][j][1]=temp[k+1][j];
			GSDK[i+2][j][1]=temp[k+2][j];
		}
		switch(k)
		{
			case 6 : k=0; i=3; break;
			case 0 : k=3; i=6; break;
			case 3 : k=9; break;
		}
	}
	
	int masking[9][9];
	for(i=0;i<=8;i++)
        {
                for(j=0;j<=8;j++)
                {
                        masking[i][j]=0;
                }
        }
	for(i=0;i<NbrHole;i++)
	{
		do
			{
				k=rand()%9;
				l=rand()%9;
			}
		while(masking[k][l]);
		masking[k][l]=1;
	}
	for(i=0;i<=8;i++)
		for(j=0;j<=8;j++) 
		{
			if(!masking[i][j]) GSDK[i][j][2]=GSDK[i][j][1];
			else GSDK[i][j][2]=0;
		}
}
void aff(void)
{
	int i, j;
	for(i=0;i<=8;i++)
	{
		for(j=0;j<=8;j++)
		{
			if(GSDK[i][j][2]!=0) printf("%2d", GSDK[i][j][2]);
			else printf("  ");
		}
		printf("\n");
	}
}
/*void aff(void)
{
	#define Lo 9
	#define La 9
	#define RaZ "\e[2J\e[;H"
	#define ClearCol "\e[00m"
	#define Gg "\e[00;1;33m"
	#define Gb "\e[00;31m"
	#define Jg "\e[00;32m"
	#define Jb "\e[00;34m"
	#define GoToYX "\e[%u;%uH"
	
	int i, j;
	printf(RaZ);
	for (j=1;j<=Lo;j++)
	{
		if(j==4||j==7) printf(Gg);
		else printf(Gb);
		printf("+");
		for(i=1;i<=La;i++) 
		{
			printf("---");
			if(i==3||i==6||j==4||j==7) printf(Gg"+");
			else printf(Gb"+");
			if(j==4||j==7) printf(Gg);
		        else printf(Gb);
		}
		printf("\n");
		printf(Gb);
		printf("|");
		for(i=1;i<=La;i++) 
		{
			printf("   ");
			if(i==3||i==6) printf(Gg"|"Gb);
			else printf(Gb"|");
			printf(Gb);
		}
		printf("\n");
	}
	printf("+");
	for(i=1;i<=La;i++) 
	{
		printf("---");
		if(i==3||i==6) printf(Gg"+");
		else printf(Gb"+");
		printf(Gb);
	}
	
	for(j=0;j<=8;j++)
		for(i=0;i<=8;i++)
		{
			printf(GoToYX,(j+1)*2,((i+1)*4)-1);
			switch(i)
			{
				case 0 :
				case 1 :
				case 2 : switch(j)
					{
						case 0 :
						case 1 :
						case 2 : printf(Jg); break;
						case 3 :
						case 4 :
						case 5 : printf(Jb); break;
						case 6 :
						case 7 :
						case 8 : printf(Jg); break;
					}
					break;
				case 3 :
				case 4 :
				case 5 : switch(j)
					{
						case 0 :
						case 1 :
						case 2 : printf(Jb); break;
						case 3 :
						case 4 :
						case 5 : printf(Jg); break;
						case 6 :
						case 7 :
						case 8 : printf(Jb); break;
					}
					break;
				case 6 :
				case 7 :
				case 8 : switch(j)
					{
						case 0 :
						case 1 :
						case 2 : printf(Jg); break;
						case 3 :
						case 4 :
						case 5 : printf(Jb); break;
						case 6 :
						case 7 :
						case 8 : printf(Jg); break;
					}
					break;
			}
			if(GSDK[i][j][2]!=0) printf("%d", GSDK[i][j][2]);
		}
	
	
	printf(GoToYX,(j+1)*2,1);
	printf(ClearCol);
}*/

Conclusion :


fonctionnement :
1ère dimension : créer une grille jouable de sudoku à partir d'une ligne dont chaque nombre tiré au "hasard" est unique (10>x>0)
2ème dimension : mélange des différentes lignes (et/ou) des régions par tirage au sort
3ème dimension : masquage toujours en utilisant un tableau tiré dont les éléments sont 1 (mask) 0 (nomask)

J'èpère pouvoir aider avec cette façon simple de creation de grille...

Je remercie mon grand-père pour m'avoir donné cette idée!

je suis débutant c'est mon premier programme en C

N'hésitez pas, je suis ouvert aux critiques constructives et je ne demande qu'a apprendre...

A voir également

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.

Du même auteur (blackdead08)