本文實例講述了java實現的中國象棋游戲代碼,分享給大家供大家參考,具體代碼如下
一、實踐目的:
1.鼠標點擊、拖動等事件的應用與區別
2.棋譜文件的保存與讀取
3.完善象棋的規則。
二、實踐內容:
中國象棋歷史悠久,吸引了無數的人研究,現對中國象棋的對戰和實現棋譜的制作做如下的設計和說明,供大家參考學習。
1、機機對弈,紅方先手。在符合規則的情況下拖動棋子到目的地,松鼠標落子。

人人對弈圖
2、制作棋譜,選擇制作棋譜菜單后,對弈開始,并記錄了下棋過程。

選擇“制作棋譜”菜單


棋譜制作完畢紅方勝出
一方勝出后彈出勝利消息對話框。點擊確定后,選擇“保存棋譜”菜單,彈出保存文件對話框。

保存棋譜對話框
3.演示棋譜,選擇演示棋譜菜單后,彈出打開對話框,選擇保存好的棋譜,開始演示。

演示棋譜對話框

演示棋譜過程(自動和手動兩種)
三、參考代碼:
1.象棋主類 文件ChineseChess.java
package cn.edu.ouc.chineseChess; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.LinkedList; /** * 象棋主類 * * @author cnlht */ public class ChineseChess extends JFrame implements ActionListener { ChessBoard board = null; Demon demon = null; MakeChessManual record = null; Container con = null; JMenuBar bar; JMenu fileMenu; JMenuItem 制作棋譜, 保存棋譜, 演示棋譜; JFileChooser fileChooser = null; LinkedList 棋譜 = null; public ChineseChess() { bar = new JMenuBar(); fileMenu = new JMenu("中國象棋"); 制作棋譜 = new JMenuItem("制作棋譜"); 保存棋譜 = new JMenuItem("保存棋譜"); 保存棋譜.setEnabled(false); 演示棋譜 = new JMenuItem("演示棋譜"); fileMenu.add(制作棋譜); fileMenu.add(保存棋譜); fileMenu.add(演示棋譜); bar.add(fileMenu); setJMenuBar(bar); setTitle(制作棋譜.getText()); 制作棋譜.addActionListener(this); 保存棋譜.addActionListener(this); 演示棋譜.addActionListener(this); board = new ChessBoard(45, 45, 9, 10); record = board.record; con = getContentPane(); JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, board, record); split.setDividerSize(5); split.setDividerLocation(460); con.add(split, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setVisible(true); setBounds(60, 20, 690, 540); fileChooser = new JFileChooser(); con.validate(); validate(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == 制作棋譜) { con.removeAll(); 保存棋譜.setEnabled(true); this.setTitle(制作棋譜.getText()); board = new ChessBoard(45, 45, 9, 10); record = board.record; JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, board, record); split.setDividerSize(5); split.setDividerLocation(460); con.add(split, BorderLayout.CENTER); validate(); } if (e.getSource() == 保存棋譜) { int state = fileChooser.showSaveDialog(null); File saveFile = fileChooser.getSelectedFile(); if (saveFile != null && state == JFileChooser.APPROVE_OPTION) { try { FileOutputStream outOne = new FileOutputStream(saveFile); ObjectOutputStream outTwo = new ObjectOutputStream(outOne); outTwo.writeObject(record.獲取棋譜()); outOne.close(); outTwo.close(); } catch (IOException event) { } } } if (e.getSource() == 演示棋譜) { con.removeAll(); con.repaint(); con.validate(); validate(); 保存棋譜.setEnabled(false); int state = fileChooser.showOpenDialog(null); File openFile = fileChooser.getSelectedFile(); if (openFile != null && state == JFileChooser.APPROVE_OPTION) { try { FileInputStream inOne = new FileInputStream(openFile); ObjectInputStream inTwo = new ObjectInputStream(inOne); 棋譜 = (LinkedList) inTwo.readObject(); inOne.close(); inTwo.close(); ChessBoard board = new ChessBoard(45, 45, 9, 10); demon = new Demon(board); demon.set棋譜(棋譜); con.add(demon, BorderLayout.CENTER); con.validate(); validate(); this.setTitle(演示棋譜.getText() + ":" + openFile); } catch (Exception event) { JLabel label = new JLabel("不是棋譜文件"); label.setFont(new Font("隸書", Font.BOLD, 60)); label.setForeground(Color.red); label.setHorizontalAlignment(SwingConstants.CENTER); con.add(label, BorderLayout.CENTER); con.validate(); this.setTitle("沒有打開棋譜"); validate(); } } else { JLabel label = new JLabel("沒有打開棋譜文件呢"); label.setFont(new Font("隸書", Font.BOLD, 50)); label.setForeground(Color.pink); label.setHorizontalAlignment(SwingConstants.CENTER); con.add(label, BorderLayout.CENTER); con.validate(); this.setTitle("沒有打開棋譜文件呢"); validate(); } } } public static void main(String args[]) { new ChineseChess(); } } 2.象棋棋盤類文件ChessBoard.java
package cn.edu.ouc.chineseChess; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * 棋盤類 * * @author cnlht */ public class ChessBoard extends JPanel implements MouseListener, MouseMotionListener { public ChessPoint point[][]; public int unitWidth, unitHeight; private int x軸長, y軸長; private int x, y; private Image img; protected Image pieceImg; private boolean move = false; public String 紅方顏色 = "紅方", 黑方顏色 = "黑方"; ChessPiece 紅車1, 紅車2, 紅馬1, 紅馬2, 紅相1, 紅相2, 紅帥, 紅士1, 紅士2, 紅兵1, 紅兵2, 紅兵3, 紅兵4, 紅兵5, 紅炮1, 紅炮2; ChessPiece 黑車1, 黑車2, 黑馬1, 黑馬2, 黑將, 黑士1, 黑士2, 黑卒1, 黑卒2, 黑卒3, 黑卒4, 黑卒5, 黑象1, 黑象2, 黑炮1, 黑炮2; int startX, startY; int startI, startJ; public boolean 紅方走棋 = true, 黑方走棋 = false; Rule rule = null; public MakeChessManual record = null; public ChessBoard(int w, int h, int r, int c) { setLayout(null); addMouseListener(this); addMouseMotionListener(this); Color bc = getBackground(); unitWidth = w; unitHeight = h; x軸長 = r; y軸長 = c; point = new ChessPoint[r + 1][c + 1]; for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { point[i][j] = new ChessPoint(i * unitWidth, j * unitHeight, false); } } rule = new Rule(this, point); record = new MakeChessManual(this, point); img = Toolkit.getDefaultToolkit().getImage("board.jpg"); pieceImg = Toolkit.getDefaultToolkit().getImage("piece.gif"); 紅車1 = new ChessPiece("
主站蜘蛛池模板:
绥阳县|
金坛市|
安西县|
青神县|
临漳县|
日土县|
石渠县|
青铜峡市|
林芝县|
杭锦旗|
广安市|
方城县|
大化|
昭觉县|
古丈县|
海伦市|
含山县|
澎湖县|
黄平县|
鹿邑县|
岳西县|
阿尔山市|
双峰县|
上饶市|
蒙自县|
莱阳市|
昭觉县|
乌兰察布市|
民丰县|
临高县|
肥城市|
博罗县|
化隆|
双桥区|
耒阳市|
兰考县|
惠州市|
瑞安市|
富源县|
壤塘县|
奉节县|