Java中国象棋博弈程序探秘[6]——游戏与界面

Java中国象棋博弈程序探秘[6]——游戏与界面,第1张

游戏与界面

转载请保留作者信息:

作者:88250

Blog:http:/blog.csdn.net/DL88250

MSN & Gmail & QQ:DL88250@gmail.com

有了以上的基础,我们加个游戏管理与界面就可以进行游戏了!呵呵~
/*

 * @(#)ChineseChessGUIView.java

 * Author: 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * Created on May 26, 2008, 3:52:51 PM

 * 

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation; either version 3 of the License, or

 * (at your option) any later version.

 * 

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

 * GNU Library General Public License for more details.

 * 

 * You should have received a copy of the GNU General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

 */

package cn.edu.ynu.sei.chinesechess.ui;



import org.jdesktop.application.Action;

import org.jdesktop.application.ResourceMap;

import org.jdesktop.application.SingleFrameApplication;

import org.jdesktop.application.FrameView;

import org.jdesktop.application.TaskMonitor;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.Timer;

import javax.swing.Icon;

import javax.swing.JDialog;

import javax.swing.JFrame;



/**

 * Chinese chess application's main frame view.

 * @author 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * @version 1.0.1.4, Jun 4, 2008

 */

public class ChineseChessGUIView extends FrameView {



    /**

     * Constructor with parameter.

     * @param app single frame application

     */

