0

我的 Boggle 项目有一些逻辑错误,无法查明它们。我唯一能做的就是退出拼图游戏。谁能帮我吗?在这个程序中,每当单击 JMenu Item 新游戏时,我需要开始一个新游戏,每当单击 Shake Dice 按钮时,字母要随机化,包含提交单词 Jbutton 以及分数和当前单词 jlabels 的 Jpanel,以及每当单击提交单词按钮并更新分数时要更新的当前单词标签。

Boggle 用户界面代码:

package userInterface;

/**
 *
 * @author Zac
 */

import core.Board;
import core.Die;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;


public class BoggleUi extends JFrame{

  Board boggleBoard;//creating a board object

  //components

  private static JMenuBar menuBar;//declare menubar

  private static JMenu Boggle;// declare Jmenu

  private static JMenuItem game;// set menu item for game

    private static JMenuItem exit;// set menu item for exit

    //buttons

    private static JButton Shakedice;//button for shaking the dice

    private static JButton submitWord;// button to submit word

    //layout of the UI

    private JPanel diceButtons;//jpanel for the dice buttons

    private JPanel componentLayout;//jpanel for other components

    private JPanel wordPanel;// Jpanel for word related ui

    private static JScrollPane scrollPane;//scrollpane

    private static JTextArea textArea;//textarea

    private static JLabel timeLeft;// Jlabel for countdown

    private static JLabel timer;//label for above time left

    private static JLabel wordsLeft;//label for words entered in text area

    private static JLabel currentWord;//label for current word

    private static JLabel playerScore;// label for score

    private static JLabel dieButton;// label for dice button

    //handlers

     private GameListener gameListener;// listener for the Boggle game

     private PanelListener panelListener;// listener for dice

     //timer variables

     int timeMili; //miliseconds

     int timeMin;// minutes

     int timeSec;//seconds

     Timer countdownTimer;//timer

public BoggleUi(Board boggleBoard,ArrayList Readdictionary ){

    this.boggleBoard = boggleBoard;//calls the boggle board

    initComponents();

}


public void initComponents(){ //initialzes components

    this.setSize(800,800);//set size of JFrame

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);//remove window if closed

   menuBar = new JMenuBar();//creates a menu bar

    Boggle = new JMenu("Boggle");

     game = new JMenuItem("New Game");// menu item for new game

      exit = new JMenuItem("Exit");// menu item for exiting the game

      exit.addActionListener(new ExitListener());//adding an action listener to the exit menu item

      Boggle.add(game);

      Boggle.add(exit);

      menuBar.add(Boggle);

      this.setJMenuBar(menuBar);

      //actionlistener


   gameListener = new GameListener();//make a new game listener

    game.addActionListener(gameListener);//add game listener

    panelListener = new PanelListener();//make new panel listener

    Boggle.addActionListener(panelListener);// add panel listener

    Shakedice = new JButton("Shake Dice");

    Shakedice.addActionListener(new ShakeListener());// make shake listener

    submitWord = new JButton("Submit Word");

     submitWord.addActionListener(new SubmitWordListener());// make submit listener

     //inititialize timer and listener

     countdownTimer = new Timer(1000, new TimerListener());//setting timer and listener

     countdownTimer.start();// start timer

      //set up textarea and jscroll pane and other components

      Dicepanels();//set up for panels and components

        textArea = new JTextArea();//creates new text area

        textArea.setLineWrap(true);//wraps text

        scrollPane = new JScrollPane(textArea);//creates new scroll pane

        scrollPane.setMinimumSize(new Dimension(200, 300));// set minimum size

        scrollPane.setPreferredSize(new Dimension(200, 300));// preferred size of scroll pane

        scrollPane.setMaximumSize(new Dimension(400, 600));//set max size

        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);//never allows horizontal bar

        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//calls for vertical bar

        componentLayout.setLayout(new BoxLayout(componentLayout,BoxLayout.Y_AXIS));//sets to y axis

        componentLayout.add(wordsLeft);

        componentLayout.add(scrollPane);//appears after a certain amount of lines are entered

        componentLayout.add(timer);// adds time left label

        componentLayout.add(timeLeft);//adds time label

        componentLayout.add(Shakedice);//adds shake dice button

      this.add(diceButtons);//adds dice buttons

      this.add(componentLayout,BorderLayout.EAST);//adds the components

       this.add(wordPanel,BorderLayout.SOUTH);//adds word panel

      this.setVisible(true);// makes the entire jframe visible
}



private JFrame getThisParent(){// method to retrieve the JFrame

    return this;
}

//code for text area
public void updateText(String boggleData){//method to update the text


        textArea.append(boggleData+ "\n");

    textArea.setCaretPosition(textArea.getDocument().getLength());



}

