Ayuda! Problema de un menu!!!

Iniciado por mathias_vg, 1 Julio 2013, 22:28 PM

0 Miembros y 1 Visitante están viendo este tema.

eferion

Me refería a algo más o menos así...

Fíjate que mi main tiene unas 40 líneas frente a las 200 del tuyo... aparte de que el mío funciona jejejeje.

Serás capaz de terminarlo??

Hay cosas que habría hecho de forma diferente, pero he intentado mantener el estilo de tu programa.

Código (cpp) [Seleccionar]
//* JUEGO CONECTA 4*//

/*Librerias utilizadas*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define LENGTH_JUGADOR    40
#define LENGTH_CEDULA     8
#define MAX_PARTIDAS      20
#define DIM               16 //Constante utilizada para definir la maxima dimension del tablero

/* Estructuras */

struct jugador
{
 char nom_jug[ LENGTH_JUGADOR + 1 ];
 char ced_jug[ LENGTH_CEDULA + 1 ];
};

struct partida
{
 // Para almacenar los datos del jugador1
 struct jugador jugador1;

 // Para almacenar los datos del jugador2
 struct jugador jugador2;

 // Almacena 1 ( ganador jugador 1 ) o 2 ( ganador jugador 2 ).
 int ganador;
};

struct manager_partidas
{
 // Almacena todas las partidas jugadas
 struct partida partidas[ MAX_PARTIDAS ];

 // Indica la partida actual
 int num_partida;
};

/*PROCEDIMIENTOS Y FUNCIONES*/

void pausa( );
int mostrar_menu( int );
int calcula_numero_jugadores( struct partida* );
void pedir_datos_jugador( struct jugador* );
void mostrar_resultados( struct manager_partidas* );

void inicializar_tablero(char tablero[][DIM],int);
int juegan_O_(char tabla[][DIM],int,int);
int juegan_X_(char tablero[][DIM],int,int);
int cuatro_en_linea(char tablero[][DIM],int);
int limpiar(char nom_jug[]);

int main()
{
 char tablero[ DIM ][ DIM ];
 int numero_jugadores = 0;
 int opcion = -1;

 // Se inicializa la estructura de las partidas
 struct manager_partidas manager;
 memset( &manager, 0, sizeof( manager ) );

 while ( opcion != 5 )
 {
   // Puntero a la partida actual... para evitar líneas de código
   struct partida* partida_actual = &manager.partidas[ manager.num_partida ];

   // Se comprueba el número de jugadores en la partida actual
   numero_jugadores = calcula_numero_jugadores( partida_actual );

   opcion = mostrar_menu( numero_jugadores );

   switch ( opcion )
   {
     case 1:
       pedir_datos_jugador( &partida_actual->jugador1 );
       break;

     case 2:
       pedir_datos_jugador( &partida_actual->jugador2 );
       break;

     case 3:
       // Se simula una partida, para ello se elige un ganador
       // y se incrementa el contador de la partida
       partida_actual->ganador = ( manager.num_partida % 2 );
       ++manager.num_partida;

       // Jugar
       break;

     case 4:
       // Se pasa una referencia para no copiar toda la estructura
       mostrar_resultados( &manager );
       break;

     case 5:
       break;
   }
 }
}

void pausa( )
{
 printf( "\nPulse una tecla para continuar..." );
 fseek( stdin, 0, SEEK_END);
 getchar( );
}