    public ChineseChessGUIView(SingleFrameApplication app) {

        super(app);



        initComponents();



        // status bar initialization - message timeout, idle icon and busy animation, etc

        ResourceMap resourceMap = getResourceMap();

        int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");

        messageTimer = new Timer(messageTimeout, new ActionListener() {



                             public void actionPerformed(ActionEvent e) {

                                 statusMessageLabel.setText("");

                                 System.out.println("!");

                             }

                         });

        messageTimer.setRepeats(false);

        int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");

        for (int i = 0; i < busyIcons.length; i++) {

            busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");

        }

        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {



                              public void actionPerformed(ActionEvent e) {

                                  busyIconIndex = (busyIconIndex + 1) % busyIcons.length;

                                  statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);

                              }

                          });

        idleIcon = resourceMap.getIcon("StatusBar.idleIcon");

        statusAnimationLabel.setIcon(idleIcon);

        progressBar.setVisible(false);



        // connecting action tasks to status bar via TaskMonitor

        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());

        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {



                                          public void propertyChange(

                                                  java.beans.PropertyChangeEvent evt) {

                                              String propertyName = evt.getPropertyName();

                                              if ("started".equals(propertyName)) {

                                                  if (!busyIconTimer.isRunning()) {

                                                      statusAnimationLabel.setIcon(

                                                              busyIcons[0]);

                                                      busyIconIndex = 0;

                                                      busyIconTimer.start();

                                                  }

                                                  progressBar.setVisible(true);

                                                  progressBar.setIndeterminate(true);

                                              } else if ("done".equals(propertyName)) {

                                                  busyIconTimer.stop();

                                                  statusAnimationLabel.setIcon(idleIcon);

                                                  progressBar.setVisible(false);

                                                  progressBar.setValue(0);

                                              } else if ("message".equals(propertyName)) {

                                                  String text =

                                                          (String) (evt.getNewValue());

                                                  statusMessageLabel.setText((text == null)

                                                                             ? "" : text);

                                                  messageTimer.restart();

                                              } else if ("progress".equals(propertyName)) {

                                                  int value =

                                                          (Integer) (evt.getNewValue());

                                                  progressBar.setVisible(true);

                                                  progressBar.setIndeterminate(false);

                                                  progressBar.setValue(value);

                                              }

                                          }

                                      });

    }



    @Action

    public void showAboutBox() {

        if (aboutBox == null) {

            JFrame mainFrame = ChineseChessGUIApp.getApplication().getMainFrame();

            aboutBox = new ChineseChessGUIAboutBox(mainFrame);

            aboutBox.setLocationRelativeTo(mainFrame);

        }

        ChineseChessGUIApp.getApplication().show(aboutBox);

    }



    /** This method is called from within the constructor to

     * initialize the form.

     * WARNING: Do NOT modify this code. The content of this method is

     * always regenerated by the Form Editor.

     */

    @SuppressWarnings("unchecked")

    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          

    private void initComponents() {



        mainPanel = new javax.swing.JPanel();

        chessboardPanel = new ChessBoardPanel();

        jScrollPane1 = new javax.swing.JScrollPane();

        HumanOutput = new javax.swing.JTextArea();

        jScrollPane2 = new javax.swing.JScrollPane();

        ComputerOutput = new javax.swing.JTextArea();

        unMoveBtn = new javax.swing.JButton();

        menuBar = new javax.swing.JMenuBar();

        javax.swing.JMenu fileMenu = new javax.swing.JMenu();

        newItem = new javax.swing.JMenuItem();

        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();

        javax.swing.JMenu helpMenu = new javax.swing.JMenu();

        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();

        statusPanel = new javax.swing.JPanel();

        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();

        statusMessageLabel = new javax.swing.JLabel();

        statusAnimationLabel = new javax.swing.JLabel();

        progressBar = new javax.swing.JProgressBar();



        mainPanel.setName("mainPanel"); // NOI18N



        chessboardPanel.setName("chessboardPanel"); // NOI18N



        javax.swing.GroupLayout chessboardPanelLayout = new javax.swing.GroupLayout(chessboardPanel);

        chessboardPanel.setLayout(chessboardPanelLayout);

        chessboardPanelLayout.setHorizontalGroup(

            chessboardPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

            .addGap(0, 305, Short.MAX_VALUE)

        );

        chessboardPanelLayout.setVerticalGroup(

            chessboardPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

            .addGap(0, 219, Short.MAX_VALUE)

        );



        jScrollPane1.setName("jScrollPane1"); // NOI18N



        HumanOutput.setColumns(20);

        HumanOutput.setRows(5);

        HumanOutput.setName("HumanOutput"); // NOI18N

        jScrollPane1.setViewportView(HumanOutput);



        jScrollPane2.setName("jScrollPane2"); // NOI18N



        ComputerOutput.setColumns(20);

        ComputerOutput.setRows(5);

        ComputerOutput.setName("ComputerOutput"); // NOI18N

        jScrollPane2.setViewportView(ComputerOutput);



        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(cn.edu.ynu.sei.chinesechess.ui.ChineseChessGUIApp.class).getContext().getResourceMap(ChineseChessGUIView.class);

        unMoveBtn.setText(resourceMap.getString("unMoveBtn.text")); // NOI18N

        unMoveBtn.setEnabled(false);

        unMoveBtn.setName("unMoveBtn"); // NOI18N

        unMoveBtn.addMouseListener(new java.awt.event.MouseAdapter() {

            public void mousePressed(java.awt.event.MouseEvent evt) {

                unMoveBtnMousePressed(evt);

            }

        });



        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);

        mainPanel.setLayout(mainPanelLayout);

        mainPanelLayout.setHorizontalGroup(

            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

            .addGroup(mainPanelLayout.createSequentialGroup()

                .addComponent(chessboardPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

                .addGap(160, 160, 160)

                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)

                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)

                    .addComponent(unMoveBtn))

                .addGap(384, 384, 384))

        );

        mainPanelLayout.setVerticalGroup(

            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

            .addGroup(mainPanelLayout.createSequentialGroup()

                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

                    .addComponent(chessboardPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

                    .addGroup(mainPanelLayout.createSequentialGroup()

                        .addContainerGap()

                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

                        .addGap(21, 21, 21)

                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

                        .addGap(27, 27, 27)

                        .addComponent(unMoveBtn)))

                .addContainerGap(205, Short.MAX_VALUE))

        );



        menuBar.setName("menuBar"); // NOI18N



        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N

        fileMenu.setName("fileMenu"); // NOI18N



        newItem.setText(resourceMap.getString("newItem.text")); // NOI18N

        newItem.setName("newItem"); // NOI18N

        newItem.addMouseListener(new java.awt.event.MouseAdapter() {

            public void mousePressed(java.awt.event.MouseEvent evt) {

                newItemMousePressed(evt);

            }

        });

        fileMenu.add(newItem);



        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(cn.edu.ynu.sei.chinesechess.ui.ChineseChessGUIApp.class).getContext().getActionMap(ChineseChessGUIView.class, this);

        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N

        exitMenuItem.setName("exitMenuItem"); // NOI18N

        fileMenu.add(exitMenuItem);



        menuBar.add(fileMenu);



        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N

        helpMenu.setName("helpMenu"); // NOI18N



        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N

        aboutMenuItem.setName("aboutMenuItem"); // NOI18N

        helpMenu.add(aboutMenuItem);



        menuBar.add(helpMenu);



        statusPanel.setName("statusPanel"); // NOI18N



        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N



        statusMessageLabel.setName("statusMessageLabel"); // NOI18N



        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);

        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N



        progressBar.setName("progressBar"); // NOI18N



        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);

        statusPanel.setLayout(statusPanelLayout);

        statusPanelLayout.setHorizontalGroup(

            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

            .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 1013, Short.MAX_VALUE)

            .addGroup(statusPanelLayout.createSequentialGroup()

                .addContainerGap()

                .addComponent(statusMessageLabel)

                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 829, Short.MAX_VALUE)

                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

                .addComponent(statusAnimationLabel)

                .addContainerGap())

        );

        statusPanelLayout.setVerticalGroup(

            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

            .addGroup(statusPanelLayout.createSequentialGroup()

                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)

                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

                    .addComponent(statusMessageLabel)

                    .addComponent(statusAnimationLabel)

                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

                .addGap(3, 3, 3))

        );



        setComponent(mainPanel);

        setMenuBar(menuBar);

        setStatusBar(statusPanel);

    }// </editor-fold>                        

    public static boolean isUnmoved = false;

