Ir ao conteúdo
  • Cadastre-se

ajuda função srand em C


Ir à solução Resolvido por Rafael Domingues Corrêa,

Posts recomendados

Olá amigos preciso de ajuda estou tentando preencher uma matriz 9x9 com srand numeros aleatorios.. só que nao estou conseguindo fazer que eles não se repitam a minha intenção é fazer um jogo chamado sudoku onde nao pode haver numeros repetidos na mesma linha e na mesma coluna e tb em matriz 3x3
segue abaixo o codigo em C
 
toda ajuda e bem vinda desde ja agradeço.
 
void gerador(int mat[M][M]) // vem a matriz de referencia do main M = Define 9{    int i,j,aux[M][M],l=0,k=0 ; //inicialização das variaveis    srand(time(NULL)); //gera os numeros aleatorios usando o relogio    printf("___________________________");//desenha    for(i=0; i<9; i++)    {        printf("\n");//vai de 0 ate 9 e quando i=1 ele quebra a linha para desenhar o quadro        for(j=0; j<9; j++)        {            mat[i][j] = rand() % 9+1; //recebe um numero de 0 a 9            aux[l][k] = mat[i][j];    printf("|%d|", mat[i][j]);//imprime a linha q foi preenchida            for(l=0; l<=i; /*o i vai testar so a linha q esta*/ l++)            {                for(k=0; k<9; k++)                {                    if(aux[l][k]== mat[i][j])                    {                        mat[i][j] = rand() % 9+1;                    }                }            }        }    }    printf("\n");printf("___________________________"); //desenha}

 

Link para o comentário
Compartilhar em outros sites

A ideia do sudoku pode ser mais simples do que você pensa.

Basta você criar um array não repetido e mover ele nos outros arrays

 

Array raiz e abaixo os valores correspondentes

[0][1][2][3][4][5][6][7][8]

 3  5  2  1  4  9  7  8  6

 

Basta você atribuir a mesma sequência a outros arrays a partir deste já feito

Abaixo o próximo array e ainda mais abaixo os valores correspondentes do array raiz

[0][1][2][3][4][5][6][7][8]

[3][4][5][6][7][8][0][1][2]

 

O próximo array receberá a sequencia ainda mais adiantada ou atrasada do array raiz

Abaixo o próximo array e ainda mais abaixo os valores correspondentes do array raiz

[0][1][2][3][4][5][6][7][8]

[1][2][3][4][5][6][7][8][0]

 

Pulando a série de vetores será possível criar uma possibilidade maior de jogos

Por exemplo, onde o array[4] recebe o array[0] antes do array[1].

Assim a sequência ficará mais confusa e dificultará para o jogador.

Lembrando que cada arrays não pode receber o array raiz no mesmo ponto inicial

 

Essa é a lógica para contruir o sudoku

Link para o comentário
Compartilhar em outros sites

  • Solução

Eu criei o código explicado para facilitar seu entendimento da lógica em C

#include <stdio.h> //Para entrada e saíd de dados#include <stdlib.h> //Para srand() e rand()#include <time.h> //Para time()void inicializaSudoku(int vet[9][9]) //Função global com parãmetro para um vetor 9x9{    int i, j, k, seek, //Varáveis de controle de loop    aux; //Variável que receberá o número aleatório a ser comparado    srand(time(NULL)); //Cria a semente dos números aleatórios    vet[0][0] = rand()%9 + 1; //Inicia o primeiro valor do vetor pois não precisa ser comparado    //Loop de preenchimento do vetor, usando variável de preenchimento    /** Cria o vetor raiz **/    for (i=1; i<9; i++) //Variável 'i' recebe 1 pois o primeiro valor já foi iniciado    {        aux = rand()%9 + 1; //Auxiliar recebe novo valor        j = 0; //Inicia a variável usada no loop para comparação        while(j<i) //Enquanto todo array não é comparado        {            if(aux == vet[0][j]) //Se valor de auxiliar for igual a um que já existe no vetor            {                aux = rand()%9 + 1; //Auxiliar recebe novo valor                j = 0; //Reinicia a comparação            }            else //Se for diferente            {                j++; //Passa para a próxima comparação            }        }        //Se chegar nesse ponto é porque todos os números são diferentes        vet[0][i] = aux; //Posição no vetor recebe o valor válido    }    //Você pode aproveitar a própria sequência raiz para contruir o jogo    for(i=1; i<9; i++)    {        //Não pode repetir a primeira sequência, então        if(vet[0][i]-1 <= 0)// Se o valor do ponto do vetor for igual a 0        {            aux = vet[0][0] - 1; //Recebe o valor do primeiro ponto do vetor        }        else //Se não        {            aux = vet[0][i] - 1; //Recebe o ponto do vetor analisado        }        /** Como você começará de um ponto  no meio do array será necessário        rebubiná-lo para completar as outras lacunas **/        seek = 0; //define a sequencia como não rebubinada        for(j=aux, k=0; j<9; j++, k++)        {            vet[i][k] = vet[0][j]; //Ponto nulo do vetor recebe uma posição aleatória pré indicada            if(!seek) //Se não rebubinado            {                if(j >= 8)                {                    j = -1; // 'j' recebe uma posição antes do início normal do array                    seek = 1; //Indica rebubinação                }            }            else // Se já rebubinado            {                if(j >= aux) // Se 'j' for igual à posição aleatória inicial                {                    j = 99; //Completa o array                }            }        }    }    return; //Encerra função}int main(){    int sudoku[9][9], //Há a necessidade de criar um vetor apropriado para a função    i, j;     inicializaSudoku(sudoku); //Para iniciar um vetor apropriado basta colocá-lo como parâmetro    //Para mostrar o vetor do sudoku    for(i=0; i<9; i++)    {        for(j=0; j<9; j++)        {            printf("[%i] ", sudoku[i][j]);        }        printf("\n");    }    return 0;}