int mostrar_menu( int numero_jugadores )
{
 int ok = 0;
 int opcion = -1;

 while ( !ok )
 {
   // Limpiamos el buffer, por si acaso
   fseek( stdin, 0, SEEK_END);

   system( "cls" );
   printf( "\n\n\n     JUEGO CUATRO EN LINEA\n\n\n\n\n" );
   printf( "  1) Ingresar datos del primer jugador\n\n" );
   printf( "  2) Ingresar datos del segundo jugador\n\n" );
   printf( "  3) Jugar\n\n" );
   printf( "  4) Listar todos los juegos realizados\n\n" );
   printf( "  5) Salir\n\n\n" );

   if ( opcion == 3 )
   {
     printf( "  Error: Antes de jugar debe ingresar los datos de los dos jugadores. \n\n\n" );
     printf( "  REINGRESE SU OPCION: " );
   }
   else if ( opcion != -1 )
   {
     printf( "  Opcion incorrecta \n\n\n" );
     printf( "  REINGRESE SU OPCION: " );
   }
   else
   {
     printf( "INGRESE SU OPCION: " );
   }

   scanf( "%d", &opcion );
   if ( opcion == 3 )
     ok = ( numero_jugadores == 2 );
   else
     ok = ( opcion > 0 && opcion < 6 );
 }

 return opcion;
}


int calcula_numero_jugadores( struct partida* partida )
{
 int jugadores = 0;

 if ( partida->jugador1.nom_jug[ 0 ] != '\0' )
   ++jugadores;

 if ( partida->jugador2.nom_jug[ 0 ] != '\0' )
   ++jugadores;

 return jugadores;
}


void pedir_datos_jugador( struct jugador* jugador )
{
 int ok = 0;

 while ( !ok )
 {
   // Se limpia el buffer de entrada.
   fseek( stdin, 0, SEEK_END);

   printf( "\n Ingrese su Nombre: " );
   scanf("%40[^\n]", jugador->nom_jug );
   ok = ( jugador->nom_jug[ 0 ] != '\0' );

   if ( !ok )
     printf("\n ERROR" );
 }

 ok = 0;
 while ( !ok )
 {
   // Se limpia el buffer de entrada.
   fseek( stdin, 0, SEEK_END);

   printf( "\n Ingrese su cedula: " );
   scanf("%40[^\n]", jugador->ced_jug );
   ok = ( jugador->ced_jug[ 0 ] != '\0' );

   if ( !ok )
     printf("\n ERROR" );
 }

 pausa( );
}

void mostrar_resultados( struct manager_partidas* manager )
{
 if ( manager->num_partida == 0 )
 {
   printf ( "No se han jugador partidas." );
 }
 else
 {
   int i;
   for ( i=0; i<manager->num_partida; ++i )
   {
     printf( "Partida %d\n", i+1 );
     printf( "\n");
     printf( "Jugador 1: %s\n", manager->partidas[ i ].jugador1.nom_jug );
     printf( "Cedula:    %s\n", manager->partidas[ i ].jugador1.ced_jug );
     printf( "Jugador 2: %s\n", manager->partidas[ i ].jugador2.nom_jug );
     printf( "Cedula:    %s\n", manager->partidas[ i ].jugador2.ced_jug );
     printf( "Ganador jugador %d\n\n", manager->partidas[ i ].ganador );
   }
 }

 pausa( );
}

mathias_vg

Bueno eh podido hacer que me almacene las partidas pero lo que no puedo es que me indique el ganador de cada partida alguien me puede ayudar con esto?


Muchas gracias

Nota : en la linea 200 me tira un error cuando cito a la funcion 4 en linea, algeuin sabe porque es?



Código (cpp) [Seleccionar]


    //* JUEGO CUATRO EN LINEA*//


   /*MATHIAS CASTRO*/
    /*4.523.221-8*/

/*Librerias utilizadas*/
#include <stdlib.h>
#include <stdio.h>
#define DIM 16 /*Constante utilizada para definir la maxima dimension del tablero*/
//#define tam_string 40 /*Constante para la cantidad de digitos de los Nombres*/
//#define ced_string 8


struct jugador1{
        char nom_jug1[40];
        char ced_jug1[8];
    }jugador1[500];
struct jugador2{
        char nom_jug2[40];
        char ced_jug2[8];
    }jugador2[500];
struct ganadores{
        char jganador;
    }ganadores[1000];

/*PROCEDIMIENTOS Y FUNCIONES*/

void inicializar_tablero(char tablero[][DIM],int);
int juegan_O_(char tabla[][DIM],int,int);
int juegan_X_(char tablero[][DIM],int,int);
int cuatro_en_linea(char tablero[][DIM],int);
int limpiar(char nom_jug[]);

char nom_jug1[40];
char nom_jug2[40];
char ced_jug1[8];
char ced_jug2[8];
int player1 = 0, player2 = 0;
int main()
{



    char tablero[DIM][DIM];
   
    int x,opcion,victoria=1,nombre1,nombre2,contador=1,correcta=1,aux=1,sumador = 0;
    int ganador=0,temp = 0;
    int part, aux2,aux3;
    do
{
system("cls");
    printf("\n\n\n     JUEGO CUATRO EN LINEA\n\n\n\n\n");
    printf("  1) Ingresar datos del primer jugador\n\n");
    printf("  2) Ingresar datos del segundo jugador\n\n");
    printf("  3) Jugar\n\n");
    printf("  4) Listar todos los juegos realizados\n\n");
    printf("  5) Salir\n\n\n");
    if (contador%2==0)
    {
    printf("  Error: Antes de jugar debe ingresar los datos de los dos jugadores. \n\n\n");
    printf("  REINGRESE SU OPCION: ");
contador--;
    }
    if (correcta%2==0)
    {
    printf("  Opcion incorrecta \n\n\n");
    printf("  REINGRESE SU OPCION: ");
    correcta--;
    }
    if (aux%2==0)
    {
    printf("  No se han realizado juegos. \n\n\n");
    aux--;
    }
   
    scanf("%d",&opcion);
    system("cls");
    switch (opcion)
    {
    case 1:  /*OPCION 1 DEL MENU*/
    {
    limpiar(nom_jug1);
    limpiar(ced_jug1);
    while(getchar() != '\n');
    printf("\n Ingrese su Nombre: ");
    do
    {
    scanf("%39[^\n]",jugador1[player1].nom_jug1);
    if (jugador1[player1].nom_jug1[0]=='\0')
    {
    printf(" ERROR\n");
    printf(" Ingrese nuevamente Nombre: ");
    }
else
{

for (nombre1=0;nombre1<40;nombre1++)
    {
    nom_jug1[nombre1];
    }
}while(getchar() != '\n');
system("cls");
        }while(jugador1[player1].nom_jug1[0]=='\0');
    printf("\n Ingrese su cedula: ");
    do
    {
    scanf("%8[^\n]",jugador1[player1].ced_jug1);   
    if (jugador1[player1].ced_jug1[0]=='\0')
    {
    printf(" ERROR\n");
    printf(" Ingrese nuevamente su cedula: ");
    }
else
{

for (nombre1=0;nombre1<8;nombre1++)
    {
    ced_jug1[nombre1];
    }
        system("cls");
    printf("\n");
}while(getchar() != '\n');
        }while(jugador1[player1].ced_jug1[0]=='\0');
        printf("\n    DATOS INGRESADOS\n");
        printf("\n\n   Nombre ingresado: %s",jugador1[player1].nom_jug1);
    printf("\n\n   Cedula ingresada: %s",jugador1[player1].ced_jug1);
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n presione ENTER para volver al menu");
    jugador1[player1+1]=jugador1[player1];
    break;
    }
    case 2:  /*OPCION 2 DEL MENU*/
    {
limpiar(nom_jug2);
    limpiar(ced_jug2);
    while(getchar() != '\n');
    printf("\n Ingrese su Nombre: ");
    do
    {
    scanf("%39[^\n]",jugador2[player2].nom_jug2);
    if (jugador2[player2].nom_jug2[0]=='\0')
    {
    printf(" ERROR\n");
    printf(" Ingrese nuevamente Nombre: ");
    }
else
{

for (nombre2=0;nombre2<40;nombre2++)
    {
    nom_jug2[nombre2];
    }
}while(getchar() != '\n');
system("cls");
        }while(jugador2[player2].nom_jug2[0]=='\0');
    printf("\n Ingrese su cedula: ");
    do
    {
    scanf("%8[^\n]",jugador2[player2].ced_jug2);   
do

    if (jugador2[player2].ced_jug2[0]=='\0')
    {
    printf(" ERROR\n");
    printf(" Ingrese nuevamente su cedula: ");
    }
else
{

for (nombre2=0;nombre2<8;nombre2++)
    {
    ced_jug2[nombre2];
    }
    system("cls");
    printf("\n");
}while(getchar() != '\n');
        }while(jugador2[player2].ced_jug2[0]=='\0');
       
        printf("\n    DATOS INGRESADOS\n");
        printf("\n\n   Nombre ingresado: %s",jugador2[player2].nom_jug2);
    printf("\n\n   Cedula ingresada: %s",jugador2[player2].ced_jug2);
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n presione ENTER para volver al menu");
   
    jugador2[player2+1]=jugador2[player2];
    break;
    }
    case 3: /*OPCION 3 DEL MENU*/
    {
    if ((jugador1[player1].nom_jug1[0]=='\0') || (jugador2[player2].nom_jug2[0]=='\0'))
    {
    contador++;

    }
    else 
    {
        cuatro_en_linea(tablero,opcion);
        sumador++;
        ganadores[ganador].jganador=cuatro_en_linea();
                    ganador++;
        if(jugador1[player1].nom_jug1[40]==jugador1[player1+1].nom_jug1[40]){
                        jugador1[player1+2]=jugador1[player1+1];
                        player1++;
                    }
                    if(jugador2[player2].nom_jug2[40]==jugador2[player2+1].nom_jug2[40]){
                        jugador2[player2+2]=jugador2[player2+1];
                        player2++;
                    }
        }
        break;
    }
    case 4:
    if (sumador<1)
    {
    aux++;
    }
    else
    {
            part=1;
            aux2=0;
            aux3 = 0;
            for(aux2=0;aux2<sumador;aux2++){
            printf("Partida %d\n",part);
            part++;
            printf("Jugador 1: %s\n",jugador1[aux2].nom_jug1);
            printf("Cedula:    %s\n",jugador1[aux2].ced_jug1);
            printf("Jugador 2: %s\n",jugador2[aux2].nom_jug2);
            printf("Cedula:    %s\n",jugador2[aux2].ced_jug2);
            if (ganadores[aux3].jganador == 1)
            {
                printf("Gana el jugador 1");
            }
            else if (ganadores[aux3].jganador == 2)
            {
                printf("Gana el jugador 2");
            }
            else if (ganadores[aux3].jganador == 0)
            {
            printf("EMPATE");
            }
    }
    system("PAUSE");
    }
    break;
    case 5: /*OPCION 5 DEL MENU*/
    return printf("\n\n  SALIENDO\n\n");
    break;
    default:
    correcta++;
    break;
    }while (getchar()!='\n');
    }while (victoria==1);
}
int cuatro_en_linea(char tablero[DIM][DIM],int x)
{
   
    /*Defino distintas variables que voy a utilizar a lo largo del programa*/
    int n=0,i,j,resto=1,k=0,jugador,partida,victoria=0;
    char d;
    printf("\n\nIngresa la dimension del tablero de juego(4-15): ");
    /*Analizamos si la dimension del tablero ingresada es valida*/
    do
    {
        scanf (" %d",&x);
        system("cls");
        if (x<4 || x>15)
        {
            printf("\nOpcion no valida. Ingresa la dimension (4-15): ");
        }   while (getchar()!='\n');
    } while (x<4 || x>15);
    system("cls");
    /*Elegimos judagor*/
    printf("\n ELIJA JUGADOR\n\n\n");
    printf("\n\n  1) JUGADOR 1 (X)\n");
    printf("\n\n  2) JUGADOR 2 (O)\n");
    do
    {
    scanf("%d",&jugador);
    if ((jugador!=1) && (jugador!=2))
    {
        printf("\n Error: Los jugadores posibles son 1 y 2 ");
    }
    }while ((getchar()!='\n') || ((jugador!=1) && (jugador!=2)));
    do
    {
        system("cls");
        printf("\n\n\n\n");
        inicializar_tablero(tablero,x);
        while ((resto<=(x*x)) && (victoria!=1))
        {
            if (jugador==1)
            {
                jugador++;
               juegan_X_(tablero,x,n);
               /* Evaluo si el jugador 1 (X) gana*/
               
               for (i=1;i<=x;i++)
           {
    for (j=1;j<=x;j++)
{
                        /*Verifico si hay cuatro en linea horizontal para Jugador 1*/
if ((tablero[i][j]=='X') && ((tablero[i][j+1])=='X') && ((tablero[i][j+2])=='X') && ((tablero[i][j+3])=='X'))
{
victoria = 1;
}       
/*Verifico si hay cuatro en linea vertical para Jugador 1*/
else if ((tablero[i][j]=='X') && ((tablero[i+1][j])=='X') && ((tablero[i+2][j])=='X') && ((tablero[i+3][j])=='X'))
{
victoria = 1;
}
/*Verifico si hay cuatro en linea en diagonal ascendiente para Jugador 1*/
else if ((tablero[i][j]=='X') && ((tablero[i+1][j-1])=='X') && ((tablero[i+2][j-2])=='X') && ((tablero[i+3][j-3])=='X'))
{
victoria = 1;
}
/*Verifico si hay cuatro en linea en diagonal descendiente para Jugador 1*/
else if ((tablero[i][j]=='X') && ((tablero[i+1][j+1])=='X') && ((tablero[i+2][j+2])=='X') && ((tablero[i+3][j+3])=='X'))
{
victoria = 1;
}
}
   }
               if (victoria == 1)
               {
                printf("\n\n FELICITACIONES %s",nom_jug1);
                printf("!!!\n\n  Has ganado la partida.\n\n\n\n\n\n");
                return 1;
               }
               else
               {
                resto++;
               }
            }
            else if (jugador == 2)
            {
                jugador--;
juegan_O_(tablero,x,n);
/* Evaluo si el jugador 2 (O) gana*/

for (i=1;i<=x;i++)
           {
    for (j=1;j<=x;j++)
{
                        /*Verifico si hay cuatro en linea horizontal para Jugador 1*/
if ((tablero[i][j]=='O') && ((tablero[i][j+1])=='O') && ((tablero[i][j+2])=='O') && ((tablero[i][j+3])=='O'))
{
victoria = 1;
}
/*Verifico si hay cuatro en linea vertical para Jugador 1*/
else if ((tablero[i][j]=='O') && ((tablero[i+1][j])=='O') && ((tablero[i+2][j])=='O') && ((tablero[i+3][j])=='O'))
{
victoria = 1;
}
/*Verifico si hay cuatro en linea en diagonal ascendiente para Jugador 2*/
else if ((tablero[i][j]=='O') && ((tablero[i+1][j-1])=='O') && ((tablero[i+2][j-2])=='O') && ((tablero[i+3][j-3])=='O'))
{
victoria = 1;
}
/*Verifico si hay cuatro en linea en diagonal descendiente para Jugador 2*/
else if ((tablero[i][j]=='O') && ((tablero[i+1][j+1])=='O') && ((tablero[i+2][j+2])=='O') && ((tablero[i+3][j+3])=='O'))
{
victoria = 1;
}
}
   }
               if (victoria == 1)
               {
                printf("\n\n FELICITACIONES %s",nom_jug2);
                printf("!!!\n\n  Has ganado la partida.\n\n\n\n\n\n");
                return 2;
               }
               else
               {   
                  resto++;
               }
            }
           
            /*Si el tablero se lleno de fichas y no hay cuatro en linea
            el partido termina en empate*/
           
            if (resto > (x*x) && (victoria!=1))
        {
          printf("\n\n EMPATE\n\n");
          return 0;
            }
        }
    }while ((resto<=(x*x)) && (victoria!=1));
    system("PAUSE");
    resto = 1;
    victoria = 0;
    system("cls");
    inicializar_tablero(tablero,x);
    system("cls");
}
/* Procedimiento para imprimir el tablero inicial*/

