Ir ao conteúdo

Posts recomendados

Postado

olá, estou implementando um sudoku em C. Para verificar se o usuário terminou o jogo, eu criei a seguinte função

bool
verificar(void)
{
    for (int i = 0; i < 9; i++)
    {
        int k [9];
        for (int a = 9; a < 9; a++)
            k [a] = 0;
        for (int j = 0; j < 9; j++)
        {
            if (g.board[i][j] == '.')
            {
                return false;
            }
            k[g.board[i][j]-1] += 1;
        }
        for (int j = 0; j < 9; j++)
            
            if (k[j] > 1)
            {
                    for (int j = 0; j < 9; j++)
                        mvaddch(16, 38 + j, k[j]);
          			beep();
                    return false;           
            }
    

    }
        for (int i = 0; i < 9; i++)
        {
            char k [9];
            for (int a = 9; a < 9; a++)
                k [a] = 0;
            for (int j = 0; j < 9; j++)
            {
                if (g.board[j][i] == '.')
                {
                    return false;
                }
                k[g.board[j][i]-1] += 1;
            }
            for (int j = 0; j < 8; j++)
                if (k[j] > 1)
                {
                    for (int j = 0; j < 9; j++)
                        mvaddch(16, 38 + j, k[j]);
                    beep();
                    return false;
                } 
        }
    return true;
}

eu estou usando a biblioteca ncurses para criar um interface diferente, onde fica o jogo, por isso uso mvaddch

o array que representa o tabuleito é o g.board

o que eu queria era que verificasse se havia todos os números de 1 a 9 em cada linha e coluna (ainda não implementei o teste de quadrantes 3x3) assim:

 

1: cria um array de inteiros e o define para "000000000" (9 zeros)

2: testa se não há nenhum espaço em branco (que no tabuleiro fica como um ".")

3: testa cada posição da linha: se encontrar um número '1' adiciona +1 na primeira posição do array K, se encontrar um número '2' faz o mesmo com a segunda posição. portanto, quando verificasse as 9 posições da linha, se algum número se repetisse, um dos números do array K seria maior que um, se não seria igual a 1.

4: então verifica as posições do array K, e se algum for diferente de 1 retorna false e imprime o array em uma posição da tela (apenas para meus testes), alem de emitir um "som de erro".

5: se não, faz a mesma coisa com a próxima linha, e se  todas as linhas estiverem certas , faz a mesma coisa com colunas. se tudo estiver certo retorna true.

porém ocorreu um erro: sempre retornava falso na primeira vez que executava o 4 passo. então em imprimi o array K em uma posição da tela e apareceu diferentes caracteres, mais ou menos assim �~��^^^A.

qual o meu erro?

Postado
int k [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
        /*for (int a = 9; a < 9; a++)
            k [a] = 0;*/
        for (int j = 0; j < 9; j++)
        {
            if (g.board[i][j] == '.')
            {
                return false;
            }
            k[g.board[i][j]-1] += 1; //g.board não to tipo char? os indices da matriz pedem tipo inteiros. não pode misturar os dois
			//lembre-se: '1' e um 1 são coisas direrentes em c.
        }

você está misturando tipos char com int.

  • Obrigado 1
Postado
5 horas atrás, Aquiles Augusto disse:

eu estou usando a biblioteca ncurses para criar um interface diferente, onde fica o jogo, por isso uso mvaddch

o array que representa o tabuleito é o g.board

o que eu queria era que verificasse se havia todos os números de 1 a 9 em cada linha e coluna (ainda não implementei o teste de quadrantes 3x3)

 

Não misture a interface com os dados. Só complica sua vida e muito.

Poste um programa completo, um mínimo compilável.

Onde está a definição de g, por exemplo?

 

bool verificar(void);

 

Evite void a todo custo. Nesse caso aqui passe o endereço da estrutura que define o tabuleiro. Nunca deixe isso global.

 

Citação

1: cria um array de inteiros e o define para "000000000" (9 zeros)

2: testa se não há nenhum espaço em branco (que no tabuleiro fica como um ".")

3: testa cada posição da linha: se encontrar um número '1' adiciona +1 na primeira posição do array K, se encontrar um número '2' faz o mesmo com a segunda posição. portanto, quando verificasse as 9 posições da linha, se algum número se repetisse, um dos números do array K seria maior que um, se não seria igual a 1.

4: então verifica as posições do array K, e se algum for diferente de 1 retorna false e imprime o array em uma posição da tela (apenas para meus testes), alem de emitir um "som de erro".

5: se não, faz a mesma coisa com a próxima linha, e se  todas as linhas estiverem certas , faz a mesma coisa com colunas. se tudo estiver certo retorna true.

 

Esses passos parecem muito confusos. Na função contei acho que 10 for e 5 return. E confundem a implementação com a interface. E ainda não testam pelos 9 quadrados internos.

 

image.png.23eb126f31323ad4ece2d033ca21a44c.pngPara ajudar, esse tabuleiro, resolvido, como aparece em https://www.kristanix.com/sudokuepic/sudoku-rules.php mostra um jogo resolvido.

 

Sua função deveria receber uma representação disso e retornar true ou false conforme a estrutura represente um tabuleiro válido.

 

Se o tabuleiro não está preenchido então parece que quer retornar false.

 

Retornar true ou false em C é um pouco de exagero. 0 é falso, qualquer outro valor é verdadeiro. Se existisse bool em C e usasse um bit até faria sentido, só que não tem e basta isso: zero é falso. Só zero é falso.

 

C armazena os dados por linha. Nada impede que se tenha uma representação por linha e outra por coluna se isso facilitar a construção ou o algoritmo.


A questão da representação é secundária e não deve aparecer aqui. Tanto faz se usa curses ou SDL ou uma série de puts(). ou allegro ou Qt ou as funções do Windows ou wxWidgets. Nada tem a ver com o jogo.

 

Uma outra função, associada à exibição apenas, pega um tabuleiro e mostra na tela, ou grava em arquivo, ou manda  por e-mail. Tanto faz. Mas essa função não altera a representação, assim como verificar() não apresenta nada na tela (exceto para teste, claro). É importante para você manter os dados separados da apresentação.

 

Escreva em torno dos dados

 

O mais importante é ter uma representação adequada do tabuleiro. E a noção de adequado vai depender de como vai implementar as regras. São 81 posições, mas tem 9 quadrados de 3x3 envolvidos. e tem a noção de linhas e colunas. O tabuleiro pode então ser visto como 54 "trincas", 27 para a horizontal e 27 para a vertical, usando os mesmos 81 símbolos, que por sua vez são 9 sequências dos números de 1 a 9. Cada um dos 81 símbolos aparece em 3 lugares: na linha, na coluna e no quadrado interno. E ao colocar um símbolo (um número) numa posição isso vai estar interferindo nos 3 lugares:

 

As regras

 

Usar os números de 1 a 9 exatamente uma vez em cada coluna. E em cada linha. E em cada um dos 9 quadrados 3x3 como se vê no desenho.

Só isso.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!