How to locate a value that is in the vector but in the incorrect position?

Asked

Viewed 924 times

-3

I’m having second thoughts computaTentativas, do not know how to make the tests of if Else if Else. I need that when I find the correct number (color) in the correct position of vet[z] is tested at the 4 positions and if it is, report that the user has won, IF he does not hit every sequence (has 10 attempts) but hit ONE number in a correct position must return at the positions on the left side of the matrix 4x the number 1, IF you hit a number but are not in the correct position of vet[z] should return in the positions on the left side of the matrix 4x the number 2, IF does not hit neither a number or position, leaves in the line on the left side of the matrix 4x the number 0.

The problem lies between lines 90 and 123, please, I ask for help am beginner in C and as you can see by the topic I’m long in this xd

Edit: I tried to create another one for when I enter the if and I’m not working either... #HELP

Edit 2: now it’s affecting only the correct line, but I don’t know how to do the tests.... :(

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Biblioteca para adicionar cores
#define L 10       // Numero de Linhas da matriz
#define C 8        // Numero de Colunas da matriz
#define TAM 4      // Tamanho do vetor vet que armazenará a senha gerada aleatoriamente

void sorteio(int vet[TAM]) // Funcao que sorteia os numeros aleatorios
{
    int x;
    srand((unsigned)time(NULL));
    for (x = 0; x < TAM; x++)
    {
        vet[x] = 1 + (rand() % 6);
    }
    printf("\n\t\t\t\t====== SENHA GERADA ======\n\n");
    printf("\t\t\t\tBoa sorte Desafiado(a)!!\n\n");
    printf("\t\t\t\t==========================\n");
    printf("\n");
    printf("===================== BEM VINDO AO JOGO DA SENHA NOBRE DESAFIADO(A) =====================\n");
    printf("\n");
    system("pause");
    system("cls");

    for (x = 0; x < TAM; x++) // MOSTRANDO OS NUMERO SORTEADOS NO VETOR DE 4 POSICOES SO PARA TESTAR
    {
        printf("NUMERO DA SENHA GERADA: %d \n", vet[x]);
    }
}

void lerTentativas(int tentativa, int numTentativa, int vet[TAM], int matriz[L][C]) // Função para ler as tentativas do Desafiado
{
    int x, y, numLinha = 1, z = 0;
    tentativa = 1;
    for (x = 0; x < L; x++)
    {
        for (y = 0; y < 4; y++)
        {
            printf("\n");
            textcolor(15);
            printf("\t\t\t================ MENU ==================\n");
            textcolor(2);
            printf("\n\t\t\t\tDigite 1 para a cor verde\n");
            textcolor(9);
            printf("\t\t\t\tDigite 2 para a cor azul\n");
            textcolor(14);
            printf("\t\t\t\tDigite 3 para a cor amarelo\n");
            textcolor(4);
            printf("\t\t\t\tDigite 4 para a cor vermelho\n");
            textcolor(5);
            printf("\t\t\t\tDigite 5 para a cor roxo\n");
            textcolor(1);
            printf("\t\t\t\tDigite 6 para a cor azul marinho\n\n");
            textcolor(15);
            printf("\t\t\t================ MENU ==================\n\n\n");
            printf("\t\t\t\tRespostas do Desafiante:\n");
            printf("\n\tCaso o resultado de sua linha apos sua jogada seja 1 - Significa que ha uma cor certa no lugar certo\n");
            printf("\n\tCaso o resultado de sua linha apos sua jogada seja 2 - Significa que ha uma cor certa mas no lugar errado\n");
            printf("\n\tCaso o resultado de sua linha apos sua jogada seja 0 - Significa que nem a cor e nem a posicao estao corretas\n\n");
            printf("\t\t\t========================================");
            printf("\n\n\t\t\tDigite o numero %d da sua %d tentativa:\t", numLinha, tentativa); // informa tentativa atual
            scanf("%d", &matriz[x][y]);                                                         //preenchendo matriz com tentativas do usuario
            while (matriz[x][y] > 6 || matriz[x][y] < 1)                                        // valida se o numero digitado esta conforme o MENU
            {
                printf("\t\t=======================================================\n");
                printf("\t\tPor favor nobre desafiado(a), digite numeros de 1 ao 6.\n");
                printf("\t\t=======================================================\n");
                printf("\nDigite o numero %d da sua %d tentativa:\t", numLinha, tentativa); // informa tentativa atual
                scanf("%d", &matriz[x][y]);                                                 //preenchendo matriz com tentativas do usuario
            }
            numLinha++;
            mostrarMatriz(matriz); // Chama a funcao para mostrar a matriz atualizada a cada jogada.
            printf("\n");
        }
        computaTentativas(matriz, &vet[z]);
        numLinha = 1;
        tentativa++;
    }
}

void computaTentativas(int matriz[L][C], int vet[TAM]) // Função para comparar e computar as tentativas do Desafiado
{
    int x, y, z = 0, j, i, senha[TAM];
    for (x = 0; x < L; x++)
    {
        for (y = 0; y < C; y++)
        {
            if (matriz[x][y] == vet[z]) // Não sei se está correto este teste para se encontrar o numero preenchido da matriz está dentro do vet
            {
                for (j = 0; j < vet[z]; j++)
                {
                    for (i = 4; i < 8; i++)
                    {
                        matriz[x][i] = 1;
                        printf("PARABENS");
                        // Se entrar aqui deveria mostrar a matriz e no lado esquerdo da matriz, colocar 1 no início da linha
                    }
                }
            }
            else if (matriz[x][y] == vet[0] || matriz[x][y] == vet[1] || matriz[x][y] == vet[2] || matriz[x][y] == vet[3]) // Não sei se está correto este teste para se EXISTIR um numero dentro do vetor MAS ESTIVER NA POSICAO INCORRETA
            {
                for (j = 0; j < L; j++)
                {
                    for (i = 4; i < 8; i++)
                    {
                        matriz[x][i] = 2;
                        // Se entrar aqui deveria mostrar a matriz e no lado esquerdo da matriz, colocar 1 no início da linha
                    }
                } // Se entrar aqui deveria mostrar a matriz e no lado esquerdo da matriz, colocar 2 no início da linha
            }
            z++;
        }
    }
}

void mostrarMatriz(int matriz[L][C])
{
    int x, y;
    printf("\n\n");
    printf("\t\t============== MATRIZ ATUALIZADA ==============");
    for (x = 0; x < L; x++)
    {
        printf("\n");
        for (y = 0; y < C; y++)
        {
            printf("\t%4d", matriz[x][y]);
        }
    }
    printf("\n");
    printf("\t\t============== MATRIZ ATUALIZADA ==============\n\n");
    system("pause");
    system("cls");
}

int main()
{
    int x, y, matriz[L][C] = {0}, senha, vet[TAM], tentativa = 0, numTentativa;
    printf("===================== BEM VINDO AO JOGO DA SENHA NOBRE DESAFIADO(A) =====================\n");
    sorteio(&vet);
    lerTentativas(tentativa, numTentativa, vet, &matriz);
    system("cls");
    printf("\n");
    printf("\t\t\t============== FINAL DE JOGO ==============\n");
    printf("\n\t\t\tTENTATIVAS ESGOTADAS, O DESAFIANTE VENCEU!\n\n\t");
    printf("\t\t============== FINAL DE JOGO ==============\n\n");
    system("pause");
    return 0;
}

2 answers

1

Man, learn to debug your code.

To locate a position of a value in a vector you can do a function that sweeps this vector looking for a given value.

make go inside for is a bad programming practice.. take care, maybe recursiveness is the right way to what you’re trying to do

From what I understand, you’re wanting to do position value checks in your matrix, maybe use a method that compares for example:

Cima: matrix[x][y-1]

Bass: matrix[x][y+1]

Esqueda: matrix[x-1][y]

Right: matrix[x+1][y]

I hope I’ve helped, if not, please make your doubt clearer.

  • First, thank you very much for trying to help me M. Bertolazo! I will summarize, the problem lies in the procedure computaTentativas in it, I need that when the user hits A NUMBER IN A CORRECT POSITION of the password that was generated randomly, the whole line referring to the attempt, receive 1 in its 4 positions, IF HIT A NUMBER THAT HAS INSIDE THE VET BUT IN THE WRONG POSITION, the whole line referring to the attempt, Get 2 in your 4 positions, if you find nothing, do nothing, continue 0 and go to next try, if the user hits the password that is in vet, he wins and ends the game

0


I COULD SOLVE PEOPLE, the problem was in the way I was going through the auxiliary vector to look for the values of the password that was in vet, anyway, follow game finished:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Biblioteca para adicionar cores
#define L 10       // Numero de Linhas da matriz
#define C 8        // Numero de Colunas da matriz
#define TAM 4      // Tamanho do vetor vet que armazenará a senha gerada aleatoriamente





            /* Para o funcionamento correto das cores no menu, foi utilizada a biblioteca Conio 2.1,
            em que foram baixados e extraidos os arquivos na pasta Codeblocks/MinGW e chamando a mesma com <conio.h>
            as cores são definidas conforme numeros inteiros da propriedade textcolor(numero_da_cor); */

void sorteio(int vet[TAM]) // Funcao que sorteia os numeros aleatorios
{
    int x;
    srand((unsigned)time(NULL)); // o legal de usar o 'unsigned' é que cada vez que voce fechar e abrir o algoritmo, a sequencia nunca sera igual a uma das vezes tentada anteriormente
    for (x = 0; x < TAM; x++)
    {
        vet[x] = 1 + (rand() % 6); //Gera uma senha aleatoria de 1 a 6
    }
    printf("\n\t\t\t\t====== SENHA GERADA ======\n\n");
    printf("\t\t\t\tBoa sorte nobre desafiado(a)!!\n\n");
    printf("\t\t\t\t==========================\n");
    printf("\n");
    printf("\n===================== BEM VINDO AO JOGO DA SENHA NOBRE DESAFIADO(A) =====================\n");
    printf("\n");
    system("pause");
    system("cls");

    /* for (x = 0; x < TAM; x++) // ATENÇÃO: Se descomentar este trecho, ele mostrará no início do alg, a senha gerada aleatoriamente pelo desafiante que pode ser utilizada para fins de correção.
    {
        printf("NUMERO DA SENHA GERADA: %d \n", vet[x]);
    }
    */
}

void lerTentativas(int matriz[L][C], int vet[]) // Função para ler as tentativas do Desafiado
{
    int x, y, tentativa, numLinha = 1, jogada[TAM];
    tentativa = 1;
    for (x = 0; x < L; x++)
    {
        for (y = 0; y < 4; y++)
        {
            printf("\n");
            textcolor(15);
            printf("\t\t\t================ MENU ==================\n");
            textcolor(2);
            printf("\n\t\t\t\tDigite 1 para a cor verde\n");
            textcolor(9);
            printf("\t\t\t\tDigite 2 para a cor azul\n");
            textcolor(14);
            printf("\t\t\t\tDigite 3 para a cor amarelo\n");
            textcolor(4);
            printf("\t\t\t\tDigite 4 para a cor vermelho\n");
            textcolor(5);
            printf("\t\t\t\tDigite 5 para a cor roxo\n");
            textcolor(1);
            printf("\t\t\t\tDigite 6 para a cor azul marinho\n\n");
            textcolor(15);
            printf("\t\t\t================ MENU ==================\n\n\n");
            printf("\t\t\tLembre-se, voce tem apenas 10 tentativas!\n");
            printf("\n\t\t\t========================================\n\n\n");
            printf("\t\t\t\tRespostas do Desafiante:\n");
            printf("\n\tCaso o resultado de sua linha apos sua jogada seja 1 - Significa que ha uma cor certa no lugar certo\n");
            printf("\n\tCaso o resultado de sua linha apos sua jogada seja 2 - Significa que ha uma cor certa mas no lugar errado\n");
            printf("\n\tCaso o resultado de sua linha apos sua jogada seja 0 - Significa que nem a cor e nem a posicao estao corretas\n\n");
            printf("\t\t\t========================================");
            printf("\n\n\t\t\tDigite o numero %d da sua %d tentativa:\t", numLinha, tentativa); // informa tentativa atual
            scanf("%d", &matriz[x][y]);
            jogada[y]=matriz[x][y];                                                            //preenchendo matriz com tentativas do usuario
            while (matriz[x][y] > 6 || matriz[x][y] < 1)                                        // valida se o numero digitado esta conforme o MENU
            {
                printf("\t\t=======================================================\n");
                printf("\t\tPor favor nobre desafiado(a), digite numeros de 1 ao 6.\n");
                printf("\t\t=======================================================\n");
                printf("\nDigite o numero %d da sua %d tentativa:\t", numLinha, tentativa); // informa tentativa atual
                scanf("%d", &matriz[x][y]);  //preenchendo matriz com tentativas do usuario
            }
            numLinha++;
            system("cls");
        }
        computaTentativas(matriz, vet, jogada, x); // Procedimento que vai fazer o teste das tentativas
        mostrarMatriz(matriz); // Chama a funcao para mostrar a matriz atualizada a cada jogada.
        numLinha = 1;
        tentativa++;
    }
}


void computaTentativas(int matriz[L][C], int vet[], int jogada[], int x) // Função para comparar e computar as tentativas do Desafiado
{
        int i, j, ganhou, z, varrerVet;
        j=4;
        ganhou=0;
        for (i=0; i <= 3; i++)
        {
                //SE ESTIVER CERTO = 1 PINO BRANCO
                if (jogada[i] == vet[i])
                {
                    matriz[x][j]=1;
                    ganhou++;

                }
                else
                {
                    //VARRENDO VETOR
                    varrerVet=0;
                    for (z=0; z <= 3; z++)
                    {
                        if (jogada[i] == vet[z])
                        {
                            varrerVet++;
                        }
                    }
                    if (varrerVet == 0)
                        {
                            matriz[x][j]=0; // PINO COR 'NENHUM' kkkkkk
                        }

                    //SE ESTIVER ERRRADO = 2 PINO PRETO
                    else if(jogada[i] != vet[i])
                        {
                            matriz[x][j]=2;
                        }
                }
            j++;
        }
        if (ganhou==4) // se os 4 numeros da sequencia estiverem corretos, ganhou e um contador que vai ter 4, constatando a vitoria do usuario
        {
            printf("\n=== !!! PARABENS NOBRE DESAFIADO(A) VOCE DESCOBRIU A SENHA GERADA PELO DESAFIANTE !!! ===\n");
            exit(1);
        }
}

void mostrarMatriz(int matriz[L][C]) // função para ser mostrada a matriz, quando quiser mostrar ela como ta, so chamar a mostrarMatriz :D
{
    int x, y;
    printf("\n\n");
    printf("\t\t============== MATRIZ ATUALIZADA ==============");
    for (x = 0; x < L; x++)
    {
        printf("\n");
        for (y = 0; y < C; y++)
        {
            printf("\t%4d", matriz[x][y]);
        }
    }
    printf("\n");
    printf("\t\t============== MATRIZ ATUALIZADA ==============\n\n");
    system("pause");
    system("cls");
}

int main()
{
    int matriz[L][C] = {0}, vet[TAM], continuar=0;
    printf("\n\t\t============== INSIRA FICHAS ==============\n");
    printf("\n\t\tDeseja iniciar uma partida, nobre desafiado(a)? \n\t\tDigite 1 para Sim e 0 Para sair do jogo:\t\n");
    printf("\n\t\t============== INSIRA FICHAS ==============\n");
    scanf("%d", &continuar);
    system("cls");
    while( continuar != 0)
    {
        printf("\n===================== BEM VINDO AO JOGO DA SENHA NOBRE DESAFIADO(A) =====================\n");
        sorteio(vet);
        lerTentativas(matriz, vet);
        system("cls");
        printf("\n");
        printf("\t\t\t============== FINAL DE JOGO ==============\n"); // Apos as 10 tentativas, se usuario nao ganhar, desafiante(computador) ganha.
        printf("\n\t\t\tTENTATIVAS ESGOTADAS, O DESAFIANTE VENCEU!\n\n\t");
        printf("\t\t============== FINAL DE JOGO ==============\n\n");
        system("pause");
        system("cls");
        printf("\n\t\t============== INSIRA FICHAS ==============\n");
        printf("\n\t\tDeseja iniciar uma partida, nobre desafiado(a)? \n\t\tDigite 1 para Sim e 0 Para sair do jogo:\t\n");
        printf("\n\t\t============== INSIRA FICHAS ==============\n");
        scanf("%d", &continuar);
        system("cls");
    }
    return 0;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.