Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Pedro José Melo de Oliveir

Jogo ligue quatro

Recommended Posts

Boa noite, alguém poderia me ajudar no jogo ligue 4?! Obrigado desde já, segue o código:

 

#include <stdio.h>
#include <stdlib.h>
char jogador= 'X';
char tab[6][7];
int ganhador, rodada, empatou;
int linha, coluna;
void ExibeTabuleiro()
{
    int i, j;
    printf("\n");
    for( i=0; i<6; i++)
    {
        for(j=0; j<7; j++)
        {
            if(j==0)
            {
                printf("| %c |",tab[0]);
            }
            else
            {
                printf(" %c |",tab[j]);
            }
        }
        printf("\n");
    }
    printf("+---------------------------+\n");
}
void TrocarJogador ()
{
    {
        if (jogador =='X')
        {
            jogador = '0';
        }
        else
        {
            jogador = 'X';
        }
    }
}
void Jogada()
{   rodada= 0;
    int a,b;
    printf("Jogador %c, informe a coluna da sua jogada: ", jogador);
    scanf("%d",&coluna);
    while(coluna<0 || coluna>6)
    {
        printf("Coluna invalida! Digite outro valor para coluna: \n");
        scanf("%d", &coluna);
    }
    coluna --;
    linha=5;
    while(tab[linha][coluna]!= ' ')
    {
        if(linha>=0)
        {
            linha --;
        }
        else
        {
            printf("Essa coluna esta cheia. Informe outra coluna:");
            scanf("%d", &coluna);
            linha=5;
        }
    }
    rodada ++;
}
int vencer()
{
    int i, j,a,b;
    for(i=0; i<6; i++) // PECORRE AS LINHAS DO TABULEIRO
    {
        for(j=0; j<4; j++) // PERCORRE AS COLUNAS DO TABULEIRO
        {
            if(tab[j]==tab[j+1] && tab[j+2]==tab[j+3] &&tab[j]==tab[j+3] && tab[j]!=' ') // GANHA POR LINHA
                printf("O jogador %c ganhou. PARABENS!\n",jogador);
            ganhador=1;
        }
    }
    for(i=0; i<6; i++)
    {
        for(j=0; j<4; j++)
        {
            if(tab[j]==tab[j+1] && tab[j+2]==tab[j+3] && tab[j]==tab[j+2] && tab[j]!=' ') // GANHA POR COLUNA
                printf("O jogador %c ganhou. PARABENS!\n",jogador);
            ganhador=1;
        }
    }
    for(i=0; i<4; i++)
    {
        for(j=0; j<3; j++)
        {
            if(tab[j]==tab[j+1][i+1] && tab[j+2][i+2]==tab[j+3][i+3] && tab[j]==tab[j+2][i+2] && tab[j]!=' ') // GANHA NA DIAGONAL "PRINCIPAL"
                printf("O jogador %c ganhou. PARABENS!\n",jogador);
            ganhador=1;
        }
    }
    for(i=0; i<4; i++)
    {
        for(j=5; j>2; j--)
        {
            if(tab[j]==tab[j-1][i+1] && tab[j-2][i+2]==tab[j-3][i+3] && tab[j]==tab[j-2][i+2] && tab[j]!=' ') // GANHA NA DIAGONAL "SECUNDARIA"
            {
                printf("O jogador %c ganhou. PARABENS!\n",jogador);
                ganhador=1;
            }
        }
    }
    if(rodada==43)
        {
            printf("\t\t\nEmpatou!!!\n");
            return 2;
        }

    return ganhador;
}
void LimpaTabuleiro()
{
    int i,j;
    for(i=0; i<6; i++) //PREENCHENDO O TABULEIRO COM ESPA�OS
    {
        for(j=0; j<7; j++)
        {
            tab[j]=' ';
        }
    }
    rodada=1;
    ganhador=0;
}
int main()
{
    printf("---------------------------------------------------------------------------\n|  Sejam bem-vindos ao LIGUE QUATRO.                                         |\n|  Esse jogo tem o simples objetivo de organizar quatro discos em uma fileira.|\n|  Valem tanto linhas horizontais como verticais e diagonais. Boa sorte!      |\n-------------------------------------------------------------------------------\n\n\n\n");
    while(1==1)
    {
        LimpaTabuleiro();
        while (ganhador!=1 || ganhador!=2)
        {
            Jogada();
            ExibeTabuleiro();
            vencer();
            TrocarJogador();
        }
    }
}
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagine que você tem uma matriz com a seguinte jogada.