private void unMoveBtnMousePressed(java.awt.event.MouseEvent evt) {                                       

    ((ChessBoardPanel) chessboardPanel).gameManager.unMove();

    isUnmoved = true;

}                                      



private void newItemMousePressed(java.awt.event.MouseEvent evt) {                                     

    ((ChessBoardPanel) chessboardPanel).reset();

}                                    

    // Variables declaration - do not modify                     

    public static javax.swing.JTextArea ComputerOutput;

    public static javax.swing.JTextArea HumanOutput;

    private javax.swing.JPanel chessboardPanel;

    private javax.swing.JScrollPane jScrollPane1;

    private javax.swing.JScrollPane jScrollPane2;

    private javax.swing.JPanel mainPanel;

    private javax.swing.JMenuBar menuBar;

    private javax.swing.JMenuItem newItem;

    private javax.swing.JProgressBar progressBar;

    private javax.swing.JLabel statusAnimationLabel;

    private javax.swing.JLabel statusMessageLabel;

    private javax.swing.JPanel statusPanel;

    public static javax.swing.JButton unMoveBtn;

    // End of variables declaration                   

    private final Timer messageTimer;

    private final Timer busyIconTimer;

    private final Icon idleIcon;

    private final Icon[] busyIcons = new Icon[15];

    private int busyIconIndex = 0;

    private JDialog aboutBox;

}







/*

 * @(#)ChineseChessGUIAboutBox.java

 * Author: 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * Created on May 26, 2008, 2:52 PM

 * 

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation; either version 3 of the License, or

 * (at your option) any later version.

 * 

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

 * GNU Library General Public License for more details.

 * 

 * You should have received a copy of the GNU General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

 */

package cn.edu.ynu.sei.chinesechess.ui;



import cn.edu.ynu.sei.chinesechess.game.ComputerPlayer;

import cn.edu.ynu.sei.chinesechess.game.GameManager;

import cn.edu.ynu.sei.chinesechess.ui.util.LocationDeterminator;