Dê uma estudada na função. Falou, um abraço!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

guillherme_rangel, eu só me esqueci de citar uma coisa... será necessária mais uma função para verificar a presença de números repetidos em quadros 3x3 que deverá reposicionar os arrays para que fiquem de acordo com as regras do sudoku

 

Fica assim a função:

int quadrosOk(int vet[9][9]){    int i, j, k, l, m, //Controle de loop para alinhar região    c_x, c_y, //Controle de loop de regiões lidas    n, o, //Controle de loop de comparação de quadros    vet_aux[9]; //Vetor onde um quadro será alinhado    k = 0; //Iniciliza controladores de loop    l = 0;    m = 0;    for(c_x=0, c_y=0; c_x<3 && c_y<3; ) //Enquanto não checa todas as regiões    {        for(i=k; i<k+3; i++)        {            for(j=l; j<l+3; j++)            {                vet_aux[m] = vet[i][j]; //Alinha um quadro em um único arrray                m++;            }        }        for(n=0; n<9; n++)        {            for(o=0; o<9; o++)            {                if(n != o) //Isso é necessário para não comparar um item com ele mesmo                {                    if(vet_aux[n] == vet_aux[o]) //Se números iguais no vetor                    {                        return 0; //Retorna falso                    }                }            }        }        //Navegando nas regiões do vetor do sudoku        if(c_x < 2)        {            c_x++;            l = l + 3;        }        else        {            c_x = 0;            c_y++;            l = 0;            k = k + 3;        }        m = 0;    }        //Se nenhum número igual for achado retorna verdadeiro    return 1;}

Por obrigação será necessário implementar em main() ou outra função do programa

do //Faça{    inicializaSudoku(sudoku); //Para iniciar um vetor apropriado basta colocá-lo como parâmetro} while(!quadrosOk(sudoku)); //Enquanto ouver números repetidos nas regiões

Para fazer com que o programa consulte mais vetores por segundo seria melhor substituir

srand(time());

por

srand(clock());

onde time() consulta o tempo em segundos e clock() em milisegundos.

 

Falou, um abraço, meu jovem.

Link para o comentário
Compartilhar em outros sites

Rafael Domingues Corrêa exatamente isso que estava verificando nesse exato momento...

mais desde ja agradeço pela sua atenção fico show de bola e muito bem explicado perfeito parabéns!!

vou estudar o codigo acima e farei a função para comparar 3x3

 

esclareceu todas as duvidas que eu tinha obrigado   :)

 

após eu concluir o jogo postarei o codigo completo para mostrar como ficou  ^_^

Link para o comentário
Compartilhar em outros sites

  • mês depois...

olá a todos primeiro gostaria de agradecer a todos pela ajuda...  fiz o Sudoku e ficou excelente, tirei 10 no projeto hahaha para quem tem alguma duvida segue abaixo o codigo completo de como ficou ta bem explicado... confesso que tem 2 bugzinhos...mais é difícil de perceber

valeu

 

