[ Foro de C# ]

Error en mi ejercicio - Desordenar array

13-Dec-2014 09:27
Pedro Mena
9 Respuestas

Buenos días, estoy haciendo un juego de parejas con un array bidimensional. En el que el PC genera aleatoriamente desde una lista definida y el usuario tiene que encontrar la pareja. Mi primer paso del programa me esta generando errores a la hora de generarlo,más o menos se cuales son, que es el convertir a string,pero estoy probando diferentes tipos string,next,nextype y nada, me da errores de sobrecarga. Aquí el código:


static void Main()
        {
          //Aquí voy a crear una matriz de x por y.
            int x = 4;
            int y = 4;
            int[,] matriz = new int[x, y];
            
            //Creo el objeto random para generar aleatoriamente en la matriz.
            Random alea = new Random();
            List<string> simbolo = new List<string>()
            {"A","B","A","B","C","D","C","D","E","F","E","F",
                "G","H","G","H"};

            for(int i=0; i<x;i++)
            {
                for(int j=0; j<y;j++)
                {
                    matriz[i,j]=alea.ToString(simbolo); //Genero aleatoriamente la letra
                }
            }

            //Voy a mostrar la matriz en pantalla

            for(int i=0; i<x; i++)
            {
                for(int j=0; j<y; i++)
                {
                    Console.Write(matriz[i, j] + " "); 
                }
                Console.WriteLine();//Salto de línea
            }
            Console.ReadLine();
        }
    }
}


No se en que paso me puedo estar equivocando. Si me pudierais orientar un poco.
Gracias.


13-Dec-2014 15:28
Nacho Cabanes (+84)

Creo que te estás complicando de forma innecesaria. Yo no usaría una lista de strings, sino un simple array, ya que el tamaño está prefijado:


string[] simbolo = {"A","B","A","B","C","D","C","D","E","F","E","F",
                "G","H","G","H"};


Para obtener un elemento del array al azar, usaría un número al azar que sería el índice de ese elemento:


matriz[i,j] = simbolo[ alea.Next(0,simbolo.Length) ];


pero en tu caso no funcionará, por dos motivos:

- La matriz no contiene strings, sino enteros (no sé por qué, y el nombre de la variable es poco aclarador, así que no puedo opinar).

- Ese algoritmo no es bueno para desordenar un array, porque puedes sacar dos veces el mismo dato. Yo usaría el algoritmo de FIsher-Yates:

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

(Existe un artículo equivalente en la wikipedia en español, pero en mi opinión es poco legible; el algoritmo de la versión en inglés es muy fácil de entender).


13-Dec-2014 16:03
Pedro Mena

Gracias por la contestacion.
Ese punto es el que no tengo claro como definir,porque yo quiero crear una matriz de 4x4 con esos simbolos.
El random me daria igual que se repitiese ciertas veces, lo que no se definir es la matriz a la hora de decirle que sea 4x4 y que me genere esa variable string simbolo


13-Dec-2014 16:39
Nacho Cabanes (+84)

Si es un juego de parejas, no te puedes permitir repetidos. Debe haber exactamente dos y sólo dos elementos de cada tipo.

Yo te recomendaría partir de un array unidimensional, desordenarlo "en el sitio" y finalmente volcarlo al array bidimensional que vas a mostrar en pantalla.


13-Dec-2014 16:58
Pedro Mena

Ok Nacho. Voy a probarlo.
Existiria la posibilidad de que me lo pudieses corregir en una clase online. Pagando claro.
Saludos


13-Dec-2014 17:24
Nacho Cabanes (+84)

En estas fechas mi tiempo es bastante escaso. Si no es urgente, ve poniendo aquí tus progresos y te voy ayudando a ratos con ello sin que gastes dinero. Si es urgente, usa el apartado Contactar de esta web y vemos cómo podríamos concretar para coordinarnos.


13-Dec-2014 18:26
Pedro Mena

Efectivamente me da un error que no puedo convertir de string en int. Pero podría hacer un parse cuando la ejecuto?

Asi es como me has comentado, e creado un array multi y otro unidimensional llamado simbolo?


static void Main()
        {
          //Aquí voy a crear una matriz de x por y.
            int x = 4;
            int y = 4;
            int[,] matriz = new int[x, y];
            
            //Creo el objeto random para generar aleatoriamente en la matriz.
            Random alea = new Random();
            string[] simbolo =new string[]{"A","B","A","B","C","D","C","D","E","F","E","F",
                "G","H","G","H"};

            for(int i=0; i<x;i++)
            {
                for(int j=0; j<y;j++)
                {
                    matriz[i,j] = simbolo[alea.Next(0, simbolo.Length)]; //Genero aleatoriamente la letra
                }
            }

            //Voy a mostrar la matriz en pantalla

            for(int i=0; i<x; i++)
            {
                for(int j=0; j<y; i++)
                {
                    Console.Write(matriz[i, j] + " "); 
                }
                Console.WriteLine();//Salto de línea
            }
            Console.ReadLine();
        }
    }
}


Gracias por tu gran apoyo.


13-Dec-2014 18:57
Nacho Cabanes (+84)

No se trata de hacer un "Parse" o un "Convert", sino de tener las ideas claras.  ;-)

¿Qué va a guardar esa matriz?  Porque si son las parejas en sí, sería un array de strings. Sólo sería un array de "int" si fueras a guardar alguna otra cosa, como los índices de las posiciones que estás manejando (algo que complicaría el programa innecesariamente).

Yo lo convertiría a array de strings:  string[,] matriz = new string[x, y];

Verás que sólo con ese cambio ya compilará. Pero me temo que al ponerlo en funcionamiento, el programa se interrumpirá con una excepción. Avisa si no descubres el problema... }:-)


14-Dec-2014 09:00
Pedro Mena

jejeje, efectivamente Nacho, este es el mensaje {"Índice fuera de los límites de la matriz."}
Pero los límites de la matriz los tengo establecidos con:  Console.Write(matriz[i, j] + " ");  Además de tener concatenadas las filas, que de echo no me salen concatenadas,solamente la consola me muestra una. No se que puede estar pasando...

Gracias,


14-Dec-2014 09:49
Nacho Cabanes (+84)

Si usas Visual Studio, que te permite depurar, mira los valores de i  y j en el momento del error.

Aún así, te doy la pista : comprueba el segundo "for" cuando muestras los datos, el que tiene como índice j.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)