Ir para o conteúdo
josantantunes

Ajuda no jogo 4 em linha

Mensagens Recomendadas

josantantunes    0
josantantunes

Eu tou na recta final do jogo e nao tou a conseguir criar o algoritmo para ver qando o jogo acaba (ou seja faz 4 em linha)

Se me poderem ajudar, agradecia...

Abraço

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

char tabuleiro[6][7];  

int inicio(void);
void inicia_tabuleiro(void);
void mostra_tabuleiro(void);
void jogada(int n, int jog, int tipo);
int jogada_Player(int jog);
void jogada_COM(int jog);
char fim_jogo(int n);
void finaliza(int ti, char venc); 


int main(void)
{
  char fim;
  int n, jog, tipo;

  printf("4 EM LINHA Eng.Electronica\n");
  tipo = inicio();
  fim = ' '; n = 0; jog = 0;
  inicia_tabuleiro();

  do {
    n++; if (jog==1) jog = 2; else jog = 1;
    printf("Jogada %d \n \n", n);
    mostra_tabuleiro();
    jogada(n, jog, tipo);
    fim = fim_jogo(n);  
  } while(fim == ' ');

  finaliza(tipo,fim);
  
  system("PAUSE");
  return 0;
}


void inicia_tabuleiro(void)
{
  int x, y;

  for(x=1; x<=6; x++)
    for(y=1; y<=7; y++) 
             tabuleiro[x][y] =  ' ';                   
}

