Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

vmra

Corrigir e optimizar jogo do 4 em linha

Mensagens Recomendadas

vmra    0
vmra

#include <stdio.h>  //input-output - necessario para scanf e printf
#include <stdlib.h> //standard lib contém função PAUSE
#include <string.h>  
#include <time.h>    


char mat[6][7]; //definiçao da matriz do tabuleiro

void tipo_jogo()                   //da a oportunidade de escolha do tipo de jogo ao utilizador
{
    int tipo;
    do{
     printf("Qual modo que pretende jogar:\n1-Humano x Humano\n\n2-Humano x PC\n\n3-PC x Humano\n\n4-PC x PC\n\n");
     scanf("%d", &tipo);
     } while(tipo>4 || tipo<0);
}
void inicia_mat()
{
     int i, j;
     printf("\7\n   Bem Vindo ao \"4 em Linha\" \n\n");
     printf("\t   TABULEIRO\n\n");
     for(i=0; i<=5; i++) {
              for(j=0; j<=6; j++) {
                       mat [i][j]=' ';
                         }
                                  }
}
void mostra_mat()
{
     int i,j;
     printf("   1 | 2 | 3 | 4 | 5 | 6 | 7\n");
     printf("  ___________________________\n");
     for(i=0; i<=5; i++) {
              printf("%d|",i+1);
              for(j=0; j<=6; j++) {
                        printf(" %c |", mat[i][j]);
                         } 
              
    printf("\n |___|___|___|___|___|___|___|\n");
                                  }
    printf("  ____________________________\n");
    printf("   1 | 2 | 3 | 4 | 5 | 6 | 7\n\n");


}

void pede_jogada(int &x, int &y)            //funçao que se atribui os valores necessarios para a jogada atraves de multiplos switches
{                    
     int coluna;
     
     
     printf("Em que coluna gostaria de jogar?: ");              
     scanf("%d", &coluna);                                                 
     if(coluna<8 && coluna>0) {x=7; y=coluna;}
     else {printf("\nNumero da coluna incorrecto\n");
     pede_jogada(x, y);}

}
void jogada_PC(int &x, int &y)
{ 
     
     int i, j;           
     int coluna;
     coluna=rand() %7;
     printf("\nO PC jogou na coluna ''[%d]''\n", coluna);                
     if(coluna<7 && coluna>0) {x=6; y=coluna+1;}
     
}
char fim( int num_jogadas, char mat[6][7])                                //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(mat[i][j]==mat[i][j+1] && mat[i][j+2]==mat[i][j+3] && mat[i][j]==mat[i][j+3] && mat[i][j]!=' ') 
                 return mat[i][j];}}

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

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

}
/*void faz_jogada()
{
     int c,tipo;
     int  x,y;
     int num_jogadas;
     int coluna;
     
     if(tipo==2 && c==1) pede_jogada(x, y);
      else if(tipo==2 && c==2) jogada_PC(x, y);
      else if(tipo==3 && c==1) jogada_PC(x, y);
      else if(tipo==3 && c==2) pede_jogada(x, y);
      else if(tipo==4 && num_jogadas<42) jogada_PC(x, y);
      else pede_jogada(x,y);
           
}*/

