如何实施JOptionpane List Option?

时间:2014-10-20 23:38:26

标签: java performance swing joptionpane chess

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文件,你可以看到它只改变为白皇后的方式

2 个答案:

答案 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);

但是你应该考虑将字符串文字外部化为常量或资源文件。