http://pastebin.com/Y5H7APQF#include <stdio.h>#include <stdlib.h>#include <time.h>//#include <windows.h> #define M 9 //define o tamanho da matriz//cabeçalhovoid carregarjogo(int mat[M][M], int aux[M][M]);void salvarjogo(int mat[M][M], int aux[M][M]);void painel(int mat[M][M], int aux[M][M]);void gerador(int mat[M][M], int aux[M][M]);void carregarjogo(int mat[M][M], int aux[M][M]);void gerazero(int mat[M][M],int aux[M][M]);void jogadas (int mat[M][M], int aux[M][M]);void cronometro(int mat[M][M],int aux[M][M]);void nivel(int mat[M][M], int aux[M][M]);void gerazerofacil(int mat[M][M], int aux[M][M]);void gerazeromedio(int mat[M][M], int aux[M][M]);void gerazerodificil(int mat[M][M], int aux[M][M]);  void nivel(int mat[M][M], int aux[M][M]){    int op,x=0;printf("\n\t\t\t  @[member=@@@] @  @ @@@   @[member=@@@] @  @ @  @\n\t\t\t  @    @  @ @  @  @  @ @ @  @  @\n\t\t\t  @[member=@@@] @  @ @   @ @  @ @@   @  @\n\t\t\t     @ @  @ @  @  @  @ @ @  @  @\n\t\t\t  @[member=@@@] @[member=@@@] @@@   @[member=@@@] @  @ @[member=@@@]\n\n \a");     printf("\n\n\t\t\tSelecione o nivel de dificuldade\n\n\n\n");    printf("\t1-Facil \t 2-Medio \t 3-Dificil\t 4-Aleatorio\t\t\n\n");     scanf("%d", &op);while(x==0){    fflush(stdin);        if(op == 1)    {        x=1;        gerazerofacil(mat,aux);     }    else if(op == 2)    {    x=1;    gerazeromedio(mat,aux);    }    else if(op == 3)    {        x=1;    gerazerodificil(mat,aux);    }    else if(op == 4)    {    srand(time(NULL)); //semeando o rand    op=rand()%3+1; // x vai receber 1 numero aleatoria entre 1 e 9    x=0;    }     }    system("cls");} void carregarjogo(int mat[M][M], int aux[M][M]){    int i, j;    FILE *file;    file = fopen("sudoku.txt", "r");    if(file == NULL) // se o arquivo nao existir ele avisa o usuario e encerra    {        system("cls") || ("clear");        printf("O Arquivo nao pode ser aberto\n");        system("pause");        exit(0);      }else{     for(i=0; i<9; i++)    {        for(j=0; j<9; j++) // se nao ele le o endereço de aux        {            fscanf(file, "%d" ,&aux[i][j]);         }    }     }     file = fopen("resolucao.txt", "r");    if(file == NULL) // se o arquivo nao existir ele avisa o usuario e encerra    {        system("cls") || ("clear");        printf("O Arquivo nao pode ser aberto\n");        system("pause");        exit(0);      }else{     for(i=0; i<9; i++)    {        for(j=0; j<9; j++) // se nao ele le o endereço de aux        {            fscanf(file, "%d" ,&mat[i][j]);         }    }    fclose(file);    jogadas(mat,aux);     }}  void salvarjogo(int mat[M][M], int aux[M][M]){    int i, j;    FILE *file;    file = fopen("sudoku.txt", "w");    for(i=0; i<9; i++){        for(j=0; j<9; j++){                fprintf(file,"%d ",aux[i][j]); // na aux é onde ta a matriz ja preenchida com os zeros         }    }      file = fopen("resolucao.txt", "w");    for(i=0; i<9; i++){        for(j=0; j<9; j++){                fprintf(file,"%d ",mat[i][j]); // na aux é onde ta a matriz ja preenchida com os zeros         }    }      fclose(file); // fecha o arquivo    system("cls") || ("clear");    printf("   @ @[member=@@@] @[member=@@@] @[member=@@@]  @[member=@@@]  @@  @    @    @ @[member=@@@]  @@\n   @ @  @ @    @  @  @    @  @ @    @    @ @  @  @@\n   @ @  @ @ @@ @  @  @[member=@@@] @[member=@@@] @     @  @  @  @  @@\n   @ @  @ @  @ @  @     @ @  @ @     @  @  @  @    \n@@@  @[member=@@@] @[member=@@@] @[member=@@@]  @[member=@@@] @  @ @[member=@@@]   @@   @[member=@@@]  @@\n                                                   \n                     @[member=@@@]@@                        \n                   @@      @@                      \n                  @   @  @   @                     \n                  @          @                     \n                  @  @    @  @                     \n                  @   @[member=@@@]   @                     \n                   @        @                      \n                    @[member=@[member="@@@]@@"]@                       \n\n\n");    system("pause");jogadas(mat,aux);}   void painel(int mat[M][M], int aux[M][M]){    int op=0,sair=9;     system("cls") || ("clear");    printf("\n\t\t@[member=@@@] @  @ @@@   @[member=@@@] @  @ @  @\n\t\t@    @  @ @  @  @  @ @ @  @  @\n\t\t@[member=@@@] @  @ @   @ @  @ @@   @  @\n\t\t   @ @  @ @  @  @  @ @ @  @  @\n\t\t@[member=@@@] @[member=@@@] @@@   @[member=@@@] @  @ @[member=@@@]\n\n\n\n\n \a");     printf("\tDigite a opcao desejada\n\n");    printf("\t1 - Novo Jogo!\n");    printf("\t2 - Carregar jogo salvo!\n");    printf("\t3 - Regras do jogo e como jogar\n");    printf("\t4 - Sair\n"); while((op != 1) && (op != 2) && (op != 3) && (op != 4)) // aqui enquando nao for digitado uma dessas opções ele vai ficar lendo e dando comando invalido{     scanf(" %d", &op);fflush(stdin); // isso limpa o buffer   }     switch (op)    {    case 1:        // aqui chama o gerador        system("cls") || ("clear");        gerador(mat , aux);        break;     case 2:        carregarjogo(mat,aux); // a matriz aux recebe os valores lidos da função evai para jogadas        system("cls") || ("clear");        jogadas(mat,aux);          break;     case 3:        system("cls") || ("clear");        printf("\n\n");        printf("\t\t\t\tComo jogar Sudoku.\n\n\t O objetivo do Sudoku e preencher uma grade de 9x9 com numeros,\n\t de forma que cada linha, coluna e secao de 3x3 contenham os\n\t numeros de 1 a 9. No início do jogo, alguns quadrados  da \n\t grade de 9x9 estarao preenchidos. Sua tarefa e usar a logica\n\t para preencher os numeros que faltam e completar a grade.\n\n\n\n\n \t\t\t\tIMPORTANTE!!\n\n\n \t\tPara sair do jogo a qualquer momento\n\t\t digite 10 para salvar o jogo digite 99\n\t\t e para resolucao do sudoku digite 50. ");        printf("\n\n\n\n");        system("pause");        painel(mat,aux);         system("cls") || ("clear");         break;     case 4:        system("cls") || ("clear");        printf("Deseja realmente sair?\n\n");        printf("Digite 1 para sim 2 para nao...\n");        while((sair != 1) && (sair != 2)) //enquanto nao for 1 ou 2 vai ficar rodando o programa        {            scanf("%d", &sair);            fflush(stdin); // isso limpa o buffer (windows)            //__fpurge(stdin); limpa o buffer se for linux            if(sair == 1)//se for digitado 1 sai do programa            {                system("cls") || ("clear"); //limpa a tela                printf("\n\n\n\n");                printf("  @[member=@@@]@@    @@@   @[member=@@@] @[member=@@@]@ @@@ @[member=@@@]@ @[member=@@@]@ @@@ @   @    @[member=@@@]@@  \n @[member=@[member="@@@]@@"]@   @  @  @    @      @  @       @    @  @   @   @[member=@[member="@@@]@@"]@ \n@  @[member=@@@]  @  @   @ @[member=@@@] @      @  @       @    @  @   @  @  @[member=@@@]  @\n@[member=@[member="@@@]@@"]@@@  @   @ @    @[member=@@@]@  @  @[member=@@@]@   @    @  @   @  @[member=@[member="@@@]@@"]@@@\n   @[member=@@@]     @  @  @        @  @      @   @    @  @   @     @[member=@@@]   \n   ||||         @@@   @[member=@@@] @[member=@@@]@ @@@ @[member=@@@]@   @   @@@ @[member=@@@]@     ||||   \n\n\n\n\n");             }            else if (sair == 2) //se for 2 ele volta para o painel            {                painel(mat,aux);            }            else if ((sair !=1) || (sair != 2)) //enqianto nao for digita 1 || 2 vai ficar dando essa msg            {                 printf("comando invalido\n");            }        }         break;       }}  void gerador(int mat[M][M], int aux[M][M]) // vem a matriz de referencia do main M = Define 9{    int i, j,k,x; //inicialização das variaveis locais    srand(time(NULL)); //semeando o rand x=rand()%9+1; // x vai receber 1 numero aleatoria entre 1 e 9 mat[0][0]= x; // vai preencher a primeira posição do vetor pois essa nao precisa ser comparada  for(i=0; i<9; i++){ //vai trabalhar so na primeira linha da matriz     for(j=0; j<9; j++) // aqui a coluna começa em 1 pois a primeiro valor ja foi atribuido    {        x=rand()%9+1; // x vai receber 1 numero aleatoria entre 1 e 9        k=0;            // zero o k para controle de indice        while(k<j)  //enquanto k menor j sempre vai ser        {            if(x == mat[i][k])  // se o numero gerado e atruibuido para x for igual ao da posição que k se encontra FAÇA            {                x = rand()%9 + 1; // se for igual x vai receber outro numero aleatorio                k=0; // aqui ele zera o k para efetuar o teste dentro do while novamente            }            else // se ele passar por aqui é que o numero nao e igual            {                k=k+1; // incrementa a prosima posição da coluna            }        }        mat[i][j] = x; // se chegou ate aqui e por que nao tem numero repetido e vai ser colocado na posição da matriz de J      } }    // para baixo é para linha 2 em diante for(i=1;i<2;i++)// AQUI PASSAMOS A PRIMEIRA LINHA ALEATORIA PARA A SEGUNDA LINHA, POREM TRES POSIÇÕES ADIANTADAS                for(j=0;j<6;j++)                        mat[i][j] = mat[0][j+3];for(i=1;i<2;i++)                for(j=6;j<9;j++)                        mat[i][j] = mat[0][j-6];for(i=2;i<3;i++)// AQUI PASSAMOS A PRIMEIRA LINHA ALEATORIA PARA A TERCEIRA LINHA, POREM SEIS POSIÇÕES ADIANTADAS                for(j=0;j<3;j++)                        mat[i][j] = mat[0][j+6];for(i=2;i<3;i++)                for(j=3;j<9;j++)                        mat[i][j] = mat[0][j-3]; // primeiras 3 regioesfor(i=3;i<4;i++)// AQUI PASSAMOS A PRIMEIRA LINHA ALEATORIA PARA A QUARTA LINHA, POREM UMA POSIÇÃO ADIANTADA                for(j=0;j<9;j++)                        mat[i][j] = mat[0][j+1];for(i=3;i<4;i++)                for(j=8;j<9;j++)                        mat[i][j] = mat[0][j-8];for(i=4;i<5;i++)// AQUI PASSAMOS A QUARTA LINHA PARA A QUINTA, POREM TRES POSIÇÕES ADIANTADAS                for(j=0;j<6;j++)                        mat[i][j] = mat[3][j+3];for(i=4;i<5;i++)                for(j=6;j<9;j++)                        mat[i][j] = mat[3][j-6];for(i=5;i<6;i++)// AQUI PASSAMOS A QUARTA LINHA PARA A SEXTA, POREM SEIS POSIÇÕES ADIANTADAS                for(j=0;j<3;j++)                        mat[i][j] = mat[3][j+6];for(i=5;i<6;i++)                for(j=3;j<9;j++)                        mat[i][j] = mat[3][j-3];for(i=6;i<7;i++)// AQUI PASSAMOS A PRIMEIRA LINHA ALEATORIA PARA A SETIMA LINHA, POREM DUAS POSIÇÕES ADIANTADAS                for(j=0;j<9;j++)                        mat[i][j] = mat[0][j+2];for(i=6;i<7;i++)                for(j=7;j<9;j++)                        mat[i][j] = mat[0][j-7];for(i=7;i<8;i++)// AQUI PASSAMOS A SETIMA LINHA PARA A OITAVA LINHA, POREM TRES POSIÇÕES ADIANTADAS                for(j=0;j<6;j++)                        mat[i][j] = mat[6][j+3];for(i=7;i<8;i++)                for(j=6;j<9;j++)                        mat[i][j] = mat[6][j-6];for(i=8;i<9;i++)// AQUI PASSAMOS A SETIMA LINHA PARA A NONA LINHA, POREM SEIS POSIÇÕES ADIANTADAS                for(j=0;j<3;j++)                        mat[i][j] = mat[6][j+6];for(i=8;i<9;i++)                for(j=3;j<9;j++)                        mat[i][j] = mat[6][j-3];   nivel(mat,aux); // vai passar para essa função a matriz preenchidas } void gerazerofacil(int mat[M][M],int aux[M][M]) //recebe a matriz preenchida e essa funções atribuem os zeros{     int i,j,x=0,l,k,y=38; //declarações das variaveis locais    srand(time(NULL)); //semeando o rand     for(i=0; i<9; i++)    {        for(j=0; j<9; j++)        {            aux[i][j] = mat[i][j]; // aqui ele vai alocar a matriz mat na aux        }    }    i=0;    j=0; while(x <y){ // enquanto x nao for 38        x=0;    i=rand()%9; //sorteia um numero de 1 a 8 para posição i    j=rand()%9;//sorteia um numero de 1 a 8 para posição j    aux[i][j]=0; // pega o i e o j verifica a posição e aloca zero    for(l=0; l<9; l++)    {        for(k=0; k<9; k++)        {            if(aux[l][k]==0) // percorre a matriz verificando quantos zereos tem            {                x=x+1; // quando o X for igual ao y ele vai sair do while senao ele volta a zera ate X for == y            }          }    } }   jogadas(mat,aux); //passa para a função jogadas a matriz preenchidas com os zeros} void gerazeromedio(int mat[M][M],int aux[M][M]) //recebe a matriz preenchida e essa funções atribuem os zeros{     int i,j,x=0,l,k,y=44; //declarações das variaveis locais    srand(time(NULL)); //semeando o rand     for(i=0; i<9; i++)    {        for(j=0; j<9; j++)        {            aux[i][j] = mat[i][j]; // aqui ele vai alocar a matriz mat na aux        }    }    i=0;    j=0; while(x <y){ // enquanto x nao for 38        x=0;    i=rand()%9; //sorteia um numero de 1 a 8 para posição i    j=rand()%9;//sorteia um numero de 1 a 8 para posição j    aux[i][j]=0; // pega o i e o j verifica a posição e aloca zero    for(l=0; l<9; l++)    {        for(k=0; k<9; k++)        {            if(aux[l][k]==0) // percorre a matriz verificando quantos zereos tem            {                x=x+1; // quando o X for igual ao y ele vai sair do while senao ele volta a zera ate X for == y            }          }    } }jogadas(mat,aux); //passa para a função jogadas a matriz preenchidas com os zeros}  void gerazerodificil(int mat[M][M],int aux[M][M]) //recebe a matriz preenchida e essa funções atribuem os zeros{     int i,j,x=0,l,k,y=56; //declarações das variaveis locais    srand(time(NULL)); //semeando o rand     for(i=0; i<9; i++)    {        for(j=0; j<9; j++)        {            aux[i][j] = mat[i][j]; // aqui ele vai alocar a matriz mat na aux        }    }    i=0;    j=0; while(x <y){ // enquanto x nao for 38        x=0;    i=rand()%9; //sorteia um numero de 1 a 8 para posição i    j=rand()%9;//sorteia um numero de 1 a 8 para posição j    aux[i][j]=0; // pega o i e o j verifica a posição e aloca zero    for(l=0; l<9; l++)    {        for(k=0; k<9; k++)        {            if(aux[l][k]==0) // percorre a matriz verificando quantos zereos tem            {                x=x+1; // quando o X for igual ao y ele vai sair do while senao ele volta a zera ate X for == y            }          }    } }   jogadas(mat,aux); //passa para a função jogadas a matriz preenchidas com os zeros}        void jogadas (int mat[M][M], int aux[M][M]){    int i,j,k,l,a,b,valor,cont=0,acabar=1,sair=0,x=0,y=0;    int naomexe[M][M]; // essa matriz é apenas para nao mecher nos valores que ja estao impressosfor(i=0; i<9; i++){    for(j=0; j<9; j++)    {        naomexe[i][j] = aux[i][j];    }} while(acabar >0){        acabar=1;      printf("\n\t\t\t  @[member=@@@] @  @ @@@   @[member=@@@] @  @ @  @\n\t\t\t  @    @  @ @  @  @  @ @ @  @  @\n\t\t\t  @[member=@@@] @  @ @   @ @  @ @@   @  @\n\t\t\t     @ @  @ @  @  @  @ @ @  @  @\n\t\t\t  @[member=@@@] @[member=@@@] @@@   @[member=@@@] @  @ @[member=@@@]\n\n \a");  printf("\t\t\t    0 ");printf(" 1 ");printf(" 2 ");printf("  3 ");printf(" 4 ");printf(" 5 ");printf("  6 ");printf(" 7 ");printf(" 8 "); printf("\n\t\t\t  -------------------------------");for(i=0; i<9; i++){printf("\n");if((i== 3) || (i== 6)) // quando a linha for 3 ou 6 ele vai desenhar o printf abaixo{    printf("\t\t\t  -------------------------------\n");}     for(j=0; j<9; j++){            if(j==0)            {                 printf("\t\t\t%d | %d ",i, aux[i][j]);            }           else if((j==3) || (j==6)){                printf("| %d ", aux[i][j]); // toda vez q linha for 0 3 ou 6 vai imprimir | antes do numero            }            else if(j==8)            {                printf(" %d |", aux[i][j]); // a mesma coisa so que a barra | no final            }            else{                printf(" %d ", aux[i][j]); // se nao for nenhuma dessas condições imprime o numero normal            }     }}    printf("\n");printf("\t\t\t  -------------------------------\n\n\n");   printf("Digite a linha e a coluna e o numero de 1 a 9\t\t\t jogadas[%d]\n",cont );  fflush(stdin); // isso limpa o buffer (windows)            //__fpurge(stdin); limpa o buffer se for linux     scanf("%d %d %d", &i, &j, &valor);cont++;x=0;y=0;        while(y==0)        {             if (naomexe[i][j] > 0)                    {                        printf("\nJogada proibida\n");                        system("pause");                         x=1;                        y=1;                     }            for(l=i; l<=i; l++ )            {                 for(k=0; k<9; k++)                {                    if((valor !=0) && (valor == aux[i][k]))                    {                        printf("esse numero ja tem na linha\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                       else                    {                         y=1;                     }                 }            }               if (naomexe[i][j] > 0)                    {                        printf("\nJogada proibida\n");                        system("pause");                         x=1;                        y=1;                     }            for(a=0; a<9; a++ )            {                 for(b=j; b<=j; b++)                {                    if((valor !=0) && (valor == aux[a][b]))                    {                        printf("esse numero ja tem na coluna\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                       else                    {                         y=1;                     }                }            }// teste da 3x3 teste o primeiro quadrante************************************************************************************************************            if((i>=0 && i<=2) && (j>=0 && j<=2))            {                for(l=0; l<3; l++){                    for(k=0; k<3; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                     }                        else                    {                         y=1;                     }                     }                }            }  // teste da matriz de 3 a 6 na linha       testa o quarto quadrante*************************************************************if((i>=3 && i<6) && (j>=0 && j<=2))            {                for(l=3; l<6; l++){                    for(k=0; k<3; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                    else                    {                         y=1;                     }                     }                }            }           //teste da matriz de 6 a 9  TESTA O setima quadrante **************************************8            if((i>=6 && i<9) && (j>=0 && j<=2))            {                for(l=6; l<9; l++){                    for(k=0; k<3; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                    else                    {                         y=1;                     }                     }                }            }        // teste o segundo quadrante*******************************************             if((i>=0 && i<=2) && (j>=3 && j<6))            {                for(l=0; l<3; l++){                    for(k=3; k<6; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                     else                    {                         y=1;                     }                     }                }            } // teste o terceiro quadrante*******************************************             if((i>=0 && i<=2) && (j>=6 && j<9))            {                for(l=0; l<3; l++){                    for(k=6; k<9; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                     else                    {                         y=1;                     }                     }                }            }             // teste o quinto quadrante*******************************************             if((i>=3 && i<6) && (j>=3 && j<6))            {                for(l=3; l<6; l++){                    for(k=3; k<6; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                    else                    {                         y=1;                     }                     }                }            }             // teste o sexto quadrante*******************************************             if((i>=3 && i<6) && (j>=6 && j<9))            {                for(l=3; l<6; l++){                    for(k=6; k<9; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                     else                    {                         y=1;                     }                     }                }            }          //teste da matriz de 6 a 9  TESTA O oitavo quadrante **************************************8            if((i>=6 && i<9) && (j>=3 && j<6))            {                for(l=6; l<9; l++){                    for(k=3; k<6; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                    else                    {                         y=1;                     }                     }                }            }             //teste da matriz de 6 a 9  TESTA O ultimo quadrante **************************************8            if((i>=6 && i<9) && (j>=6 && j<9))            {                for(l=6; l<9; l++){                    for(k=6; k<9; k++){                             if((valor !=0) && (valor == aux[l][k]))                    {                        printf("esse numero ja tem na matriz 3x3\n\n");                        system("pause");                        y=1;                        x=1;                        cont--;                    }                     else                    {                         y=1;                     }                     }                }            }         } // fim do enquanto    while(x== 0) // sempre vai passar por aqui.. apenas se a o teste acima der erro{    if(i>8)    {        printf("Linha ou coluna ou valor digitado errado\n");        cont--;        x=1;        system("pause");     }    else if(j>8)    {        printf("Linha ou coluna ou valor digitado errado\n");        cont--;        x=1;        system("pause");    }    else if(valor > 11)    {        printf("Linha ou coluna ou valor digitado errado\n");         cont--;        x=1;        system("pause");     }     else    {         x=1;         aux[i][j] = valor; // aqui recebe a jogada    }  }if((i == 10 ) || (j==10) || (valor== 10))    {        sair = 10; if(sair == 10){     system("cls") || ("clear");        printf("Deseja realmente sair?\n\n");        printf("Digite 1 para sim 2 para nao...\n");        while((sair != 1) && (sair != 2)) //enquanto nao for 1 ou 2 vai ficar rodando o programa        {            scanf("%d", &sair);            fflush(stdin); // isso limpa o buffer (windows)            //__fpurge(stdin); limpa o buffer se for linux            if(sair == 1)//se for digitado 1 sai do programa            {                system("cls") || ("clear"); //limpa a tela                printf("\n\n\n\n");                printf("  @[member=@@@]@@    @@@   @[member=@@@] @[member=@@@]@ @@@ @[member=@@@]@ @[member=@@@]@ @@@ @   @    @[member=@@@]@@  \n @[member=@[member="@@@]@@"]@   @  @  @    @      @  @       @    @  @   @   @[member=@[member="@@@]@@"]@ \n@  @[member=@@@]  @  @   @ @[member=@@@] @      @  @       @    @  @   @  @  @[member=@@@]  @\n@[member=@[member="@@@]@@"]@@@  @   @ @    @[member=@@@]@  @  @[member=@@@]@   @    @  @   @  @[member=@[member="@@@]@@"]@@@\n   @[member=@@@]     @  @  @        @  @      @   @    @  @   @     @[member=@@@]   \n   ||||         @@@   @[member=@@@] @[member=@@@]@ @@@ @[member=@@@]@   @   @@@ @[member=@@@]@     ||||   \n\n\n\n\n");                system("pause");                exit(0);            }            else if (sair == 2) //se for 2 ele volta para o painel            {                jogadas(mat,aux);            }            else if ((sair !=1) || (sair != 2)) //enqianto nao for digita 1 || 2 vai ficar dando essa msg            {                 printf("comando invalido\n");             }        }}    } if((i == 99 ) || (j==99) || (valor== 99)){    salvarjogo(mat,aux);}for(i=0; i<M; i++){    for(j=0; j<M; j++)    {        if(aux[i][j] == 0)        {            acabar=acabar+1;        }    }} if((i == 50 ) || (j==50) || (valor== 50)){    for(i=0; i<9; i++)    {        printf("\n");        for(j=0; j<9; j++)        {            printf("| %d|",mat[i][j]);        }     }    printf("\n\n");    system("pause");}acabar=acabar-1; system("cls") || ("clear"); }} /*void cronometro(int mat[M][M],int aux[M][M]){    int sec=0, min=0, hr=0, p=0;     while (p<10)    {         printf("\n\t %dH:%dM:%dS", hr,min,sec);        system("cls");        Sleep(1000); //pausa a tela por uma determinado tempo        system("cls");        jogadas(mat,aux);        sec++;         if(sec==60)        {            sec=0;            min++;         }        if(min == 60)        {            min=0;            hr++;        }         if(hr==24)        {            hr++;         }      }    }*/   int main(){    int mat[M][M], aux[M][M];     painel(mat,aux); // vai para função das opcoes do painelprintf("\n\n\n\n\\t\t\t\tPARABENS");}
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
Em 08/06/2015 às 20:07, Rafael Domingues Corrêa disse:

