⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demon.java

📁 JAVA版中国象棋
💻 JAVA
字号:
package xq;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Demon extends JPanel implements ActionListener,Runnable {
	private Chess chess;
	public JButton replay = null,next = null, auto = null, stop = null;
	LinkedList 棋谱 = null;
	Thread 自动演示 = null;
	int index = -1;
	ChessBoard board = null;
	JTextArea text;
	JTextField 时间间隔 = null;
	int time = 1000;
	String 演示过程 = " ";
	JSplitPane splitH = null, splitV = null;
	

	public Demon(ChessBoard board) {
		// TODO 自动生成构造函数存根
		this.board = board ;
		replay = new JButton("重新演示");
		next = new JButton("下一步");
		auto = new JButton("自动演示");
		stop = new JButton("暂停演示");
		自动演示 = new Thread(this);
		replay.addActionListener(this);
		next.addActionListener(this);
		auto.addActionListener(this);
		stop.addActionListener(this);
		text = new JTextArea();
		时间间隔 = new JTextField("1");
		setLayout(new BorderLayout());
		JScrollPane pane = new JScrollPane(text);
		text.setEditable(false);
		text.setLineWrap(true);
		JPanel p = new JPanel(new GridLayout(3,2));
		p.add(next);
		p.add(replay);
		p.add(auto);
		p.add(stop);
		p.add(new JLabel("时间间隔(秒)",SwingConstants.CENTER));
		p.add(时间间隔);
		splitV = new JSplitPane(JSplitPane.VERTICAL_SPLIT, pane, p);
		splitH = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, board, splitV);
		splitV.setDividerSize(5);
		splitV.setDividerLocation(400);
		splitH.setDividerSize(5);
		splitH.setDividerLocation(460);
		add(splitH, BorderLayout.CENTER);
		validate();
	}
	
	public void set棋谱(LinkedList 棋谱){
		this.棋谱 = 棋谱;
	}
	
	public char numberToLetter(int n){//将数字对应到字母的方法
	     char c = '\n';
	     switch(n){
	     case 1: c = 'A';break;
	     case 2: c = 'B';break;
	     case 3: c = 'C';break;
	     case 4: c = 'D';break;
	     case 5: c = 'E';break;
	     case 6: c = 'F';break;
	     case 7: c = 'G';break;
	     case 8: c = 'H';break;
	     case 9: c = 'I';break;
	     case 10: c = 'J';break;
	     }
	     return c;
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() == next){
			index++;
			if(index < 棋谱.size()){
				演示一步(index);
			}
			else{
				演示结束("棋谱演示完毕");
			}
		}
		
		if(e.getSource() == replay){
			board = new ChessBoard(chess,45, 45, 9, 10);
			splitH.remove(board);
			splitH.setDividerSize(5);
			splitH.setDividerLocation(460);
			splitH.validate();
			text.setText(null);
		}
		
		if(e.getSource() == auto){
			next.setEnabled(false);
			replay.setEnabled(false);
			try{
				time = 1000*Integer.parseInt(时间间隔.getText().trim());
			}catch(NumberFormatException ee){
				time = 1000;
			}
			
			if(!(自动演示.isAlive())){
				//如果没有,则启动一个新的演示线程
				board = new ChessBoard(chess,45, 45, 9, 10);
				splitH.remove(board);
				splitH.setDividerSize(5);
				splitH.setDividerLocation(460);
				splitH.setLeftComponent(board);
				splitH.validate();
				自动演示.start();
			}
		}
		
		if(e.getSource() == stop){
			if(e.getActionCommand().equals("暂停演示")){
				演示过程 = "暂停演示";
				stop.setText("继续演示");
				stop.repaint();
			}
			
			if(e.getActionCommand().equals("继续演示")){
				演示过程 = "继续演示";
				自动演示.interrupt();
				stop.setText("暂停演示");
				stop.repaint();
			}
		}
	}
	
	public synchronized void run(){
		for(index = 0; index < 棋谱.size(); index++){
			try{
				Thread.sleep(time);
			}catch(InterruptedException e){
				
			}
			while(演示过程.equals("暂停演示")){
				try{
					wait();
				}catch(InterruptedException e){
					notifyAll();
				}
			}
			演示一步(index);
		}
		if(index >= 棋谱.size()){
			演示结束("棋谱演示完毕");
			next.setEnabled(true);
			replay.setEnabled(true);
		}
	}
	
	public void 演示一步(int index){
		MoveStep step = (MoveStep)棋谱.get(index);
		Point pStart = step.pStart;
		Point pEnd = step.pEnd;
		int startI = pStart.x;
		int startJ = pStart.y;
		int endI = pEnd.x;
		int endJ = pEnd.y;
		ChessPiece piece = (board.point)[startI][startJ].getPiece();
		if((board.point)[endI][endJ].isPiece()){
			ChessPiece pieceRemoved = (board.point)[endI][endJ].getPiece();
			(board.point)[endI][endJ].reMovePiece(pieceRemoved, board);
			board.repaint();
			(board.point)[startI][startJ].setPiece(piece, board);
			(board.point)[startI][startJ].set有棋子(false	);
			board.repaint();
		}
		else{
			(board.point)[endI][endJ].setPiece(piece, board);
			(board.point)[startI][startJ].set有棋子(false);
		}
		
		String 棋子类别 = piece.棋子类别();
		String name = piece.getName();
		String m = " #" + 棋子类别 + name + " : " + 
		startI + numberToLetter(startJ) + "到" + endI + numberToLetter(endJ);
		text.append(m);
		if(piece.棋子类别().equals(board.黑方颜色))
			text.append("\n");
	}
	
	public void 演示结束( String message){
		splitH.remove(board);
		splitH.setDividerSize(5);
		splitH.setDividerLocation(460);
		JLabel label = new JLabel(message);
		label.setFont(new Font("隶书",Font.BOLD,40));
		label.setForeground(Color.blue);
		label.setHorizontalAlignment(SwingConstants.CENTER);
		splitH.setLeftComponent(label);
		splitH.validate();
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -