Soy muy nuevo en la programación de Java en general y acabo de comenzar a usar matrices 2D. Lo que estoy tratando de hacer es crear un programa que cree un tablero de ajedrez de 8x8 y le pida al usuario que ingrese cadenas (piezas) para almacenarlas en el tablero de ajedrez. Por ahora, no quiero verificar si la pieza es una pieza de ajedrez válida o no, pero quiero asegurarme de que la ubicación sea válida (es decir, cuando se le solicite colocar una pieza y el usuario elija una coordenada no válida, el programa le dirá el usuario que está mal). De lo contrario, si la coordenada es correcta, almacenará la cadena, que usaré otra clase para imprimir la(s) cadena(s) y enviarlas al usuario, así como también dónde están ubicadas. Como es un tablero de ajedrez, estoy tratando de convertir 8x8 a 8 seguido de un personaje de ag.
Esto es lo que tengo hasta ahora:
public class ChessBoard { public static void main(String[] args) { char rows = 'a'; String spot; int[][] grid = new int[8][8]; for (int i = 0; i < grid.length; i++, rows++) { for (int col = 0; col < grid[i].length; col++) { System.out.print(rows + "" + (col + 1) + " "); } System.out.println(); } } }Esto imprime el diseño del tablero de ajedrez, pero no estoy seguro de cómo pedirle al usuario una cadena en una coordenada válida, por ejemplo, e5, que luego se puede imprimir en otra clase.
Me gustaría que mi resultado esperado fuera algo como:
Enter a coordinate: a5 Enter a piece to be placed here: QueenContinúe hasta que el usuario desee ver lo que ha colocado:
You have placed a Queen at a5¡Cualquier ayuda será apreciada, gracias!
Para obtener la posición del usuario, puede usar algo como
// only once, to initialize the scanner Scanner scanner = new Scanner(System.in); // each time you need input from the user String input = scanner.next();Para solicitar una posición, puede verificar si la entrada coincide con lo que espera y, de lo contrario, solicitar una nueva entrada:
String input = null; // will be changed to a valid position boolean iLikeThisInput = false; // will be true if position is valid while ( ! iLikeThisInput) { System.out.println("Enter a coordinate (for example, a5): "); input = scanner.next(); iLikeThisInput = input.matches("[ag][1-8]"); // this is a regular expression }; // now we now that the input is valid int col = (int)(input.charAt(0) - 'a'); // 'a' is column 0: 'a' - 'a' = 0. int row = (int)(input.charAt(1) - '0'); // '0' is row 0: same trickLas expresiones regulares probablemente sean nuevas para usted (si es nuevo en la programación), pero son muy poderosas para verificar si el texto coincide con un patrón determinado y se encuentran en todos los principales lenguajes de programación.
El truco de restar códigos de caracteres (últimas 2 líneas) funciona porque los códigos de caracteres para los dígitos 0123456789 y los del alfabeto abcd ... están en orden numérico/alfabético, de modo que escribir (int)('b'-'a') es lo mismo que escribir 1 .
Solo te faltará el código para obtener la pieza. Se puede construir fácilmente una expresión regular para muchas palabras usando | :
input.matches("Bob|Robert|Rob"); // matches only Bob or Robert or RobLa pieza final es convertir números enteros a nombres de piezas y viceversa. Recomiendo escribir dos métodos:
public static String pieceToName(int piece) { /**/ }y
public static int nameToPiece(String name) { /**/ } Usando la declaración de switch , puede implementar rápidamente ambos con su codificación preferida:
switch(name) { case "Queen": return 9; case "Pawn": return 1; ... }Tenga en cuenta que si comienza a construir un programa de juego de ajedrez real, tendrá que distinguir entre piezas blancas y negras. Una forma de hacerlo es usar números positivos para un color y negativos para el otro.
¡Buena suerte con tu programa!