import cn.edu.ynu.sei.chinesechess.ui.util.UIResourcesHolder;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Point;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.JPanel;



/**

 * Chinese chessboard panel.

 * @author  88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * @version 1.0.1.2, Jun 4, 2008

 */

public class ChessBoardPanel extends JPanel {



    private static final long serialVersionUID = 1L;

    /**

     * Resources holder

     */

    UIResourcesHolder resHolder = UIResourcesHolder.getInstance();

    /**

     * chessboard' image

     */

    Image chessboardImg = resHolder.getChessBoardImage();

    /**

     * Size of a chessman's image

     */

    public static final int SIZE_CHESSMAN = 40;

    /**

     * game manager

     */

    public GameManager gameManager;

    /**

     * computer player, only has a little AI :-)

     */

    private ComputerPlayer computerPlayer;

    // from/to location in human's turn

    private Point from,  to;



    /** Creates new form ChessBoardPanel */

    public ChessBoardPanel() {

        mouseEventHandle();

        gameManager = new GameManager(this);

        computerPlayer = new ComputerPlayer(gameManager);

    }



    /**

     * Rests the whole chessboard, and restarts the game.

     */

    public void reset() {

        gameManager.restartGame();

        ChineseChessGUIView.unMoveBtn.setEnabled(false);

    }



    /**

     * Hanlds mouse event.

     */

    private void mouseEventHandle() {

        MouseAdapter mouseAdpater = new MouseAdapter() {



            @Override

            public void mouseClicked(MouseEvent e) {

                super.mouseClicked(e);

                Point crossing = LocationDeterminator.belongCrossing(e.getPoint());

                if (gameManager.isRedGo) {

                    if (from != null) {

                        // get destintion

                        to = crossing;

                        gameManager.moveMotion(from, to);

                        from = to = null;

                        new Thread(computerPlayer).start();

                    } else if (gameManager.isRedChessman(crossing)) {

                        // get from location

                        from = crossing;

                        ChineseChessGUIView.HumanOutput.setText("From : " +

                                                                from.x + ", " + from.y);

                    }

                }

            }

        };



        addMouseListener(mouseAdpater);



    }



    @Override

    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        int imgWidth = chessboardImg.getWidth(null);

        int imgHeight = chessboardImg.getHeight(null);

        this.setBounds(0, 0, imgWidth, imgHeight);

        g.drawImage(chessboardImg, 0, 0, null);

    }

}







/*

 * @(#)Chessman.java

 * Author: 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * Created on May 26, 2008, 3:43:48 PM

 * 

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation; either version 3 of the License, or

 * (at your option) any later version.

 * 

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

 * GNU Library General Public License for more details.

 * 

 * You should have received a copy of the GNU General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

 */

package cn.edu.ynu.sei.chinesechess.game;



import cn.edu.ynu.sei.chinesechess.ui.ChessBoardPanel;

import cn.edu.ynu.sei.chinesechess.ui.util.LocationDeterminator;

import cn.edu.ynu.sei.chinesechess.ui.util.UIResourcesHolder;

import java.awt.Image;

import java.awt.Point;

import javax.swing.ImageIcon;

import javax.swing.JLabel;



/**

 * Canvas for paint chessmans.

 * @author 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * @version 1.0.0.1, Jun 4, 2008

 */

public class Chessman extends JLabel {



    private static final long serialVersionUID = 1L;

    /**

     * Resources holder

     */

    UIResourcesHolder resHolder = UIResourcesHolder.getInstance();

    /**

     * this label's location

     */

    Point location;

    /**

     * label's image

     */

    Image chessmanImg;



    /**

     * Constructor with parameters.

     * @param x x coordinate of this chessman in chessboard

     * @param y y coordinate of this chessman in chessboard

     */