//area to place dice buttons and other components

    private void Dicepanels() {

        //setup dice buttons

        diceButtons = new JPanel(new GridLayout(4, 4));// set buttons in a 4x4 grid

        diceButtons.setMinimumSize(new Dimension(400, 400));//set minimum size

        diceButtons.setPreferredSize(new Dimension(400, 400));//set preferred size

        //setup components

        componentLayout = new JPanel();

        wordsLeft = new JLabel("Enter Words Found");

        timer = new JLabel("Time Left");

      timeLeft = new JLabel("3:00");//JLabel for timer

      timeLeft.setMinimumSize(new Dimension(500,500));//sets size for label

        Shakedice = new JButton("Shake Dice");

        //dimensions for the shake dice button

         Shakedice.setMinimumSize(new Dimension(120, 60));

       Shakedice.setPreferredSize(new Dimension(120, 60));

       Shakedice.setMaximumSize(new Dimension(120, 60));

        Shakedice.setFont(null);//font size

        //setup Word panel

        wordPanel = new JPanel();

        currentWord = new JLabel();// label to show current word

        playerScore = new JLabel("Score:" + "0");// label that shows the player's score

        submitWord = new JButton("Submit Word");

        //dimensions for the submit word button

         submitWord.setMinimumSize(new Dimension(100, 50));

       submitWord.setPreferredSize(new Dimension(100, 50));

       submitWord.setMaximumSize(new Dimension(100, 50));

        submitWord.setFont(null);//font size

        //JButton ArrayList



    ArrayList <Die> dice = boggleBoard.shakeDice();

       int counter = 0;     

               for(int row = 0; row < 4; row++){

                     for(int col = 0; col < 4; col++){

        Die die = dice.get(counter);

        JButton button = new JButton();

         button.setText(die.getLetter());

        button.putClientProperty("letter",die.getLetter());

        button.putClientProperty("row",row);

        button.putClientProperty("col",col);

         diceButtons.add(button);

         diceButtons.setFont(null);

         counter++;

        }
    }     


        }


     private class ExitListener implements ActionListener { //action for exiting

         public void actionPerformed(ActionEvent e)

         {

             //dialogue to confirm quiting the game

             int response = JOptionPane.showConfirmDialog(null, "Confirm to exit Boggle?", 
                    "Exit?", JOptionPane.YES_NO_OPTION);

            if (response == JOptionPane.YES_OPTION)

             System.exit(0);//exit game

         }


     }




private class GameListener implements ActionListener{//implement actionlistener for game

     public void actionPerformed(ActionEvent e){


        textArea.revalidate();//revailidate text area

        timeLeft.repaint(); //repaint time left Jpanel

        Shakedice.setEnabled(true);//reenable shake dice button

}




        }


    private class ShakeListener implements ActionListener{




        public void actionPerformed(ActionEvent e){

        boggleBoard.shakeDice();//call shake dice method into shake listener

        //Random randomDie = new Random();//new radomization 

         //String placement = randomDie.(diceButtons);

        diceButtons.revalidate();// revalidates dice buttons

        playerScore.repaint();//reset score

        playerScore.setText("Score:" + "0");// set to 0

        currentWord.repaint();// reset current word

         timeLeft.repaint();// reset timer

         Shakedice.setEnabled(false);//disable shake dice button




        }


    }



     private class SubmitWordListener implements ActionListener{

         boolean wordValidate = false;

     public void actionPerformed(ActionEvent e){

             if(wordValidate = true){

        System.out.println("TemporaryDictionary.txt");

       textArea.append("" + currentWord);

        currentWord.revalidate();//update current word j label

             }

         }


        }         

    private class PanelListener implements ActionListener{

        public void actionPerformed(ActionEvent e){

            ArrayList <JButton> buttons = new ArrayList<JButton>();

            if(e.getSource()instanceof JButton){

                //create Jbutton with get properties

                JButton button = (JButton)e.getSource();

                String letter = button.getClientProperty("letter").toString();

                int rowClick = (int) button.getClientProperty("row");

                int colClick = (int) button.getClientProperty("col");

                //get text in label

                String word = currentWord.getText();

                currentWord.setText(word + letter);

                int MIN_INDEX = 0;// minimum index

                int MAX_INDEX = 3;// maximum index

                // enable/disable the buttons

                int count = 0;

                for(int row = 0; row < 4;)

                   for(int col = 0; col < 4;){

                    if(row == rowClick && col == colClick)

                        button.setEnabled(false);

                    if(colClick > MIN_INDEX && colClick < MAX_INDEX && rowClick > MIN_INDEX && rowClick < MAX_INDEX){

                        buttons.get(count).setEnabled(true);

                        count++;

                    }

                }
            }

        }

    }

    private class TimerListener implements ActionListener{

        public void actionPerformed(ActionEvent e){

            timeMili -= 1000;

            //conversion into minutes and seconds

            if(timeSec == 0){

                timeSec = 59;

                timeMin --;

            }

            else{

                timeSec --;

            }

            timeLeft.setText("3:00");//enable time left to start countdown

        }

    }


    }
4

1 回答 1

1

如果您在 Eclipse 等 IDE 中运行它,您可以放置​​一个断点,然后运行您的应用程序并单步执行它,以查看您的代码到底在做什么。

如果您无法访问调试器,您可以简单地使用System.out.println()调用来报告程序的当前状态——它并不优雅,但它可以工作。

于 2015-07-22T01:11:13.223 回答