Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jperez2016 en 4 Junio 2014, 00:45 am



Título: juego memoria en c++
Publicado por: jperez2016 en 4 Junio 2014, 00:45 am
buenas noches gente
como puedo hacer para cargar una matriz de 10x10 con 50 pares de numeros o caracteres aleatorios sin repetir en C++?
ayuda por favor

:)


Título: Re: juego memoria en c++
Publicado por: engel lex en 4 Junio 2014, 01:00 am
Qué sabes de c++ y que llevas hecho? Donde tienes la duda de como continuar


Título: Re: juego memoria en c++
Publicado por: jperez2016 en 4 Junio 2014, 01:20 am
while(aleatorio1<50)
    {
      randomize();
      num1=random(10);
      num2=random(10);
      num3=random(10);
      num4=random(10);
      num5=random(50);
      if(num1==num3&&num2==num4)
        eselmismo='s';
      if (eselmismo='n')
        {
          for(i=0;i<TAM;i++)
            {
              for(j=0;j<TAM;j++)
                {
                  if(simbolos1[j]==num5)
                    repite++;
                }
            }
        }
      if (repite<2)
        {
          simbolos1[num1][num2]=num5;
          simbolos1[num3][num4]=num5;
          aleatorio1++;
        }
      repite=0;
    }

  for(i=0;i<TAM;i++)
    {
      for(j=0;j<TAM;j++)
        {
          cout<<"     "<<simbolos1[j];
        }
      cout<<"\n";
    }
  /*while(aleatorio1<50)
    {
      while(num<60||num>255)
        {
          srand(time(0));
          num=rand();
          letra=(char)num;
        }
      while(num1<0||num1>TAM||num2<0||num2>TAM||num3<0||num3>TAM||num4<0||num4>TAM||(num1==num3 && num2==num4))
        {
          srand(time(0));
          num1=rand();

          num2=rand();

          num3=rand();

          num4=rand();
        }
      for(i=0;i<50;i++)
        {
          if(cargados==letra)
            {
              serepite='s';
            }
        }
      if(serepite=='n')
        {
          simbolos1[num1][num2]=letra;
          simbolos1[num3][num4]=letra;
          num5=num-60;
          cargados[num5]=letra;
          aleatorio1++;
        }
    }

esto queda en un loop infinito :(


Título: Re: juego memoria en c++
Publicado por: ivancea96 en 4 Junio 2014, 01:48 am
Pusiste al principio if(eselmismo='n') cuando deberias poner ==

srand(time(0)); se coloca solo 1 vez al principio del programa, y nada más.

Bueno son un par de cosas que vi. Tienes varias cosas que revisar en el código :o


PD: La próxima vez, coloca las etiquetas GeSHi del foro para colocar códigos:

Código
  1. int main(){
  2.    return 0;
  3. }


Título: Re: juego memoria en c++
Publicado por: jperez2016 en 4 Junio 2014, 02:15 am
como colocos las etiquetas GeSHI esas? :huh:


Título: Re: juego memoria en c++
Publicado por: ivancea96 en 4 Junio 2014, 02:18 am
Donde los botones de negrita, cursiva, etc tienes a la derecha del todo GeSHi.


Título: Re: juego memoria en c++
Publicado por: jperez2016 en 5 Junio 2014, 23:44 pm
aún poniendo srand(time(0)) no funciona :(


Título: Re: juego memoria en c++
Publicado por: ivancea96 en 6 Junio 2014, 00:34 am
Te voy a dejar un truquito para no tener que poner ese tremendo while() con todas las condiciones de los aleatorios. Eso podría dejar el programa ahí indefinidamente.

Código
  1. int num = rand()%(MAX-MIN+1)+MIN;

Eso genera un valor entre MAX y MIN, ambos incluídos.

El operador % devuelve el resto de una división. Poner rand()%num va a devolver un número que será el resto de rand()/num. El resto va desde 0 hasta num-1, eso ya son matemáticas.

Lo de mínimo ya solo es un arreglo matemático de fácil comprensión.

Suerte. Si implementas eso, y revisas el código, quizás te vaya.


Título: Re: juego memoria en c++
Publicado por: jperez2016 en 14 Junio 2014, 03:47 am
Tengo un problema, cuando ingreso una letra en el jugador entro en un loop infinito. Me pueden ayudar?

Código
  1. do //ciclo hacer mientras el jugador ingresado sea incorrecto.
  2.  {
  3.  
  4.    cout<<"\n";
  5.    cout<<"Que jugador comienza? ";   //pregunta que jugador comienza.
  6.    cin>>jug;   //guardo el jugador.
  7.    getch();
  8.    if (jug!=1&&jug!=2) //me fijo si ingreso un jugador que es incorrecto.
  9.      {
  10.        cout<<"No existe ese jugador. ";  //muestro que no es un jugador válido.
  11.        cin>>jug;
  12.      }
  13.    else   //si el jugador es correcto.
  14.   jug_correcto='s';
  15.  }while(jug_correcto=='n');


Título: Re: juego memoria en c++
Publicado por: rir3760 en 14 Junio 2014, 17:09 pm
Tengo un problema, cuando ingreso una letra en el jugador entro en un loop infinito.
Cuando tengas una duda o problema con uno de tus programas por favor publica el código fuente completo.

En el fragmento que publicas la segunda lectura (cuando el valor de "jug" es diferente de 1 y 2) es innecesaria y deberías evitar el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

Un saludo


Título: Re: juego memoria en c++
Publicado por: jperez2016 en 27 Junio 2014, 04:05 am
hola, estoy tratando de declarar un jugador como inactivo y no puedo. pueden ayudarme¿?

Código
  1. clrscr();
  2.                       cout<<"\nIngrese el alias del jugador que desea declarar como inactivo ";
  3.  
  4.                       gets(desactivar);
  5.                       encontrado='n';
  6.                       igual=0;
  7.                       for(j=0;j<100;j++)
  8.                         {
  9.                           for(k=0;k<20;k++)
  10.                             {
  11.                               if(jugadores[j].alias[k]==desactivar[k])
  12.                                 igual++;
  13.                             }
  14.                           if(igual==20)
  15.                             {
  16.                               jugadores[j].activo='n';
  17.                               encontrado='s';
  18.                             }
  19.                         }


Título: Re: juego memoria en c++
Publicado por: eferion en 27 Junio 2014, 09:27 am
jperez2016 haznos un favor a todos y respira hondo, por favor.

No puedes ir en plan metralleta bombardeando con fallos diferentes que no tienen ninguna relación entre sí sin tan siquiera saber si los errores anteriores están corregidos. No digo que haya que regalar bombones... pero con dar de vez en cuando las gracias cuando alguien te aporta una solución es de agradecer.

Para empezar tienes que saber que para que te demos una solución puede no ser suficiente poner las 30 líneas de un bucle para encontrar un error. Por ejemplo, en el primer código que has puesto, el que no tiene las etiquetas GeSHi, no has puesto de qué tipo son las variables que se usan... simbolos1 es una matriz de tipo int... dos vectores anidados... una clase propia... esta información es importante de cara a evaluar un código.

Y bueno, te voy a dar algunas sugerencias más, es tu decisión adoptarlas o ignorarlas:

Usa el tipo bool
Para variables que sean "si/no" o "verdadero/falso", es conveniente usar el tipo bool. 'encontrado', en tu caso, tiene dos posibles valores: 's' y 'n'. La solución que has adoptado no es la más conveniente porque... qué sucede si te equivocas y pones 'S' ??? tu código dejará de funcionar. Lo bueno de usar el tipo bool es que si pasas valores que no sean true o false el compilador te avisará de ello... digamos que te apoyas en el compilador para detectar errores.

Reduce el ámbito de las variables
En C++ puedes declarar la variable que controla el bucle dentro del propio for, con esto consigues que la vida de esa variable esté limitada al propio bucle. Te permite evitar errores tontos al reutilizar variables:

Código
  1. for( int i=0; i<5; i++ )
  2.  cout << i << " ";
  3.  
  4. // Esta linea da error... i no existe
  5. cout << i << endl;
  6.  
  7. // Aqui puedes redeclarar i sin problemas
  8. for ( int i=2; i<10; i++ )
  9.  cout << i << " ";

Haz uso de los contenedores de C++
Para controlar listas de elementos (hablando de tu primera duda) lo mejor es usar los contenedores de C++:

  • vector: los elementos se almacenan en el orden que tu les dictes. Admite valores duplicados.
  • set: los elementos se almacenan ordenados de menor a mayor. No admite duplicados.
  • multiset: los elementos se almacenan ordenados de menor a mayor. Admite duplicados.
  • map: almacena un par "clave - valor". No admite claves duplicadas pero sí valores duplicados.
  • multimap: similar a map, admite claves duplicadas.

A continuación te presento dos formas (hay más) de usar contenedores para comprobar números repetidos:

* Opción 1. Es la mejor si los elementos tienen que estar desordenados
Código
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. int main( )
  6. {
  7.  std::vector< int > elementos;
  8.  elementos.push_back( 3 );
  9.  
  10.  for ( int i=0; i<10; i++ )
  11.  {
  12.    // find busca 'i' en el vector y, si se encuentra, devuelve su posicion
  13.    if ( std::find( elementos.begin( ), elementos.end( ), i ) == elementos.end( ) )
  14.      elementos.push_back( i );
  15.  }
  16.  
  17.  // Imprime en pantalla: 3 0 1 2 4 5 6 7 8 9
  18.  for ( int i=0; i<elementos.size( ); i++ )
  19.    std::cout << i << " ";

* Opción 2: ideal si no importa el orden de los elementos:

Código
  1. #include <iostream>
  2. #include <set>
  3.  
  4. int main( )
  5. {
  6.  std::set< int > elementos;
  7.  
  8.  for ( int i=0; i<10; i++ )
  9.    elementos.insert( i );
  10.  
  11.  for ( int i=0; i<10; i++ )
  12.    elementos.insert( i );
  13.  
  14.  // set no funciona con indices, hay que recurrir a los iteradores
  15.  // Imprime por pantalla: 0 1 2 3 4 5 6 7 8 9
  16.  // No hay elementos repetidos
  17.  for ( auto it = elementos.begin( ); it != elementos.end( ); ++it )
  18.    cout << *it << " ";
  19. }

No uses conio.h

conio.h no es portable, es mejor no usar este tipo de librerías y recurrir a opciones que se ajusten más al estándar. Una posibilidad para sustituir a getch es std::cin.ignore( ), aunque no es la única.

Aprende a usar enumerados

Hay que evitar en la medida de lo posible poner valores "a pelo" en el código, ya que son propensos a provocar errores.

En tu caso, por ejemplo, tienes 2 jugadores. Esto lo puedes expresar en el código de la siguiente forma:

Código
  1. enum Jugador
  2. {
  3.  NoJugador,
  4.  Jugador1,
  5.  Jugador2
  6. };
  7.  
  8. int main( )
  9. {
  10.  Jugador jug = NoJugador;
  11.  
  12.  int respuesta;
  13.  cout << "Introduce el jugador activo: ";
  14.  cin >> respuesta;
  15.  
  16.  switch ( respuesta )
  17.  {
  18.    case 1:
  19.      jug = Jugador1;
  20.      break;
  21.  
  22.    case 2:
  23.      jug = Jugador2;
  24.      break;
  25.  }
  26.  
  27.  if ( jug == NoJugador )
  28.    cout << "Jugador " << jug << " elegido" << endl;
  29.  else
  30.    cout << "No se ha seleccionado un jugador valido" << endl;
  31. }

Parejas de datos

Si en algún momento necesitas manejar parejas de datos, puedes usar la clase "pair". Incluso puedes combinar pair con contenedores:

Código
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. int main( )
  5. {
  6.  std::vector< std::pair< int, float > > datos;
  7.  
  8.  datos.push_back( std::make_pair( 1, 3.4 ) );
  9.  datos.push_back( std::make_pair( 2, 5.7 ) );
  10.  
  11.  for ( int i = 0; i < datos.size( ); i++ )
  12.  {
  13.    int valorEntero = datos[ i ].first; // Recuperamos el primer elemento del pair
  14.    float valorDecimal = datos[ i ].second; // Recuperamos el segundo elemento del pair
  15.  
  16.    std::cout << valorEntero << " - " << valorDecimal << std::endl;
  17.  }
  18. }