Screenshot_4.jpg.d8fa9da14d2b0641f6a5fcbc77bcdb2b.jpg


supondo que o jogador vermelho é 1 e azul fosse 2 você teria uma matriz assim:

 

int m[6][7] = {
    {1,0,0,0,0,0,0},
    {0,1,0,0,0,0,0},
    {0,0,1,0,0,0,0},
    {0,0,0,1,0,0,0},
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0}
};

Obviamente essa jogada é impossível pois o jogador azul não teria jogado ainda, mas para nosso exemplo servirá perfeitamente para buscar uma forma de saber se o jogador 1 ganhou ou não.

No vetor podemos ver que para ganhar em diagonal deveria ter pedras nas casinhas v[0][0], v[1][1], v[2][2] e v[3][3]. Se tivéssemos 2 variaveis chamadas linha e coluna dessa forma:
int linha = 0;
int coluna = 0;
poderíamos ver que as posições das pedras em relação com a primeira são:
v[linha][coluna]
v[linha+1][coluna+1]

v[linha+2][coluna+2]

v[linha+3][coluna+3]


Com isso mesmo que a jogada for outra todas as pedras terão a mesma disposição em relação a primeira de todas. É dizer... se a 1º pedra tiver na posição v[0][3] tal como na imagem
Screenshot_5.jpg.513322c9d78da7e6eca9f4925eb252ba.jpg


As seguintes estão a
linha = 0;
coluna = 3;

v[linha][coluna] = 1; //1ª pedra
v[linha+1][coluna+1] = 1; // 2ª pedra em relação com a 1ª

v[linha+2][coluna+2] = 1; // 3ª pedra em relação com a 1ª

v[linha+3][coluna+3] = 1; // 4ª pedra em relação com a 1ª

Esses dados representariam isso:
Screenshot_6.jpg.bbf7b1aa183dcf900ce46308b3af76ef.jpg

 

Então basta saber onde está a primeira pedra para saber se as 3 seguintes se encontram nas posições corretas, isso daria a vitória para o jogador vermelho(1).

Bom vamos falar em código....
Como podemos montar algo que faça isso para nós? Fácil! Podemos criar uma função que receba a matriz e a primeira peça, assim a função retornaria true em caso de vitória, e false em caso de que não haja vencedor e nesse caso deveria passar a analisar a segunda pedra do tabuleiro. Vamos ver um exemplo:
 

#include<stdio.h>

int comprovarDiagonal(int m[][7], int linha, int coluna){
    //caso para diagonal para jogador 1
    if ( 
        m[linha][coluna]     == 1 &&
        m[linha+1][coluna+1] == 1 &&
        m[linha+2][coluna+2] == 1 &&
        m[linha+3][coluna+3] == 1      
    ){ return 1; }
    
    //caso para diagonal para jogador 2
    if ( 
        m[linha][coluna]     == 2 &&  //1ª pedra
        m[linha+1][coluna+1] == 2 &&  //2ª pedra em relação a 1ª
        m[linha+2][coluna+2] == 2 &&  //3ª pedra em relação a 1ª
        m[linha+3][coluna+3] == 2     //4ª pedra em relação a 1ª
    ){ return 2; }
    
    return 0;
}

int main(){
    
    int m[7][7] = {
        {1,0,0,0,0,0,0},
        {0,1,0,0,0,0,0},
        {0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0},
        {0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0}
    };
    
    int linha = 0;
    int coluna = 0;
    if ( comprovarDiagonal( m,  linha, coluna) == 1 ) {
        printf("jogador 1 ligou as 4 pedras!!!\n\n");
    }else if( comprovarDiagonal( m,  linha, coluna) == 2 ){
        printf("jogador 2 ligou as 4 pedras!!!\n\n");
    }else{
        printf("não ligou as pedras\n\n");
    }

    return 0;
}


se trocar as pedras para 2 você verá que o programa mostrará o mensagem para o jogador 2.

 

 

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×