Ir ao conteúdo
  • Cadastre-se

Jogo ligue quatro


Posts recomendados

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();
        }
    }
}
 

 

Link para o comentário
Compartilhar em outros sites

  • 8 meses depois...

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.

 

 

 

 

 

 

 

 

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...