我对Java编程很陌生,刚刚开始使用2D数组。我想做的是制作一个程序,创建一个8x8的棋盘,并要求用户输入要存储在棋盘上的字符串(棋子(。目前,我不想检查棋子是否是有效的棋子,但我想确保放置是有效的(即,当提示放置棋子而用户选择了无效坐标时,程序会告诉用户这是错误的(。否则,如果坐标正确,它将存储字符串,我将使用另一个类打印字符串并将它们以及它们的放置位置输出给用户。由于这是一个棋盘,我正试图将8x8转换为8,后面跟着a-g中的一个字符。
以下是我目前所拥有的:
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
任何帮助都将不胜感激,谢谢!
要从用户那里获得位置,可以使用类似的东西
// 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;
...
}
注意,如果你开始构建一个真正的下棋程序,你必须区分白色和黑色棋子。一种方法是用正数表示一种颜色,用负数表示另一种颜色。
祝你的节目好运!