Ir ao conteúdo

Posts recomendados

Postado

To pra fazer um trabalho pro final de periodo e to com uma duvida em relação a matrizes, no meu caso eu tenho que fazer um jogo da velha de matriz I x I mas como eu faço isso de maneira correta?

Unico jeito que eu consegui de certa forma fazer foi botando esses scanf dentro das funções de iniciar e exibir, tabuleiro e checar o tab, porém essa de exibir está em um loop então apesar de "funcionar" o usuario teria que inputar o valor da matriz em cada laço de repetição, como posso resolver isso?

#include <stdio.h>
#include <stdlib.h>

void menu();

void limpartela(){
    system("CLS");
}

void iniciatab(char tabuleiro[100][100]){
    
    // Navega por cada posicao e coloca '-'
    
    int linha,coluna;
    int i;

    printf("Tamanho da Matriz: ");
    scanf("%d",&i);   
    

    for(linha = 0; linha <i; linha ++){
        for(coluna = 0; coluna<i; coluna++){
            tabuleiro[linha][coluna] = '-';
        } 
    }

    return i;
}

void exibetab(char tabuleiro[100][100]){
    
    // Exibe Tabuleiro na Tela 
       
    int linha,coluna;
    int i;

    printf("Tamanho da Matriz: ");
    scanf("%d",&i);   
    
    
    for(linha = 0; linha <i; linha ++){
        for(coluna = 0; coluna<i; coluna++){
            printf("%c",tabuleiro[linha][coluna]);
        } 
        printf("\n");
      
    }
  
}

int conferetabuleiro(char tabuleiro [100][100]){
    int linha,coluna;
    int i;

    printf("Tamanho da Matriz: ");
    scanf("%d",&i);

    //Confere Linhas
    for(linha = 0; linha<i; linha++){
        if(tabuleiro[linha][0] == 'X' && tabuleiro[linha][0] == tabuleiro[linha][1] && tabuleiro[linha][1] == tabuleiro[linha][2]){
            return 1;
        }else if(tabuleiro[linha][0] == 'O' && tabuleiro[linha][0] == tabuleiro[linha][1] && tabuleiro[linha][1]  == tabuleiro[linha][2]){
            return 2;
            }
        }
        //Confere Colunas
    for(coluna = 0; coluna <i; coluna++){
        if(tabuleiro[0][coluna] == 'X' && tabuleiro[0][coluna] == tabuleiro[1][coluna] && tabuleiro[1][coluna] == tabuleiro[2][coluna]){
            return 1;
        }else if(tabuleiro[0][coluna] == 'O' && tabuleiro[0][coluna] == tabuleiro[1][coluna] && tabuleiro[1][coluna]  == tabuleiro[2][coluna]){
            return 2;
            }
        }
        //Conferir Diagonal Principal
        if(tabuleiro[0][0] != '-' && tabuleiro[0][0] == tabuleiro[1][1] && tabuleiro[1][1] == tabuleiro[2][2]){
            if(tabuleiro[0][0 == 'X']){
                return 1;
            }else{
                return 2;
            }
        }
        // Conferir Diagonal Secundária
        if(tabuleiro[0][2] != '-' && tabuleiro[0][2] == tabuleiro[1][1] && tabuleiro[1][1] == tabuleiro[2][0]){
            if(tabuleiro[0][2] == 'X'){
                return 1;
            }else{
                return 2;

            }
        }
    return 0;
}

int reset(){
    int opcao;
    printf("Deseja Reiniciar o Jogo? ");
    printf("\n1- Reiniciar o Jogo");
    printf("\n2- Sair do Jogo");
    printf("\nEscolha: ");
    scanf("%d", &opcao);

    if (opcao == 1){
        limpartela();
        menu();
    }

}

void jogo(){


    char nome1[20]; // Nome Jogador 1
    char nome2[20]; // Nome Jogador 2
    char nomeatual[0]; // Nome de quem está jogando
    char tabuleiro[100][100];
    int linha,coluna;
    int linhajogada,colunajogada;
    int partida = 1; // Situaçao da Partida
    int turno = 1; // Turno dos Jogadores
    int rodada = 0; // Numero de Vezes Jogadas
    int i;
    int ordem_da_matriz;
    
    printf("Digite o nome do Jogador 1: ");
    scanf("%s",nome1);
    printf("Digite o nome do Jogador 2: ");
    scanf("%s",nome2);

    iniciatab(tabuleiro);

    while (rodada < i && partida == 1){
        limpartela();
        exibetab(tabuleiro);

        printf("Rodada: %d\n", rodada);

        //Muda o nome conforme o turno

        if(turno == 1){
            nomeatual == nome1;
        }else{
            nomeatual == nome2;
        }

        //Le a Posição Desejada

        printf("%s, Escolha uma Linha: ", nomeatual);
        scanf("%d", &linhajogada);
        printf("%s, Escolha uma Coluna: ", nomeatual);
        scanf("%d", &colunajogada);


        if(turno == 1){
            tabuleiro[linhajogada][colunajogada] = 'X';
            turno = 2;

        }else{
            tabuleiro[linhajogada][colunajogada] = 'O';
            turno = 1;
        }

        if (conferetabuleiro(tabuleiro) == 1){
            printf("\nO Jogador X Venceu\n");
            partida = 0;
        }else if(conferetabuleiro(tabuleiro) == 2){
            printf("\nO Jogador O Venceu\n");
            partida = 0;
        }
        
        
        
        rodada++;
    }
    
    exibetab(tabuleiro);
    printf("Fim de jogo");
    reset();
}