    public Chessman(int x, int y) {

        location = LocationDeterminator.getRealLocation(new Point(x, y));

        this.setBounds(location.x, location.y,

                       ChessBoardPanel.SIZE_CHESSMAN,

                       ChessBoardPanel.SIZE_CHESSMAN);

        chessmanImg = resHolder.getChessmanImage(x, y);

        if (chessmanImg != null) {

            this.setIcon(new ImageIcon(chessmanImg));

        }

    }



    /**

     * Moves this chessman to a new location.

     * @param destinate the specified destination

     */

    public void move(Point destinate) {

        location = LocationDeterminator.getRealLocation(destinate);

        setLocation(location);

    }

}



/*

 * @(#)ComputerPlayer.java

 * Author: 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * Created on May 23, 2008, 12:02:50 PM

 * 

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation; either version 3 of the License, or

 * (at your option) any later version.

 * 

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

 * GNU Library General Public License for more details.

 * 

 * You should have received a copy of the GNU General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

 */

package cn.edu.ynu.sei.chinesechess.game;



import cn.edu.ynu.sei.chinesechess.infrastructure.search.SearchEngine;

import java.awt.Point;



/**

 * Computer player.

 * @author 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * @version 1.0.0.4, Jun 7, 2008

 */

public class ComputerPlayer implements Runnable {



    /**

     * game manager

     */

    private GameManager gameManager;

    /**

     * game tree search engine

     */

    private SearchEngine searchEngine;



    /**

     * Constructor with parameters.

     * @param gameManager game manager

     */

    public ComputerPlayer(GameManager gameManager) {

        this.gameManager = gameManager;

        searchEngine = new SearchEngine(gameManager.situation);

        SearchEngine.SEARCH_DEPTH = 6;

    }



    /**

     * Using search algorithm to find a best move and make move.

     */

    private void doBestMotion() {

        if (!gameManager.isRedGo) {

            long startTime = System.nanoTime();

            if (!searchEngine.bookSearch()) {

                int value = searchEngine.findTheBestMove(gameManager.situation.chessboard);

                if (value == -SearchEngine.WIN) {

                    // TODO game is over

                    System.out.println("You win!");

                }

            }

            gameManager.moveMotion(new Point(searchEngine.bestMotion.fromX,

                                             searchEngine.bestMotion.fromY),

                                   new Point(searchEngine.bestMotion.toX,

                                             searchEngine.bestMotion.toY));

            long estimatedTime = System.nanoTime() - startTime;

            System.out.println("Elapsed Time: " + estimatedTime / 1000000000.0 + "s");

        }

    }



    @Override

    public void run() {

        doBestMotion();

    }

}



/*

 * @(#)GameManager.java

 * Author: 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * Created on Jun 2, 2008, 5:30:47 PM

 * 

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation; either version 3 of the License, or

 * (at your option) any later version.

 * 

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

 * GNU Library General Public License for more details.

 * 

 * You should have received a copy of the GNU General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

 */

package cn.edu.ynu.sei.chinesechess.game;



import cn.edu.ynu.sei.chinesechess.infrastructure.common.Situation;

import cn.edu.ynu.sei.chinesechess.infrastructure.search.TranspositionTable;

import cn.edu.ynu.sei.chinesechess.ui.ChessBoardPanel;

import cn.edu.ynu.sei.chinesechess.ui.ChineseChessGUIView;

import cn.edu.ynu.sei.chinesechess.ui.util.UIResourcesHolder;

import java.awt.Point;

import java.util.Stack;



/**

 * Chinese chess game manager. A game at least contains two players, 

 * a set of chessboard, a chessboard and so on.

 * @author 88250 <DL88250@gmail.com>, http://blog.csdn.net/DL88250

 * @version 1.0.0.1, Jun 4, 2008

 */

public class GameManager {



    /**

     * to user interface, all coordinates from (1, 1),

     * left-bottom corner(1, 1), right-top corner(9, 10)

     */

    public Chessman[][] chessboard = new Chessman[9][10];

    /**

     * is red side's trun?

     */

    public boolean isRedGo;

    /**

     * infrastructure control

     */

    Situation situation = new Situation();

    /**

     * holds history motions

     */