Eu criei o código explicado para facilitar seu entendimento da lógica em C


#include <stdio.h> //Para entrada e saíd de dados#include <stdlib.h> //Para srand() e rand()#include <time.h> //Para time()void inicializaSudoku(int vet[9][9]) //Função global com parãmetro para um vetor 9x9{    int i, j, k, seek, //Varáveis de controle de loop    aux; //Variável que receberá o número aleatório a ser comparado    srand(time(NULL)); //Cria a semente dos números aleatórios    vet[0][0] = rand()%9 + 1; //Inicia o primeiro valor do vetor pois não precisa ser comparado    //Loop de preenchimento do vetor, usando variável de preenchimento    /** Cria o vetor raiz **/    for (i=1; i<9; i++) //Variável 'i' recebe 1 pois o primeiro valor já foi iniciado    {        aux = rand()%9 + 1; //Auxiliar recebe novo valor        j = 0; //Inicia a variável usada no loop para comparação        while(j<i) //Enquanto todo array não é comparado        {            if(aux == vet[0][j]) //Se valor de auxiliar for igual a um que já existe no vetor            {                aux = rand()%9 + 1; //Auxiliar recebe novo valor                j = 0; //Reinicia a comparação            }            else //Se for diferente            {                j++; //Passa para a próxima comparação            }        }        //Se chegar nesse ponto é porque todos os números são diferentes        vet[0][i] = aux; //Posição no vetor recebe o valor válido    }    //Você pode aproveitar a própria sequência raiz para contruir o jogo    for(i=1; i<9; i++)    {        //Não pode repetir a primeira sequência, então        if(vet[0][i]-1 <= 0)// Se o valor do ponto do vetor for igual a 0        {            aux = vet[0][0] - 1; //Recebe o valor do primeiro ponto do vetor        }        else //Se não        {            aux = vet[0][i] - 1; //Recebe o ponto do vetor analisado        }        /** Como você começará de um ponto  no meio do array será necessário        rebubiná-lo para completar as outras lacunas **/        seek = 0; //define a sequencia como não rebubinada        for(j=aux, k=0; j<9; j++, k++)        {            vet[i][k] = vet[0][j]; //Ponto nulo do vetor recebe uma posição aleatória pré indicada            if(!seek) //Se não rebubinado            {                if(j >= 8)                {                    j = -1; // 'j' recebe uma posição antes do início normal do array                    seek = 1; //Indica rebubinação                }            }            else // Se já rebubinado            {                if(j >= aux) // Se 'j' for igual à posição aleatória inicial                {                    j = 99; //Completa o array                }            }        }    }    return; //Encerra função}int main(){    int sudoku[9][9], //Há a necessidade de criar um vetor apropriado para a função    i, j;     inicializaSudoku(sudoku); //Para iniciar um vetor apropriado basta colocá-lo como parâmetro    //Para mostrar o vetor do sudoku    for(i=0; i<9; i++)    {        for(j=0; j<9; j++)        {            printf("[%i] ", sudoku[i][j]);        }        printf("\n");    }    return 0;}

