【问题标题】:How do I implement a JOptionpane List Option?如何实现 JOptionpane 列表选项?
【发布时间】:2014-12-16 02:03:40
【问题描述】:

完整下载的 Github 链接

https://github.com/Jamiex304/Chess-Game

我目前正在开发一个国际象棋游戏并遇到了问题

目前,当一个棋子到达棋盘另一侧的末端时,它默认会变成一个白皇后

我想让用户决定它变成什么(因此国际象棋规则)我正在玩弄 JOption 窗格但我无法让它工作我可以用我们的错误运行它但它确实对我来说没有什么我正在寻找一些实施方面的帮助

女王代码片段(这里没有包含完整代码,因为如果您想自己运行文件,那么在 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 文件本身,你可以看到它只更改为白皇后的方式

【问题讨论】:

  • 代码太多。继续阅读MCVE
  • "我在想一个简单的 JOption 窗格按钮列表我只是需要一些帮助来实现"不错的选择,你需要什么帮助?你为它写了什么代码,你卡在哪里了?
  • 至于JOptionPane,您可以阅读以下内容:Multiple input in JOptionPane.showInputDialog。至于典当,我最好的猜测是你的程序认为它是白色的,而实际上它是黑色的。
  • @user1803551 我已经编辑了上面的 java 文件,仅显示典当移动和对皇后的更改而不是整个文件,我尝试添加一个 JOptionpane 列表,它正在更改为皇后片但是一直在我的代码中遇到编译错误,你能提供一些帮助吗,如果你需要源文件,它都在github上
  • 您应该考虑使用常量而不是文字,而不是面向对象,而不是编写一个处理所有任务的怪物方法。您的代码可能不到一半大小。

标签: java performance swing joptionpane chess


【解决方案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);

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

【讨论】:

  • 我已经尝试使用此代码,但它没有帮助我可以无错误地编译它,但现在任何一个棋子都没有任何反应。也许我实施错了,你可以在上面的代码文件中告诉我一个实施吗,如果你需要,可以在 github 上找到完整的填充
  • 使用调试器并在您的 pawn 代码中创建断点 - 然后逐步检查。不幸的是,我没有太多时间为您做这件事,但我可以为您的代码提供更多提示(以及如何更快地找到错误): 使用面向对象! 1. 创建 Pawn、Bishop 等类 2. 创建 doMovecheckMovepromote 等方法。如果没有完全阅读它,我几乎不相信您的代码没有错误并且尊重所有国际象棋规则(如固定数字等)。你可以从我的项目中得到想法:develop.uap-core.de/hg/terminal-chess/file/tip/src/chess
【解决方案2】:

我真的不知道该怎么处理这个。这是一个“坏问题”吗?我不知道。

一般性评论:实施在各方面都BAD。你如何弄乱 GUI 组件并试图在单个类中实现游戏逻辑的方式是可怕的。有太多的个人缺陷,无法通过合理的努力在此列出。给出合理的改进提示是错误的。基于此代码编写 AI 基本上是不可能的,因此从长远来看,任何建议“解决您的问题”的答案都对您没有帮助。

总的来说,特别是针对您编写 AI 的意图:

  • 您应该有一个名为Board 的类,它代表棋盘。这应该是一个 GUI 组件,而只是一个非常简单的类,可能包含一个 8x8 的字段/片段数组,以及一些在各个字段中设置片段的方法
  • 您可能应该有一个名为Piece 的类,或者一个名为Field 的类,其中包含一个片段的表示。同样,这应该是一个 GUI 组件,而只是一个简单的类,可能只包含一些基本信息(棋子类型、位置、颜色...)
  • 您应该有一个名为Move 的类。这其实是很重要的一个。如果你想实现一个 AI,你可能会从 Minimax 算法开始,然后用 Alpha-Beta-Pruning 扩展它。对于这两种算法,您只需要 非常 一组基本操作:

    • 你必须能够移动
    • 您必须能够评估董事会
    • 您必须能够撤消移动

    因此Move 类必须包含执行和撤消移动所需的所有信息。

  • (到Chess Programming Wiki 的链接可能对您没有任何帮助,但我想在这里提一下)

关于实际问题:这是我认为实现当前目标所必需的最小修改(使用 UniversE 的代码 sn-p,为此 +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);
        }
    }

【讨论】:

  • 感谢您的帮助,我知道总体上实现很糟糕,这只是我可以让它工作的唯一方法,每次我尝试拆分代码时都会导致一个数字的错误,你能给我任何关于拆分它的建议吗,比如一个例子,谢谢你
  • 我已经尝试给出了一些提示,并且在 cmets 中已经给出了一些提示:您应该尝试将“模型”和“视图”分开。模型是真正的游戏,由Board 类和Move 类组成。视图是 GUI,它只显示板原样。检测棋步是否有效确实有点复杂,您最终可能会得到一组非平凡的方法。但是例如:对于 AI,您必须根据给定的棋盘计算所有可能移动的 列表。这可能是一个起点。
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2014-08-27
相关资源
最近更新 更多