Problema con codigo

Iniciado por Ivan88, 13 Marzo 2020, 23:12 PM

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

Ivan88

Se pide que se enumeren las casillas de un tablero de ajedrez de izquierda a derecha y de arriba hacia abajo.Luego se pide que se introduzca un numero de casilla por ejemplo la 45, y que el programa diga la posicion que ocupa , en este caso la (6,5)...Este es mi codigo pero no encuentro el fallo..Gracias de antemano.

using System;

namespace Ajedrez
{
    class Program
    {
        static void Main(string[] args)
        {
            int comparador = 0;
            int x;
            int[,] Matriz = new int[8, 8];
               
            Console.WriteLine("Introduce la casilla entre 1 y 64");
            x = Convert.ToInt32(Console.ReadLine());

       
           
                for (int i = 1; i == 8; ++i)
                {
                    for (int j = 1; j == 8; ++j)
                    {
                    comparador = comparador + 1;


                    if (x == comparador)
                    {
                        Console.WriteLine("La posición de la casilla " + x + "es [" + i + "," + j + "]");
                    }
                   

                       
                       
                    }
                   
                }
           
           
           
        }
    }
}

Serapis

Cuando consideras un array debes pensar si el array comienza en 0 o en 1...
Si tienes 64 casillas y:
A --- Comienza en 0, entonces el rango es: 0-63, 8 filas x 8 columnas 0-7, 0-7
B --- Comienza en 1, entonces el rango es: 1-64, 8 filas x 8 columnas 1-8, 1-8


No obstantes no es preciso hacer ningún bucle ni menos anidado, para localizar una casilla lineal que posición ocupa en el tablero. Es matemática belemental de un chaval de 12 años o menos...

La elección determina el cálculo...  La siguiente funciona correctamente con 'A':
(es muy fáci adaptarlo al caso 'B', pero lo dejo a tu esfuerzo  :silbar: :silbar: )...

fila = (x \ 8)
columna = (x modulo 8)


Ahora si te exigen un bucle sí o sí, implica que el bucle debe tener un valor... luego procede previamente a la petición de una entrada al usuario asignar en sendos bucles el valor:


bucle para fila desde ini a fin  // ini y fin, tu decides  sin son el par 0-7 ó 1-8
  bucle para columna desde ini a fin   //   ídem...
      matriz(fila, columna) = casilla  // ídem, si empieza en 1, asigna dicho valor a casilla antes del bucle
      // o precede la siguiente línea delante de la asignación.
      casilla +=1
  siguiente
siguiente


Ahora puedes solicitar la usuario el valor 'x'...

Y ahora intentas localizarlo en el array:

bucle para fila desde ini a fin  // ini y fin, tu decides  sin son el par 0-7 ó 1-8
  bucle para columna desde ini a fin   //   ídem...
      Si (matriz(fila, columna) = x)     // ídem, x debe tener las mismas consideraciones de rango: 0-63 ó 1-64
           mensaje: "La casilla" + x + "corresponde a la fila: " + fila + " y columna: " + columna
      fin si
  siguiente
siguiente


Como ves el segundo bucle es casi idéntico al primero, pero a diferencia del tuyo, aquí si se usa el array 'matriz' para ver si contiene el valor buscado, en vez de usar 'comparador', que al caso hubiera sido más útil llamarlo 'contador'...

EdePC

- Por cierto, tu error está en usar == en lugar de <, por que lo haces? Esa es la condición que permite ejecutar el bucle, el for seguirá iterando mientras dicha condición se cumpla. Tu for nunca funciona por que en primera instancia se compara un 0 con 8 ( i == 8 ), esto no se cumple y el for finaliza.

- Esto me funciona sin problemas:

Código (csharp) [Seleccionar]
using System;

namespace Ajedrez {
  class Program {
    static void Main(string[] args) {
      int comparador = 0;
      int x;
      int[,] Matriz = new int[8, 8];

      Console.WriteLine("Introduce la casilla entre 1 y 64");
      x = Convert.ToInt32(Console.ReadLine());

      for (int i = 0; i < 8; ++i) {
        for (int j = 1; j < 8; ++j) {
          comparador = comparador + 1;

          if (x == comparador) {
            Console.WriteLine("La posición de la casilla " + x + " es [" + i + "," + j + "]");
          }

        }
      }
      Console.ReadLine(); // Para que pause y no se cierre hasta dar Enter
    }
  }
}


- Ya Nebire te explicó detalladamente la lógica que podrías seguir con respecto a tus requerimientos iniciales.

Ivan88

Muxas gracias...soy nuevo en esto y a veces x una tontería te puedes volver loco..ya lo he probado asi..un abrazo