    public static Stack<LatestMove> latestMotions = new Stack<LatestMove>();

    private ChessBoardPanel boardPanel;

    private UIResourcesHolder resHolder = UIResourcesHolder.getInstance();



    /**

     * Restarts the game.

     */

    public void restartGame() {

        latestMotions.clear();

        situation.init();

        isRedGo = situation.isRedGo;

        boardPanel.removeAll();



        for (int i = 0; i < 9; i++) {

            for (int j = 0; j < 10; j++) {

                int who = situation.chessboard[i][j];

                if (who != 0) {

                    chessboard[i][j] = new Chessman(i, j);

                    boardPanel.add(chessboard[i][j]);

                }

            }

        }

        boardPanel.updateUI();

    }



    /**

     * Undo the leaste motion.

     */

    synchronized public void unMove() {

        // unmove infrastructure chessman

        if (!latestMotions.isEmpty()) {

            situation.unMove();



            LatestMove latestMotion = latestMotions.pop();

            // recovery move

            chessboard[latestMotion.from.x][latestMotion.from.y] = latestMotion.chessman;

            chessboard[latestMotion.to.x][latestMotion.to.y].move(latestMotion.from);

            // recovery eaten

            chessboard[latestMotion.to.x][latestMotion.to.y] = latestMotion.latestBeEaten;

            if (chessboard[latestMotion.to.x][latestMotion.to.y] != null) {

                boardPanel.add(chessboard[latestMotion.to.x][latestMotion.to.y]);

            }

            // recovery who's go

            isRedGo = latestMotion.isRedGo;

        }

        setUnMoveButtonStatus();

    }



    /**

     * Move a chessman to desination.

     * @param from location of chessman

     * @param to destination of chessman

     */

    synchronized public void moveMotion(Point from, Point to) {

        // move infrastructure chessman

        int moveStatus = situation.makeMove(from.x, from.y, to.x, to.y);

        TranspositionTable.moveHash(from.x, from.y, to.x, to.y,

                                    situation.chessboard);



        if (moveStatus != -100) {

            // move successfully, changes the GUI display

            ChineseChessGUIView.ComputerOutput.setText("From : " +

                                                       from.x + ", " + from.y +

                                                       "/nTo : " +

                                                       to.x + ", " + to.y);

            Chessman chessman = chessboard[from.x][from.y];

            Chessman latestBeEaten = chessboard[to.x][to.y];

            latestMotions.push(new LatestMove(chessman, from, to,

                                              latestBeEaten,

                                              isRedGo));

            resHolder.getAudioPa().play();

            if (moveStatus != 0) {

                // eat move

                boardPanel.remove(chessboard[to.x][to.y]);

                chessboard[to.x][to.y] = null;

                resHolder.getAudioPata().play();

            }

            chessboard[from.x][from.y].move(to);



            chessboard[to.x][to.y] = chessboard[from.x][from.y];

            chessboard[from.x][from.y] = null;



            isRedGo = situation.isRedGo;

        }



        setUnMoveButtonStatus();

    }



    /**

     * The specified location has a red chessman?

     * @param location the specified location

     * @return if there is red chessman, returns <code>true</code>,

     * otherwise, returns <code>false</code>

     */

    public boolean isRedChessman(Point location) {

        return Situation.isRed(situation.chessboard[location.x][location.y]);

    }



    private void setUnMoveButtonStatus() {

        if (!GameManager.latestMotions.isEmpty()) {

            ChineseChessGUIView.unMoveBtn.setEnabled(true);

        } else {

            ChineseChessGUIView.unMoveBtn.setEnabled(false);

        }

    }



    /**

     * Default constructor with parameter.

     * @param boardPanel chessboard panel

     */

    public GameManager(ChessBoardPanel boardPanel) {

        this.boardPanel = boardPanel;

        restartGame();

    }

}


可以把代码贴到带Javadoc查看的IDE里看一下,那样比较清晰 : )

最终的效果如下:

完整工程下载地址:http://download.csdn.net/source/528837

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2088789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存