void inicializar_tablero(char tablero[DIM][DIM],int x)
{
int i,j;
int contador = 1;
for (i=1; i<=x; i++)
{
for (j=1;j<=x; j++)
{
            printf("  ");
printf(" %c",tablero[i][j]='.');
}
printf("\n\n");

}
for (i=1;i<=x;i++)
{
        printf("   %d",contador);
        contador++;
    }
    printf("\n");
}
/*Funcion para hacer jugada para el jugador 1*/

int juegan_X_(char tablero[DIM][DIM],int x,int n)
{
int i,j,k,contador=1;
do
    {
        printf("\n\n Juega %s: ",nom_jug1);
                    scanf ("%d",&n);
        if (n<1 || n>x)
        {
            printf("Error: las columnas posibles son de 1 a %d",x);
            while (getchar()!='\n');
        }   
else if (tablero[1][n]!='.')
{
printf("\nError: la columna ya esta llena.\n ");
      }
    }while((n<1 || n>x) || (tablero[1][n]!='.'));
for (k=x;k>=1;k--)
    {
            if (tablero[k][n]!='.')
            {
                continue;
            }
            else
            {
                tablero[k][n]='X';
                break;
            }
    }
       system("cls"); 
   printf("\n Ultima jugada X: Columna %d\n",n);     
    printf("\n\n");
    for (i=1;i<=x;i++)
    {
        for (j=1;j<=x;j++)
        {
            printf("  ");
            printf (" %c",tablero[i][j]);
           
        }
        printf("\n\n");
    }
    for (i=1;i<=x;i++)
{
        printf("   %d",contador);
        contador++;
    }
    printf("\n");
}
/*Funcion para hacer jugada para el jugador 2*/

