Jump to content

homemade sudoku generator

- - - - -

This topic has been archived. This means that you cannot reply to this topic.
3 replies to this topic

#1
mokszyk

mokszyk

    Learning Programmer

  • Members
  • PipPipPip
  • 33 posts
I paste my code for people who will need example of this in the future :) if i pasted in wrong site - so I'm so sorry, I am still learning and gaining experience.

//made by Mokrzycki M. with assist by T.B.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>


//           Autor: Mokrzycki Michal vel Mokszyk
//        Sudoku Generator, and then it hides some fields

struct sudoku { //nazwa struktury
int p;          //przechowuje liczby
int b;          //odpowiada za wyswietlanie/chowanie liczb w ukrytej tablicy

};
int sudoku(struct sudoku tablica[9][9],int x, int y){
//    printf("%d %d", x,y);
    int tab[9] = {1,1,1,1,1,1,1,1,1};//same jedynki
        int i,j;

    for(i=0;i<y;++i){//sprawdza x;sy
        tab[tablica[x][i].p-1]=0; //jesli jest to dajesz 0
    }

    for(i=0;i<x;++i){//sprawdza y'ki
        tab[tablica[i][y].p-1]=0; //jesli jest to to dajesz
    }

    for(i=(3*(x/3));i<(3*(x/3)+3);++i){ //znajduje pierwszy pjt w kwadracie, wpierw x
        for(j=(3*(y/3));j<y;++j){ //...potem y'k
            tab[tablica[i][j].p-1]=0; //sprawdza jaka liczba jest i wstawia 0 jesli nie mozna juz jej wstawić
        }
    }
    int n=0;
    for(i=0;i<9;++i){

    n=n+tab[i];//sprawdza wielkosc tablicy
    }

    int *tab2; //nowa tablica z rozmiarem n
    tab2=(int*)malloc(sizeof(int)*n);

    j=0; //bedzie potrzebny do wskazania punktu
    for(i=0;i<9;++i){
        if(tab[i]==1){
            tab2[j]=i+1;
            j++;
        }
    }

//    int los=rand()%n;//losuje indeks z tabliczy liczb
//    tablica[x][y]=tab2[los];//przypisuje do tablicy x y wylosowana liczbe z tab2 z indeksem [los]
//    tab2[los]=tab2[n-1]; //mam tab2 z liczbami i zmniejszam tablice o jeden
//                        //wylosowana liczbe  zabieramy, a ostatnia wstawiamy na jej miejsce
//    n--;//skrocenie tablicy

    int ny, nx;// odpowiadaja za pozycje

    if(x==8){
        ny=y+1; //wiekszamy y'k
        nx=0;   //zeruje x zeby przesunac na kolejny wiersz "potem"
    }
    else {
        ny=y; //bez zmian
        nx=x+1;//przesuwamy x w prawo
    }

//    int spr;
//    printf("\n\n\t\tnx %d, ny %d", nx, ny);
//    scanf("%d", &spr);

    while(n>0){
        int los=rand()%n;//losuje indeks z tabliczy liczb
        tablica[x][y].p=tab2[los];//przypisuje do tablicy x y wylosowana liczbe z tab2 z indeksem [los]
        tab2[los]=tab2[n-1]; //mam tab2 z liczbami i zmniejszam tablice o jeden

        n--;

        if(x==8 && y==8) {
            free(tab2); // unikam wycieku pamieci
            return 1;
        }

        if (sudoku(tablica,nx,ny)==1){
           free(tab2); // unikam wycieku pamieci
           return 1;
        } //jesli zwraca 1 to znaczy ze sie udalo to losuj kolejny raz  nowa

    }
    free(tab2); // unikam wycieku pamieci
    return 0;
}

int pokazt(struct sudoku tablica[9][9]){ //pokaz tablice w ktorej nie ukrylem cyfr, tablica prawidlowa
    int i=0,j=0;
    printf("\nP R A W I D L O W A  T A B L I C A\n\n");

    for(i=0;i<9;++i){
        for(j=0;j<9;++j){
        printf("%d ", tablica[i][j]);
        if(j==2 || j==5) printf("| ");
        if(i==2 && j==8 || i==5 && j==8) printf("\n- - - - - - - - - - -");

        }

        printf("\n");
    }
}