void acabar_jogo(char fim, int tipo)                                      //pretende finalizar o jogo informando quem ganhou
{
     if(tipo==1 && fim=='1') printf("\n\tJogador 1 venceu!!\n\n");
     else if(tipo==1 && fim=='2') printf("\n\tJogador 2 Venceu!!\n\n");
     else if(tipo==2 && fim=='1') printf("\n\tVoce venceu o PC!!\n\n");
     else if(tipo==2 && fim=='2') printf("\n\tO PC venceu!!\n\n");
     else if(tipo==3 && fim=='1') printf("\n\tO PC venceu!!\n\n");
     else if(tipo==3 && fim=='2') printf("\n\tVoce venceu o PC!!\n\n");
     else if(tipo==4 && fim=='1') printf("\n\tO PC(1) venceu!!\n\n");
     else if(tipo==4 && fim=='2') printf("\n\tO PC(2) venceu!!\n\n");
     else printf("O jogo ficou empatado!!\n\n");
     
     printf("\a");
}
int main(void)         
{
  
  inicial:
  srand (time(NULL));            //random
  char mat[6][7];      //definiçao da matriz do tabuleiro
  int x, y;
  int i, j; 
  int k=2;
  char final;
  int num_jogadas=0;          
  char fim = '.';
  int tipo;
  char reinicio;
  
  tipo_jogo();
  inicia_mat();                           
  mostra_mat();
  do{
      num_jogadas++;
      printf("Jogada Numero: %d\n", num_jogadas);
      if(k==2) k=1; else k=2;
      printf("Jogador [%d]: \n", k);
     // faz_jogada();
      
      jogada:
      if(tipo==2 && k==1) pede_jogada(x, y);
      else if(tipo==2 && k==2) jogada_PC(x, y);
      else if(tipo==3 && k==1) jogada_PC(x, y);
      else if(tipo==3 && k==2) pede_jogada(x, y);
      else if(tipo==4 && num_jogadas<42) jogada_PC(x, y);
      else pede_jogada(x,y);
      
                                                                        
           {    if(k==1)     {for (i=1;i<=8;i++){   if(mat[x-i][y-1]==' ') {mat[x-i][y-1]='1'; goto ciclo;}}printf("\tColuna Preenchida, tente novamente:\n"); goto jogada;}
           
           else if(k==2)     {for (i=1;i<=8;i++){   if(mat[x-i][y-1]==' ') {mat[x-i][y-1]='2'; goto ciclo;}}printf("\tColuna Preenchida, tente novamente:\n"); goto jogada;}
           
           else {printf("\nCasa Preenchida! Tente Novamente!\n"); goto jogada;}}
          
      
      ciclo:
      printf("\n");
      mostra_mat();
      final/*(num_jogadas, mat)*/;
      fim = final; //(num_jogadas, mat);
      printf("\n'%c'\n", fim);
      if(fim!=' ') goto finalizar;
      } while(fim != ' ' || num_jogadas<42);                
  
  finalizar:
  acabar_jogo(fim, tipo);
  de_novo:
  printf("Gostaria de jogar outra vez? (sim(s)/nao(n)): ");                //da a opçao se gostaria de reiniciar o programa
  scanf("%c", &reinicio);
    
  if(reinicio=='s') goto inicial;
  else if(reinicio=='n') goto terminar;
  else goto de_novo;
  
  terminar:  
  printf("\nEspero que tenha gostado!\n\n");  
  system("PAUSE");    
  return 0;    
      
}

este é o codigo de um jogo de 4 em linha que eu fiz mas estou com alguns problemas:

1-quando escolho o tipo de jogo pc x pc, pedem me coordenadas quando isso nao devia acontecer, logicamente porque nao sou eu a jogar

2-quando jogo diz me sempre que a coluna esta preenchida

3-nao arranjei alternativa para os "goto" e gostavam que me dessem alguma

desculpem o incomodo, obrigado B)

ignorem os comentarios

EDIT: alterado título e adicionado Geshi (softklin)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Em C++ não deves usar os headers <stdio.h>, <stdlib.h>, <string.h>, <time.h>, etc...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
taviroquai    61
taviroquai

1-quando escolho o tipo de jogo pc x pc, pedem me coordenadas quando isso nao devia acontecer, logicamente porque nao sou eu a jogar

Essa é a parte mais fixe da programação :cheesygrin:

Ve aqui algumas tacticas para programares http://en.wikipedia.org/wiki/Tic-tac-toe#Strategy

Depois, seria interessante registar os jogos e assim, o computador "aprendia" sabendo que jogadas o levaram à derrota B)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

O teu código é quase esparguete. Não conseguiste meter mais goto's no código? Se não queres fazer nested loops, podes sempre dividir o código por métodos em vez de criares ciclos com recurso a goto.

Para além disso, se isto é suposto ser C++, é um estilo de programação extremamente procedimental. Não estás a aproveitar nada do que o C++ trouxe à programação.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Flinger    50
Flinger

:S Nunca tinha visto tanto goto por caracter quadrado :)

É possivel refazer isso sem eles, aliás, aconselho-te a fazê-lo. Pelo aspecto disso, o código foi batido por alguém habituado ao VB :)

No entanto, não é um processo directo. Não o vais fazer trocando meia-dúzia de instruções. Tens de refazer a lógica de programação de modo a usar a lógica de ciclos de forma a chegares onde queres.

Dou-te um exemplo:

do
{
  //codigo do jogo;
...
  do{
        printf("Deseja terminar? \n")
        scanf("%c",&opcao);
      }while(opcao != 's' && opcao !='n'); 
}while(opcao!='s')

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 a nossa Política de Privacidade