void mostra_tabuleiro(void)
{
  int x;  
    printf("    | 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
    printf("    |---|---|---|---|---|---|---|\n");
  for(x=1; x<=6; x++) {
    printf("    | %c | %c | %c | %c | %c | %c | %c |\n",tabuleiro[x][1],tabuleiro[x][2],tabuleiro[x][3],tabuleiro[x][4],tabuleiro[x][5],tabuleiro[x][6],tabuleiro[x][7]);
   if (x!=0) 
    printf("    |---|---|---|---|---|---|---|\n");
  }
  printf("\n");
}



int inicio(void)
{
    int ti;
    printf("Escolha um modo de jogo: \n");
    printf("1-Player/Player 2-Player/COM 3-COM/Player 4-COM/COM\n"); 
    scanf("%d",&ti);
    if(ti<1 || ti>4){
            printf("Opcao invalida, tente novamente.\n");
            inicio();
            }
    return ti;
}



void finaliza(int ti, char venc)
{
     if (venc=='E') printf("\nEmpate!\n");
     else if (venc=='X' && ti<4 || venc=='O' && (ti==1 || ti==4)) 
        printf("\nPlayer Venceu!\n");
        else printf("\nA Maquina Venceu!!!!\n");
     mostra_tabuleiro();
}



void jogada(int n, int jog, int tipo)
{
   
     if (n % 2 == 1) {
           if (tipo<=2) jogada_Player(jog); else jogada_COM(jog);
     }
     else { 
          if (tipo==1 || tipo==3) jogada_Player(jog); else jogada_COM(jog);
     }
}



int jogada_Player(int jog)
{
  int x, y, z, w, a, b, c, d, e;
  
  z=6;
  w=6;
  a=6;
  b=6;
  c=6;
  d=6;
  e=6;
  
  
   for(x=1; x<=6; x++){
           if(tabuleiro[x][1]!= ' ') z--;
           }
  for(x=1; x<=6; x++){
           if(tabuleiro[x][2]!= ' ') w--;
           }  
  for(x=1; x<=6; x++){
           if(tabuleiro[x][3]!= ' ') a--;
           }
  for(x=1; x<=6; x++){
           if(tabuleiro[x][4]!= ' ') b--;
           }          
  for(x=1; x<=6; x++){
           if(tabuleiro[x][5]!= ' ') c--;
           }
  for(x=1; x<=6; x++){
           if(tabuleiro[x][6]!= ' ') d--;
           }  
  for(x=1; x<=6; x++){
           if(tabuleiro[x][7]!= ' ') e--;
           }                
  
  if(z<1 && y==1){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  if(w<1 && y==2){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  if(a<1 && y==3){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  if(b<1 && y==4){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  if(c<1 && y==5){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  if(d<1 && y==6){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  if(e<1 && y==7){
         printf("Jogada invalida!\n");
         jogada_Player(jog);
                 }
  
  printf("Selecione a coluna pretendida: ");
  scanf("%d",&y);
  

  if(y<1 || y>7){
    printf("Jogada Invalida, tente novamente.\n");
    jogada_Player(jog);
  }
  
if(y==1){
           if (jog==1) tabuleiro[z][1] = 'X'; else tabuleiro[z][1] = 'O';
           return 1; 
           }
  if(y==2){
           if (jog==1) tabuleiro[w][2] = 'X'; else tabuleiro[w][2] = 'O';
           return 1;
           }
  if(y==3){
           if (jog==1) tabuleiro[a][3] = 'X'; else tabuleiro[a][3] = 'O';
           return 1;
           }
  if(y==4){
           if (jog==1) tabuleiro[b][4] = 'X'; else tabuleiro[b][4] = 'O';
           return 1;
           }
  if(y==5){
           if (jog==1) tabuleiro[c][5] = 'X'; else tabuleiro[c][5] = 'O';
           return 1;
           }
  if(y==6){
           if (jog==1) tabuleiro[d][6] = 'X'; else tabuleiro[d][6] = 'O';
           return 1;
           }
  if(y==7){
           if (jog==1) tabuleiro[e][7] = 'X'; else tabuleiro[e][7] = 'O';
           return 1;
           }
  
  
  }



void jogada_COM(int jog)
{
  int x, y;
    
  for(x=1; x<=6; x++)
    for(y=1; y<=7; y++)
       if(tabuleiro[x][y]==' ') {
          if (jog==1) tabuleiro[x][y] ='X'; else tabuleiro[x][y] ='O'; 
          return ;
       } 
  return;
}





char fim_jogo( int n)                                //objectivo: avaliar se o jogo acabou (4emlinha empate) ou nao
{
int i;
int j;

  for(i=0; i<6; i++){
    for(j=0; j<4; j++){                                   //testar 4 em linha linhas
             if(tabuleiro[i][j]==tabuleiro[i][j+1] && tabuleiro[i][j+2]==tabuleiro[i][j+3] && tabuleiro[i][j]==tabuleiro[i][j+3] && tabuleiro[i][j]!=' ')
                 return tabuleiro[i][j];}}

  for(i=0; i<6; i++){
    for(j=0; j<4; j++){                                   //testar 4 em linha nas colunas
             if(tabuleiro[j][i]==tabuleiro[j+1][i] && tabuleiro[j+2][i]==tabuleiro[j+3][i] && tabuleiro[j][i]==tabuleiro[j+2][i] && tabuleiro[j][i]!=' ')
                 return tabuleiro[j][i];}}

  for(i=0; i<4; i++){
    for(j=0; j<3; j++){                                   //testar 4 em linha diagonais1 começar em cima
             if(tabuleiro[j][i]==tabuleiro[j+1][i+1] && tabuleiro[j+2][i+2]==tabuleiro[j+3][i+3] && tabuleiro[j][i]==tabuleiro[j+2][i+2] && tabuleiro[j][i]!=' ')
                 return tabuleiro[j][i];}}
                 
   for(i=0; i<4; i++){
    for(j=5; j>2; j--){                                   //testar 4 em linha diagonais2 começar em baixo
             if(tabuleiro[j][i]==tabuleiro[j-1][i+1] && tabuleiro[j-2][i+2]==tabuleiro[j-3][i+3] && tabuleiro[j][i]==tabuleiro[j-2][i+2] && tabuleiro[j][i]!=' ')
                 return tabuleiro[j][i];}}
                 
  if (n==42) return 'E'; 
   
  return ' ';

}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Nao precisas de analisar o tabuleiro todo para ver se tens 4-em-linha. Basta que analises as 4 direccoes (nos dois sentidos) a partir da ultima peça jogada.

Isto é C++? ???

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Flinger    50
Flinger

:D pegas num programa c, mudas a extensão do ficheiro para cpp, compilas com o g++, e voilá, c++.

ps: há uns anos tentei fazer o mesmo para Haskell... resultado: chumbo!!! Bolas

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Isto para mim é C. Não vejo nada de C++ aqui. A partir do momento em que é possível compilar o programa com um compilador de C, dizer que é C++ é a modos que ridículo.

void mostra_tabuleiro(void)
{
  int x;  
    printf("    | 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
    printf("    |---|---|---|---|---|---|---|\n");
  for(x=1; x<=6; x++) {
    printf("    | %c | %c | %c | %c | %c | %c | %c |\n",tabuleiro[x][1],tabuleiro[x][2],tabuleiro[x][3],tabuleiro[x][4],tabuleiro[x][5],tabuleiro[x][6],tabuleiro[x][7]);
   if (x!=0) 
    printf("    |---|---|---|---|---|---|---|\n");
  }
  printf("\n");
}

Podias fazer isto com 2 ciclos sem teres que definir instruções gigantes. Para além disso, não percebo porque é que não utilizas o índice zero da matriz.

int x, y;
printf("    ");
for(x = 0; x < BOARD_HEIGHT; x++) {
    for(y = 0; y < BOARD_WIDTH; y++) {
        printf("| %c ",tabuleiro[y][x]);
    }

    printf("|\n");
}

As verificações também deviam ser completamente agnósticas do posicionamento e, como o pmg disse, é fácil se verificares o tabuleiro apenas para a linha, coluna e as duas diagonais da última jogada efectuada. No fundo conseguirias fazer isso com um único ciclo que faria simultaneamente 4 verificações.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
josantantunes    0
josantantunes

Sim, tens razão.. EU apenas confiei no meu professor..

Eu já tenho a função qe lê as linhas, colunas e diagonais, apenas nao sei como criar o algoritmo qe define o jogo cm empate, vitoria do Player ou do COM.. Tou a dar em maluco ..

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Deixa o 4-em-linha 2D em paz um bocadinho ...

Faz um programa que determine se ha 4 'X' seguidos numa string. por exemplo: "XXOOOXXXXXOOO"?

Tenta fazer o maior numero de funcoes que conseguires imaginar possivel.

Altera e aplica as funcoes desse programa de 4-em-linha 1D ao teu programa em 2D.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade