Sudokid, c'est un sudoku avec seulement 16 cases.

Description

C'est le célèbre jeu du sudoku, mais avec un peu moins de case (16 cases à la place de 81).
- Sudoku1.0.cpp : il permet de creer des grilles pleines.
- Sudoku1.1.cpp : il permet de creer des grilles à remplir + leurs solutions.

Source / Exemple :


#include <iostream>
#include <vector>

using namespace std;

int getint()
	{
	for(;;)
		{
		int valeur;
		cin >> valeur;
		if(cin.fail())
			{
			cin.clear();
			string inutile;
			getline(cin, inutile);
			cout <<"\nCe n'etait pas un nombre entier, reessayer : \n";
			}
		else
			{
			return valeur;
			}
		}
	}
	
	
//---------------------------------------------------------------

vector <int> sudokid()
	{
	vector <int> grille;
	
/*erreurligne est là pour refaire la ligne entiere s'il y a un probleme*/

	int erreurligne(0);
	for(int i(0); i<16; i++)
		{

/*Attribution d'un nombre "provisoire à la case n°'i'*/

		int temp((rand()%4)+1);

/*Voir s'il est possible de mettre ce nombre à cette endroit*/
/*case (nommée lieu), ligne et colonne sont la pour repérer la case traité ('i') et savoir sur quelle case, ligne et colonne elle se trouve*/

		int ligne(0);
		int colonne(0);
		int lieu(0);

/*erreur est là pour vérifier s'il y a des erreurs, s'il y en a alors 'i' restera le même*/

		int erreur(0);

/*Recherche de la ligne et de la colonne où se trouve la case 'i'*/

		for(int lacolonne(0);lacolonne!=4;lacolonne++)
			{
			for(int laligne(0);laligne!=4;laligne++)
				{
				if(i==(laligne*4)+lacolonne)
					{
					ligne=laligne;
					colonne=lacolonne;
					}
				}
			}

/*Ligne et colonne ont été trouvés*/
/*Désormais, voir si la valeur donnée à cette case peut aller dans cette ligne et dans cette colonne*/

		for(int verif(0);verif!=4;verif++)
			{
			if((verif+(ligne*4))<i&&temp==grille[verif+(ligne*4)]) erreur=1;
			if((verif*4+colonne)<i&&temp==grille[verif*4+colonne]) erreur=1;
			}

/*Vérification de la ligne et de la colonne dont fait partie le point : ACHEVEE*/
/*Recherche de la case où est situé 'i'*/

		for(int x(1);x!=3;x++)
			{
			for(int y(1);y!=3;y++)
				{
				if((colonne<(x*2)&&colonne>(x-1)*2-1)&&(ligne<y*2&&ligne>(x-1)*2-1)) lieu=((x-1)+(y-1)*4)*2;
				}
			}

/*L'ordinateur regarde si le nombre se trouve déjà dans la case*/
/*La case en haut et celle à gauche ayant déjà été vérifiées, il vérifie la case en haut à gauche ou celle en haut à droite*/
/*Selon la position de la case 'i'*/

		if((i==lieu+5)&&(temp==grille[lieu])) erreur=1;
		if((i==lieu+4)&&(temp==grille[lieu+1])) erreur=1;

/*L'ordinateur regarde si des erreurs ont été révélées*/
/*Si c'est le cas il baisse 'i' (i--)*/

		if(erreur==1)
			{
			erreurligne++;
			if(erreurligne<10) i--;
			else
				{

/*S'il y a 10 erreur sur la meme case*/
/*Le programme recommence toute la ligne*/

				for(int efface(4);efface!=0;--efface)
					{
					if(i>efface+ligne*4) grille.erase(grille.begin()+efface+ligne*4);
					}
				i=ligne*4;
				}
			}
		else
			{
			grille.push_back(temp);
			erreurligne=0;
			}
		}
	return grille;
	}

//--------------------------------------------------------------

void affichagepleine(vector <int> grillesudokid)
	{
	for(int ligne(0);ligne!=4;++ligne)
		{
		for(int colonne(0);colonne!=4;++colonne)
			{
			if(ligne==2&&colonne==0) cout <<"\n----+----";
			if(colonne==0) cout <<'\n';
			if(colonne==2) cout <<"| ";
			cout <<grillesudokid[ligne*4+colonne]<<" ";
			}
		}
	}
	
	
//---------------------------------------------------------------

void fairegrille(vector <int> grille)
	{
	
/*L'ordinateur cherche les cases qu'il va afficher*/

	int x1(rand()%2);
	int y1(rand()%2);
	int x2=1-x1;
	int y2=1-y1;
	vector <int> casafficher;
	casafficher.push_back(x1+y1*4);
	casafficher.push_back(x1+y1*4+8);
	casafficher.push_back(x2+y2*4+2);
	casafficher.push_back(x2+y2*4+10);
	if(casafficher[1]==8||casafficher[1]==12) casafficher.push_back(casafficher[1]+1);
	else casafficher.push_back(casafficher[1]-1);
	
/*Puis, il vérifie si la grille est réalisable*/

	int nbdifferents(0);
	
/*Lorsqu'il n'y a que deux nombres différents (a affichés), il y a plusieurs possibilités de résolution*/
/*c'est pour ceci que j'ai ajouté "nbdifferents" (il compte le nombre de chiffre differents affichés)*/

	for(int e(0);e!=2;++e)
		{
		for(int f(2);f!=4;++f)
			{
			if((e!=f)&&(grille[casafficher[e]]==grille[casafficher[f]])) nbdifferents++;
			}
		}
		
/*Si le nombre de chiffres differents est egal a 2,*/
/*Ceci signifie que la grille a plusieurs possibilites de resolution*/
/*Donc, l'ordinateur ajoute d'autres cases*/
/*Afin, qu'il n'y est plus qu'une possibilite*/

		if(nbdifferents==2)
			{
			casafficher.push_back(casafficher[0]+4);
			casafficher.push_back(casafficher[1]+4);
			}
			
	for(int ligne(0);ligne!=4;++ligne)
		{
		for(int colonne(0);colonne!=4;++colonne)
			{
			int existe(0);
			for(int choix(0);choix!=casafficher.size();++choix) if(ligne*4+colonne==casafficher[choix]) ++existe;				
			if(ligne==2&&colonne==0) cout <<"\n----+----";
			if(colonne==0) cout <<'\n';
			if(colonne==2) cout <<"| ";
			if(existe!=0) cout <<grille[ligne*4+colonne]<<" ";
			else cout <<"_ ";
			}
		}
	}
	
	
//---------------------------------------------------------------	   

int main() {
srand((unsigned) time(NULL));
vector <int> grillesudokid;
for(int i(0);i!=2;) {
cout <<"\n\n\nSUDOKID 1.1";
cout <<"\n\n1 - Generer une nouvelle grille";
cout <<"\n2 - Quitter";
cout <<"\n\nVotre choix : ";
i=getint();
if(i==1) {
grillesudokid=sudokid();
fairegrille(grillesudokid);
cout <<"\n\n\nAppuyez sur Entree pour voir la grille resolue\n\n";
cin.get();
cin.get();
affichagepleine(grillesudokid);
}
}
cout <<"\n\n\nCree par Nicolas DUBIEN - 2006";
cin.get();
cin.get();
}

Conclusion :


Merci de me signaler tout probleme. ET SURTOUT, AMUSEZ-VOUS BIEN !

Codes Sources

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.