首页 > 解决方案 > 棋盘将检查输入到棋盘上的棋子是否处于有效位置

问题描述

一般来说,我对 Java 编程非常陌生,并且刚刚开始使用 2D 数组。我想做的是制作一个程序来创建一个 8x8 的棋盘,并要求用户输入要存储在棋盘上的字符串(棋子)。现在,我不想检查棋子是否是有效的棋子,但我想确保放置是有效的(即当提示放置棋子并且用户选择了无效的坐标时,程序会告诉错误的用户)。否则,如果坐标正确,它将存储字符串,我将使用另一个类来打印字符串并将它们以及它们的放置位置输出给用户。由于它是一个棋盘,我试图将 8x8 转换为 8,然后是 ag 中的一个字符。

继承人我到目前为止:

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();
        }
    }
}

这将打印棋盘的布局,但我不确定如何向用户询问有效坐标中的字符串,例如 e5,然后可以在另一个类中打印该字符串。

我希望我的预期输出是这样的:

Enter a coordinate: a5
Enter a piece to be placed here: Queen

继续,直到用户希望查看他们放置的内容:

You have placed a Queen at a5

任何帮助将不胜感激,谢谢!

标签: javamultidimensional-array

解决方案


要从用户那里获取位置,您可以使用类似

// only once, to initialize the scanner
Scanner scanner = new Scanner(System.in);

// each time you need input from the user
String input = scanner.next();

要请求职位,您可以检查输入是否与您期望的相符,否则请求新的输入:

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("[a-g][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 trick

正则表达式对您来说可能是新的(如果您是编程新手),但对于检查文本是否与特定模式匹配非常强大,并且在所有主要编程语言中都可以找到。

减去字符代码(最后 2 行)的技巧很有效,因为数字0123456789和字母的字符代码abcd......按数字/字母顺序排列,因此写作(int)('b'-'a')与写作相同1

您将错过获取该作品的代码。可以使用以下方法轻松构建大量单词的正则表达式|

 input.matches("Bob|Robert|Rob"); // matches only Bob or Robert or Rob

最后一部分是从整数转换为片名,反之亦然。我建议编写两种方法:

 public static String pieceToName(int piece) { /**/ }

 public static int nameToPiece(String name) { /**/ }

使用该switch语句,您可以使用首选编码快速实现两者:

 switch(name) {
   case "Queen": return 9;
   case "Pawn":  return 1;
   ...
 }

请注意,如果您开始构建一个实际的国际象棋程序,则必须区分白棋子和黑棋子。一种方法是对一种颜色使用正数,对另一种颜色使用负数。

祝你的程序好运!


推荐阅读