在 Java 中使用 ASCII 作为棋盘坐标
Using ASCII for board co-ordinates in Java
我是 Java 的新手,主要是在放学后将其作为一种爱好来学习,以有效地消磨我的空闲时间。我发现它真的很有趣并且相对轻松地选择它但是我有点难以尝试实现可以通过命令行播放的基本国际象棋程序。理想情况下,我想先打印出两边只有国王和皇后的棋盘,然后让它们向前、向后和沿对角线移动。 (一旦我掌握了这一点,我会尝试添加所有其他部分,但首先我想尽可能简单地开始)。为简单起见,我将只使用标准的 8x8 棋盘。
我已经创建了一个主游戏循环,它使用命令行输入 1 来切换玩家,使用 2 来退出游戏,但是在打印出位置并让它们在游戏过程中改变时我被卡住了。首先,我想打印出国王和王后的起始位置作为字符串(例如 ["D1"、"E1"、"D8"、"E8"])供玩家使用看。我想最好的方法是使用 ASCII 索引,但我不确定从哪里开始,我尝试了下面的代码我知道它不正确而且我不知道要更改什么......
int num[] = {65, 66, 67, 68, 69, 70, 71, 72};
String start_Pos =null;
for(int i = 4; i < 6; i++){
start_Pos[i] = (Character.toString((char)i) + "1");
}
int num[] = {65, 66, 67, 68, 69, 70, 71, 72};
String start_Pos =null;
for(int i = 4; i < 6; i++){
start_Pos1[i] = (Character.toString((char)i) + "8");
}
System.out.println(start_Pos + start_Pos1);
我也尝试过对棋盘设置进行编码,但这实际上只是打印出棋子的起始位置,因此当玩家移动时不会改变 - 理想情况下应该如此。一个例子是起始位置显示在板上,如下所示:
照片(PS 我知道 QK 应该在一侧交换,这样它们就不会彼此相对,我的错!
但是在玩家 1 输入 "D1 D3"(第一个坐标表示什么棋子,第二个坐标表示最终位置)后,棋盘会发生变化以反映这一点。这是否可能而不必在每次转弯后重新编译整个代码? (也许是个愚蠢的问题...)。
如有任何帮助,我们将不胜感激。我发现通过制作像这样的小游戏来学习更有趣和有益,所以如果有人能够帮助我实现这一点,我将非常感激。
Java是面向对象的语言,所以最好使用classes和对象实例。
当然,对于棋盘,您仍然需要对 x、y 坐标进行计算。计算机只是更擅长处理数字,它们在解释事物方面存在问题。国际象棋符号主要是对我们人类有用的。
所以这里有一个 class 可以用来解析和解释国际象棋的位置。请注意,您应该保持此 class 不可变 并仅使用新的对象实例而不是更改 x
或 y
字段。
public final class ChessPosition {
// use constants so you understand what the 8 is in your code
private static final int BOARD_SIZE = 8;
// zero based indices, to be used in a 2D array
private final int x;
private final int y;
public ChessPosition(int x, int y) {
// guards checks, so that the object doesn't enter an invalid state
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) {
throw new IllegalArgumentException("Invalid position");
}
this.x = x;
this.y = y;
}
public ChessPosition(String chessNotation) {
// accept upper and lowercase, but output only uppercase
String chessNotationUpper = chessNotation.toUpperCase();
// use a regular expression for this guard
if (!chessNotationUpper.matches("[A-H][0-7]")) {
throw new IllegalArgumentException("Invalid position");
}
// can be done in one statement, but we're not in a hurry
char xc = chessNotationUpper.charAt(0);
// chars are also numbers, so we can just use subtraction with another char
x = xc - 'A';
char yc = chessNotation.charAt(1);
// note that before calculation, they are converted to int by Java
y = yc - '1';
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public String getChessNotation() {
// perform the reverse and create a string out of it
// using StringBuilder#append(char c) is another option, but this is easier
return new String(new char[] {
// Java converts 'A' to int first (value 0x00000041)
(char) (x + 'A'),
(char) (y + '1')
});
}
// this will be helpfully displayed in your debugger, so implement toString()!
@Override
public String toString() {
return getChessNotation();
}
}
现在您可能还想创建一个 Board
class 和支持 ChessPiece[][]
的二维数组并执行 board.set(WHITE_KING, new ChessPosition("E1"))
或类似的操作。
我是 Java 的新手,主要是在放学后将其作为一种爱好来学习,以有效地消磨我的空闲时间。我发现它真的很有趣并且相对轻松地选择它但是我有点难以尝试实现可以通过命令行播放的基本国际象棋程序。理想情况下,我想先打印出两边只有国王和皇后的棋盘,然后让它们向前、向后和沿对角线移动。 (一旦我掌握了这一点,我会尝试添加所有其他部分,但首先我想尽可能简单地开始)。为简单起见,我将只使用标准的 8x8 棋盘。
我已经创建了一个主游戏循环,它使用命令行输入 1 来切换玩家,使用 2 来退出游戏,但是在打印出位置并让它们在游戏过程中改变时我被卡住了。首先,我想打印出国王和王后的起始位置作为字符串(例如 ["D1"、"E1"、"D8"、"E8"])供玩家使用看。我想最好的方法是使用 ASCII 索引,但我不确定从哪里开始,我尝试了下面的代码我知道它不正确而且我不知道要更改什么......
int num[] = {65, 66, 67, 68, 69, 70, 71, 72};
String start_Pos =null;
for(int i = 4; i < 6; i++){
start_Pos[i] = (Character.toString((char)i) + "1");
}
int num[] = {65, 66, 67, 68, 69, 70, 71, 72};
String start_Pos =null;
for(int i = 4; i < 6; i++){
start_Pos1[i] = (Character.toString((char)i) + "8");
}
System.out.println(start_Pos + start_Pos1);
我也尝试过对棋盘设置进行编码,但这实际上只是打印出棋子的起始位置,因此当玩家移动时不会改变 - 理想情况下应该如此。一个例子是起始位置显示在板上,如下所示:
照片(PS 我知道 QK 应该在一侧交换,这样它们就不会彼此相对,我的错!
但是在玩家 1 输入 "D1 D3"(第一个坐标表示什么棋子,第二个坐标表示最终位置)后,棋盘会发生变化以反映这一点。这是否可能而不必在每次转弯后重新编译整个代码? (也许是个愚蠢的问题...)。
如有任何帮助,我们将不胜感激。我发现通过制作像这样的小游戏来学习更有趣和有益,所以如果有人能够帮助我实现这一点,我将非常感激。
Java是面向对象的语言,所以最好使用classes和对象实例。
当然,对于棋盘,您仍然需要对 x、y 坐标进行计算。计算机只是更擅长处理数字,它们在解释事物方面存在问题。国际象棋符号主要是对我们人类有用的。
所以这里有一个 class 可以用来解析和解释国际象棋的位置。请注意,您应该保持此 class 不可变 并仅使用新的对象实例而不是更改 x
或 y
字段。
public final class ChessPosition {
// use constants so you understand what the 8 is in your code
private static final int BOARD_SIZE = 8;
// zero based indices, to be used in a 2D array
private final int x;
private final int y;
public ChessPosition(int x, int y) {
// guards checks, so that the object doesn't enter an invalid state
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) {
throw new IllegalArgumentException("Invalid position");
}
this.x = x;
this.y = y;
}
public ChessPosition(String chessNotation) {
// accept upper and lowercase, but output only uppercase
String chessNotationUpper = chessNotation.toUpperCase();
// use a regular expression for this guard
if (!chessNotationUpper.matches("[A-H][0-7]")) {
throw new IllegalArgumentException("Invalid position");
}
// can be done in one statement, but we're not in a hurry
char xc = chessNotationUpper.charAt(0);
// chars are also numbers, so we can just use subtraction with another char
x = xc - 'A';
char yc = chessNotation.charAt(1);
// note that before calculation, they are converted to int by Java
y = yc - '1';
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public String getChessNotation() {
// perform the reverse and create a string out of it
// using StringBuilder#append(char c) is another option, but this is easier
return new String(new char[] {
// Java converts 'A' to int first (value 0x00000041)
(char) (x + 'A'),
(char) (y + '1')
});
}
// this will be helpfully displayed in your debugger, so implement toString()!
@Override
public String toString() {
return getChessNotation();
}
}
现在您可能还想创建一个 Board
class 和支持 ChessPiece[][]
的二维数组并执行 board.set(WHITE_KING, new ChessPosition("E1"))
或类似的操作。