Github链接到完整下载
https://github.com/Jamiex304/Chess-Game
我目前正在开发一款国际象棋游戏并遇到了一个问题
目前,当棋子到达棋盘另一侧的末端时,默认情况下会变成白皇后
我想让用户决定它变成什么(因此国际象棋的规则)我正在玩JOption窗格,但我无法让它工作我可以用我们的错误运行它但它确实对于我来说,我正在寻找一些有关实施的帮助,
女王代码snipet (这里没有包含完整的代码,因为如果您希望为自己运行该文件,它将会延长github链接上找到的所有文件)
if(!validMove){
int location=0;
if(startY ==0){
location = startX;
}
else{
location = (startY*8)+startX;
}
String pieceLocation = pieceName+".png";
pieces = new JLabel( new ImageIcon(pieceLocation) );
panels = (JPanel)chessBoard.getComponent(location);
panels.add(pieces);
}
else{
if(success){
int location = 56 + (e.getX()/75);
if (c instanceof JLabel){
Container parent = c.getParent();
parent.remove(0);
pieces = new JLabel( new ImageIcon("WhiteQueen.png") );
parent = (JPanel)chessBoard.getComponent(location);
parent.add(pieces);
}
else{
Container parent = (Container)c;
pieces = new JLabel( new ImageIcon("WhiteQueen.png") );
parent = (JPanel)chessBoard.getComponent(location);
parent.add(pieces);
}
}
else{
if (c instanceof JLabel){
Container parent = c.getParent();
parent.remove(0);
parent.add( chessPiece );
}
else {
Container parent = (Container)c;
parent.add( chessPiece );
}
chessPiece.setVisible(true);
}
}
如果你想看看我的意思,一定要下载并运行java文件,你可以看到它只改变为白皇后的方式
答案 0 :(得分:2)
我真的不知道如何处理这个问题。这是一个"糟糕的问题"?我不知道。
一般性评论:各方面的实施都是 BAD 。你如何搞乱GUI组件并尝试在单个类中实现游戏逻辑的方式非常糟糕。有太多的个人缺陷可以通过合理的努力将它们列在这里。给出合理的改进提示是错误的。基于此代码编写AI基本上是不可能的,所以任何能够解决问题的答案都是不可能的。从长远来看,这对你没有帮助。
一般而言,特别是针对您打算编写AI的意图:
Board
的类代表棋盘。这应该 NOT 是一个GUI组件,但只是一个非常简单的类,可能包含一个8x8数组用于字段/部分,以及一些方法来设置各个字段的部分Piece
的类,或者可能是一个名为Field
的类,它包含一个片段的表示。同样,这应该 NOT 是一个GUI组件,但只是一个简单的类,可能不包含一些基本信息(片段类型,位置,颜色......)您应该有一个名为Move
的课程。这实际上是重要的一个。如果您想实施AI,您可能会先从Minimax算法开始,然后再使用Alpha-Beta-Pruning进行扩展。对于这两种算法,您只需要非常基本操作集:
因此Move
类必须包含执行和撤消移动所需的所有信息。
(Chess Programming Wiki的链接无论如何都可能无法帮到你,但我想在这里提一下)
关于实际问题:这是我认为实现当前目标所需的最小修改(使用UniversE的代码片段,+1)。但你应该不尝试根据这个类写一个AI,因为你不会成功。
//-------------------------------------Changes to Queen Piece and Validates Move----------------------------------------------
if(!validMove){
int location=0;
if(startY ==0){
location = startX;
}
else{
location = (startY*8)+startX;
}
String pieceLocation = pieceName+".png";
pieces = new JLabel( new ImageIcon(pieceLocation) );
panels = (JPanel)chessBoard.getComponent(location);
panels.add(pieces);
}
else{
if(success){
if (c instanceof JLabel){
Container parent = c.getParent();
parent.remove(0);
String promoteTo;
do {
promoteTo = (String) JOptionPane.showInputDialog(null,
"Promote to:", "Promotion",
JOptionPane.QUESTION_MESSAGE, null,
new String[]{"Queen", "Bishup", "Knight", "Rook"}, "Queen");
} while (promoteTo == null);
String newPiece = null;
int location = 0;
if (pieceName.contains("White"))
{
location = 56 + (e.getX()/75);
newPiece = "White"+promoteTo;
}
else
{
location = (e.getX()/75);
newPiece = "Black"+promoteTo;
}
pieces = new JLabel( new ImageIcon(newPiece+".png") );
parent = (JPanel)chessBoard.getComponent(location);
parent.add(pieces);
validate();
repaint();
}
}
else{
if (c instanceof JLabel){
Container parent = c.getParent();
parent.remove(0);
parent.add( chessPiece );
}
else {
Container parent = (Container)c;
parent.add( chessPiece );
}
chessPiece.setVisible(true);
}
}
答案 1 :(得分:1)
使用此代码:
String promoteTo;
do {
promoteTo = (String) JOptionPane.showInputDialog(yourMainFrame,
"Promote to:", "Promotion",
JOptionPane.QUESTION_MESSAGE, null,
new String[]{"Queen", "Bishop", "Knight", "Rook"}, "Queen");
} while (promoteTo == null);
但是你应该考虑将字符串文字外部化为常量或资源文件。