gpt4 book ai didi

java - 国际象棋棋盘的 ASCII 表示

转载 作者:太空宇宙 更新时间:2023-11-04 06:40:46 24 4
gpt4 key购买 nike

我正在用 Java 编写一个国际象棋引擎,我想用 ASCII 字符打印棋盘(即:# 代表空方格,K 代表国王,Q 代表皇后等..)。表示应区分黑色和白色部分。

我正在寻找一种方法,该方法将输入棋子列表(或 map 或数组),并输出代表棋盘的字符串。

我已经有一个 Board 对象,其中包含一个 Pieces 列表。 Piece 是一个抽象类,具有位置 (x,y) 和颜色(黑色或白色)。 King、Queen、Knight 是实现 Piece 类的类。

谢谢

最佳答案

首先:如果您的目的是编写一个国际象棋引擎,那么您应该通读 Chess Programming Wiki .

如果您仍然想尝试一下,您应该意识到这样一个事实:面向对象编程的通常最佳实践可能不一定适用于国际象棋编程。面向对象编程的许多方面都旨在实现国际象棋根本不存在的目标。例如,可扩展性。除了从一开始就存在的那些之外,你永远不会有其他的作品。对于高效的国际象棋引擎,您可能根本不会使用类形式的棋子显式表示。对于主板,您不想使用 List<Piece> ,而是一个特殊的数组(请参阅 Board Representation 了解大量(很多!)详细信息)。

但是,根据您当前的描述,除了通过 instanceof 检查它们的类之外,似乎没有办法区分这些部件。检查。当然,这不太好,但除非你扩展 Piece类似 getType() 的类方法(使整个继承变得无用),几乎没有其他选择。

我在下面概述了这种方法。该符号大致基于 algebraic move notation :字母

K = King
Q = Queen
B = Bishop
N = Knight
R = Rook
P = Pawn

通常用来表示片段的类型。为了区分黑色和白色棋子,您只需使用大写字母表示白色棋子,使用小写字母表示黑色棋子。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class ChessBoardString
{
public static void main(String[] args)
{
Board board = new Board();
String s = createString(board);
System.out.println(s);
}

private static String createString(Board board)
{
char empty = '.';
char chars[] = new char[8*8+8];
Arrays.fill(chars, empty);
for (int y=0; y<8; y++)
{
chars[y*9+8] = '\n';
}
List<Piece> pieces = board.getPieces();
for (Piece piece : pieces)
{
int x = piece.getX();
int y = piece.getY();
char c = charFor(piece);
chars[x+y*9] = c;
}
String s = new String(chars);
return s;
}

private static char charFor(Piece p)
{
char c = ' ';
if (p instanceof King)
{
c = 'k';
}
else if (p instanceof Queen)
{
c = 'q';
}
else if (p instanceof Bishop)
{
c = 'b';
}
else if (p instanceof Knight)
{
c = 'n';
}
else if (p instanceof Rook)
{
c = 'r';
}
else if (p instanceof Pawn)
{
c = 'p';
}
if (p.getColor() == Color.WHITE)
{
c = Character.toUpperCase(c);
}
return c;
}
}



class Board
{
List<Piece> getPieces()
{
List<Piece> pieces = new ArrayList<Piece>();
pieces.add(new King(Color.WHITE,3,4));
pieces.add(new King(Color.BLACK,5,6));
pieces.add(new Queen(Color.WHITE,7,2));
pieces.add(new Queen(Color.BLACK,2,0));
pieces.add(new Bishop(Color.WHITE,1,2));
pieces.add(new Bishop(Color.BLACK,5,4));
pieces.add(new Knight(Color.WHITE,5,1));
pieces.add(new Knight(Color.BLACK,0,7));
pieces.add(new Rook(Color.WHITE,2,2));
pieces.add(new Rook(Color.BLACK,1,4));
pieces.add(new Pawn(Color.WHITE,6,1));
pieces.add(new Pawn(Color.BLACK,2,3));
return pieces;
}
}

enum Color
{
BLACK,
WHITE
}

abstract class Piece
{
private Color color;
private int x;
private int y;
Piece(Color color, int x, int y)
{
this.color = color;
this.x = x;
this.y = y;
}
Color getColor()
{
return color;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
}

class King extends Piece
{
King(Color color, int x, int y)
{
super(color, x, y);
}
}
class Queen extends Piece
{
Queen(Color color, int x, int y)
{
super(color, x, y);
}
}
class Bishop extends Piece
{
Bishop(Color color, int x, int y)
{
super(color, x, y);
}
}
class Knight extends Piece
{
Knight(Color color, int x, int y)
{
super(color, x, y);
}
}
class Rook extends Piece
{
Rook(Color color, int x, int y)
{
super(color, x, y);
}
}
class Pawn extends Piece
{
Pawn(Color color, int x, int y)
{
super(color, x, y);
}
}

关于java - 国际象棋棋盘的 ASCII 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24713064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com