Dê uma estudada na função. Falou, um abraço!

Não tem como organizar linha por linha esse código não? Tá difícil de entender.

Link para o comentário
Compartilhar em outros sites

37 minutos atrás, Daniel RG disse:

Não tem como organizar linha por linha esse código não? Tá difícil de entender.

Esse tópico é muito antigo, quando o fórum passou por uma atualização todos os códigos de todos os posts ficaram numa única linha. Então todo post com código pra antes de uma certa data que você visualizar no fórum vai estar assim...

 

Mas com um pouco de paciência pra colocar Enters nos finais de linhas (especialmente nas linhas com comentários do tipo // ) e o uso de uma ferramenta de indentação automatizada como essa http://www.tutorialspoint.com/online_c_formatter.htm você pode conseguir obter o código.

 

Esse código foi mais chato porque tem muitos comentários, mas mesmo assim só levou uns minutos pra obter isso:

#include <stdio.h> //Para entrada e saíd de dados
#include <stdlib.h> //Para srand() e rand()
#include <time.h> //Para time()
void inicializaSudoku(int vet[9][9]) //Função global com parãmetro para um vetor 9x9
{
    int i, j, k, seek, //Varáveis de controle de loop
        aux; //Variável que receberá o número aleatório a ser comparado
    srand(time(NULL)); //Cria a semente dos números aleatórios
    vet[0][0] = rand()%9 + 1; //Inicia o primeiro valor do vetor pois não precisa ser comparado
    //Loop de preenchimento do vetor, usando variável de preenchimento
    /** Cria o vetor raiz **/
    for (i=1; i<9; i++) //Variável 'i' recebe 1 pois o primeiro valor já foi iniciado
    {
        aux = rand()%9 + 1; //Auxiliar recebe novo valor
        j = 0; //Inicia a variável usada no loop para comparação
        while(j<i) //Enquanto todo array não é comparado
        {
            if(aux == vet[0][j]) //Se valor de auxiliar for igual a um que já existe no vetor
            {
                aux = rand()%9 + 1; //Auxiliar recebe novo valor
                j = 0; //Reinicia a comparação
            }
            else //Se for diferente
            {
                j++; //Passa para a próxima comparação
            }
        }
        //Se chegar nesse ponto é porque todos os números são diferentes
        vet[0][i] = aux; //Posição no vetor recebe o valor válido
    }
    //Você pode aproveitar a própria sequência raiz para contruir o jogo
    for(i=1; i<9; i++)
    {
        //Não pode repetir a primeira sequência, então
        if(vet[0][i]-1 <= 0)// Se o valor do ponto do vetor for igual a 0
        {
            aux = vet[0][0] - 1; //Recebe o valor do primeiro ponto do vetor
        }
        else //Se não
        {
            aux = vet[0][i] - 1; //Recebe o ponto do vetor analisado
        }
        /** Como você começará de um ponto  no meio do array será necessário
        rebubiná-lo para completar as outras lacunas **/
        seek = 0; //define a sequencia como não rebubinada
        for(j=aux, k=0; j<9; j++, k++)
        {
            vet[i][k] = vet[0][j]; //Ponto nulo do vetor recebe uma posição aleatória pré indicada
            if(!seek) //Se não rebubinado
            {
                if(j >= 8)                
                {
                    j = -1; // 'j' recebe uma posição antes do início normal do array
                    seek = 1; //Indica rebubinação
                }
            }
            else // Se já rebubinado
            {
                if(j >= aux) // Se 'j' for igual à posição aleatória inicial
                {
                    j = 99; //Completa o array
                }
            }
        }
    }
    return; //Encerra função
}
int main() {
    int sudoku[9][9], //Há a necessidade de criar um vetor apropriado para a função
        i, j;
    inicializaSudoku(sudoku); //Para iniciar um vetor apropriado basta colocá-lo como parâmetro
    //Para mostrar o vetor do sudoku
    for(i=0; i<9; i++)    {
        for(j=0; j<9; j++)        {
            printf("[%i] ", sudoku[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Mas não testei pra ver se tá tudo certo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!