int juegan_O_(char tablero[DIM][DIM],int x,int n)
{
int i,j,k,contador=1;
do
    {
        printf("\n\n Juega %s: ",nom_jug2);
                    scanf ("%d",&n);
        if (n<1 || n>x)
        {
            printf("Error: las columnas posibles son de 1 a %d",x);
            while (getchar()!='\n');
        }   
else if (tablero[1][n]!='.')
{
printf("\nError: la columna ya esta llena.\n ");
      }
    }while((n<1 || n>x) || (tablero[1][n]!='.'));
for (k=x;k>=1;k--)
    {
            if (tablero[k][n]!='.')
            {
                continue;
            }
            else
            {
                tablero[k][n]='O';
                break;
            }
    }
    system("cls");     
printf("\n Ultima jugada O: Columna %d\n",n);   
    printf("\n\n");
    for (i=1;i<=x;i++)
    {
        for (j=1;j<=x;j++)
        {
            printf("  ");
            printf (" %c",tablero[i][j]);
           
        }
        printf("\n\n");
    }
    for (i=1;i<=x;i++)
{
        printf("   %d",contador);
        contador++;
    }
    printf("\n");
}
int limpiar(char nom_jug[40])
{

int t;
for (t=0; t<40; t++)
    {
    nom_jug[t]='\0';
    }
}

                                         



eferion

Vaya, veo que no has usado nada de lo que te puse... la próxima vez me ahorro el esfuerzo.

Código (cpp) [Seleccionar]

        cuatro_en_linea(tablero,opcion);
        sumador++;
        ganadores[ganador].jganador=cuatro_en_linea();


La función cuatro_en_linea sin argumentos no existe...

deberías eliminar la primera llamada y dejar la segunda, en la que estableces jganador, con los dos argumentos de la primera.