void menu(){
    int opcao;
    while (opcao < 1 || opcao > 2){
    printf("Jogo da Velha");
    printf("\n1 - Jogar");
    printf("\n2 - Sair\n");
    printf("Escolha uma Opcao: ");

    scanf("\n%d",&opcao);

    switch(opcao){
    case 1:
        //printf("Teste");
        jogo();
        break;
    case 2:
        printf("JOGO FINAIZADO");
        break;
        }
    }
}

int main(){
    
    menu();

    return 0;
}

 

  • Curtir 1
Postado

Escreva em torno dos dados. Crie uma estrutura Jogo com a largura do tabuleiro e o endereço da matriz e passe o endereço dela em todas as funções. É o conceito de encapsulamento.

  • Curtir 1
  • Haha 1
Postado
1 hora atrás, LeGideon disse:

Não conheco esse conceito, vou dar uma pesquisada, obrigado

 

Se não entendeu o que seria pode perguntar. É um forum e assim ajuda mais a outros do que se for pesquisar sozinho...

 

Isso abaixo já seria um grande avanço em relação ao modo como escreveu. 

 

typedef struct
{
    unsigned ordem;  // largura do tabuleiro
    char*    tab;    // o tabuleiro do tamanho certo

} Tabuleiro;

Tabuleiro* apagar(int largura);
int        conferir(Tabuleiro* T);
Tabuleiro* criar(Tabuleiro* T, unsigned largura);
int        jogo(Tabuleiro* T);
int        mostrar(Tabuleiro* T, const char* tit);  // tit opcional

char       menu();  // mostra o menu e retrna a opcao

 

Mas se não quer usar alocação dinâmica um tabuleiro assim já serviria
 

typedef struct
{
    unsigned ordem;  // largura do tabuleiro
    char*    tab[100][100];  // o tabuleiro gigante

} Tab_XL;

 

Seu programa ainda tem muitos problemas e vai ter muito rabalho a oa por escrever assim:

  • declare as variaveis de controle DENTRO do loop
  • não use system()
  • se tem um menu retorne a opção
  • não coloque a lógica do programa DENTRO do menu. Não faz sentido
  • não use nomes gigantes para coisas que escreve toda hora.
  • um printf() de 4 linhas é dezenas de vezes mais lento e difícil de ler em relação a um prinf() de 4 linhas.
  • TESTE o retorno de scanf/ É ingênuo seguir sem ler
  • NUNCA use void f(void). É um desastre.

 

 

É um pouco estranho imaginar um tabuleiro para jogo da velha interativo com 10.000 posições.

 

De todo modo se o tabuleiro fosse assim fixo (sem alocar um tamanho na hora)

 

veja esse exemplo

 

#include <stdio.h>

typedef struct
{
    unsigned largura;        // largura do tabuleiro
    char     tab[100][100];  // o tabuleiro do tamanho certo

} Tab_XL;

int confere_tabuleiro(Tab_XL*);

int main(void)
{
    Tab_XL t1 = {
        .largura = 3, // o normal
        .tab = {0}    // tudo zerado
    };

    int res = confere_tabuleiro(&t1);
    printf("\
    Em main: confere_tabuleiro() retornou %d\n\
    Valor da ultima casa do tabuleiro: '%c'\
\n",
        res, t1.tab[t1.largura - 1][t1.largura - 1]);
    return 0;
}

int confere_tabuleiro(Tab_XL* t)
{
    int l = t->largura - 1;  // a largura
    printf("Largura do tabuleiro: %d\n",t->largura);
    t->tab[l][l] = 'X';
    return 42;
}

 

E veja como é mais simples até de ler.

 

O programa declara um tabuleiro 3x3 e coloca um 'X'na última posição na função que confere. Só para ajudar a entender a maneira comum de escrever isso

 

O programa mostra

 

Largura do tabuleiro: 3
    Em main: confere_tabuleiro() retornou 42
    Valor da ultima casa do tabuleiro: X

 

  • Curtir 1
  • 1 ano depois...
Postado

@kgin

Boa Tarde 

 

Tua expressão joga da velha não abriu.

E esse exercício do jogo é de nível intermediário nas MATRIZES, sendo que essas são as únicas abstrações necessárias à solução.

 

E MATRIZES!!!

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!