int ukryjl(struct sudoku tablica[9][9]){//funkcja ukrywa liczby
    int i=0,j=0;//zmienne potrzebne

    for(i=0;i<9;++i){//robie zeby ukryte pola byly zresetowane
        for(j=0;j<9;++j){
        tablica[i][j].b=0;
        }
    }

    for(i=0;i<28;++i){
    tablica[rand()%9][rand()%9].b=1;
    }
}

int wypisz(struct sudoku tablica[9][9]){
    int i=0,j=0;

    printf("U K R Y T A  T A B L I C A\n"
            "Gra polega na wstawieniu liczb od 1 do 9 w kazdym kwadracie\n"
            "tak aby zadna z liczb nie powtarzala sie ani w wierszu, ani w kolumnie,\nani w zadnym kwadracie.\n"
            "Wystarczy przepisac na kartke i zaczynamy gre :) Powodzenia!\n\n");
    for(i=0;i<9;++i){
        for(j=0;j<9;++j){
        if(tablica[i][j].b==0){
            printf(". ");
            } //nic nie ma
        else printf("%d ", tablica[i][j].p);
        if(j==2 || j==5) printf("| ");
        if(i==2 && j==8 || i==5 && j==8) printf("\n- - - - - - - - - - -");

        }
        printf("\n");
    }


}




int main(){
    srand(time(NULL));
    int i=0,j=0;
    struct sudoku tablica[9][9];//[x][y]
    sudoku(tablica,0,0);//pierwsze wywolanie
    ukryjl(tablica);
    wypisz(tablica);
    pokazt(tablica);

    //getch();
    return 0;
}

Edited by mokszyk, 23 November 2010 - 12:41 PM.

THink positive :)

#2
Mr.uNkn0wN

Mr.uNkn0wN

    Newbie

  • Members
  • Pip
  • 1 posts
lol..nice :D

#3
outsid3r

outsid3r

    Programming God

  • Members
  • PipPipPipPipPipPipPip
  • 623 posts
This post made me remember a sudoku game that i did a really long time ago, i searched for it in my computer and i have found it :D, but it wasn't completed, only generates a randomized field with max 40 numbers. I will post it here also :P (My experience at the time wasn't the best :P)

#define _CRT_RAND_S

#include <iostream>
#include <cstdlib>

using namespace std;

#define SIZE 9

int table[SIZE][SIZE];

typedef unsigned int uint32;

int get_rand();
void init_table();
void print_table();
void fill_table(int);
void rand_mark(int,int);

int main(){
	int num;
	init_table();

	while(true){
		cout << "Generate how many numbers (40 max)? ";
		cin >> num;

		if(num > 40 && num < 0){
			cout << "Invalid input" << endl;
		}
		else
			break;
	}

	cin.ignore();

	fill_table(num);
	print_table();

	cin.get();
}

int get_rand(){
	uint32 n;
	errno_t err;

	err = rand_s(&n);
	return uint32(double(n) / double(UINT_MAX) * 9.0) + 1;
}

void init_table(){
	for (int i=0; i<SIZE; i++){
		for (int j=0; j<SIZE; j++){
			table[i][j] = 0;
		}
	}
}

void print_table(){
	for (int i=0; i<SIZE; i++){
		for (int j=0; j<SIZE; j++){
			if (table[i][j] != 0) 
				cout << table[i][j] << "|";
			else
				cout << ' ' << "|";
		}
		cout << endl;
	}
}

void fill_table(int num){
	int x_pos;
	int y_pos;

	int counter = 0;

	while (counter < num){
		x_pos = get_rand() - 1;
		y_pos = get_rand() - 1;

		if (table[x_pos][y_pos] == 0){
			rand_mark(x_pos, y_pos);
			counter++;
		}
	}
}

void rand_mark(int x_pos, int y_pos){
	int r_num;
	bool exit = false;

	while (exit == false){
		exit = true;
		r_num = get_rand(); 

		for (int i=0; i<SIZE; i++)
			if (table[x_pos][i] == r_num || table[i][y_pos] == r_num){
				exit = false;
				break;
			}
	};

	table[x_pos][y_pos] = r_num;
}


#4
mokszyk

mokszyk

    Learning Programmer

  • Members
  • PipPipPip
  • 33 posts
quite specific as for beginning :P
THink positive :)