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

📄 blackandwhite.java

📁 完成黑白棋的开发
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package BlackAndWhite;
import BlackAndWhite.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.lang.*;
import javax.swing.border.*;
import java.net.*;
import java.io.*;

public class BlackAndWhite extends JFrame 
implements Observer,ActionListener{
	public ClockPanel clockP;
	public InfoPanel infoP;
	public ChessBoardPanel cbP;
	
	public Chessboard cb;
	
	public JButton startB;
	private JButton redoB;
	private JButton surrenderB;
	private JPanel JButtonP;
	
	private JTextField messageT;
	public TextArea infoT;
	private JButton sendB;
	private JPanel textP;
	
	private JMenuBar MBA;
	private JMenu operaterM;
	private JMenu aboutM;
	private JMenuItem connectMI;
	private JMenuItem establishMI;
	private JMenuItem disconnectMI;
	private JMenuItem exitMI;
	private JMenuItem aboutMI;
	
	private JPanel leftP;
	private JPanel rightP;
	private JPanel mainP;
	static BlackAndWhite f;
	
	public int currentP=Style.BLACK;
	
	private serverskt server;
	private clientskt client;
	private boolean isServer;
	public boolean isAct;
	public boolean ready,remready;
	public boolean started;
	public boolean isRedoSender;
	
	public String serverName="[主  机]:";
	public String clientName="[客户机]:";
	
	Object lockready=new Object();
	
	private clockPThread clockPT=null;
	
	public BlackAndWhite(String title){
		super(title);
		mainPanel();
		restart();
	}
	
	public void update(Observable o, Object arg){
		if(!started) return;
		if(cb.redo) return;
		if(currentP==cb.oldP){
			if(isServer)
				server.dataout("playchess,"+cb.currentX+","+cb.currentY);
			else
				client.dataout("playchess,"+cb.currentX+","+cb.currentY);
		}	
		if(isServer&&cb.currentP==Style.EMPTY){
			if(currentP==Style.BLACK){
				if(cb.countBlack>cb.countWhite){
					server.dataout("lose,");
					win();
				}
				else if(cb.countBlack<cb.countWhite){
					server.dataout("win,");
					lose();
				}
				else{
					server.dataout("draw,");
					drawgame();
				}
			}
			else{
				if(cb.countWhite>cb.countBlack){
					server.dataout("lose,");
					win();
				}
				else if(cb.countWhite<cb.countBlack){
					server.dataout("win,");
					lose();
				}
				else{
					server.dataout("draw,");
					drawgame();
				}
			}
		}
	}
	
	public void restart(){
		connectMI.setEnabled(true);
		disconnectMI.setEnabled(false);
		establishMI.setEnabled(true);
		startB.setEnabled(false);
		redoB.setEnabled(false);
		surrenderB.setEnabled(false);
		sendB.setEnabled(false);
		isAct=false;
		ready=remready=false;
		started=false;
		cb.restart();
		cbP.restart();
		clockP.restart();
		infoP.restart();
	}
	
	public synchronized void reset(){
		connectMI.setEnabled(false);
		disconnectMI.setEnabled(true);
		establishMI.setEnabled(false);
		if(isAct)
			startB.setEnabled(true);
		else
			startB.setEnabled(false);
		redoB.setEnabled(false);
		surrenderB.setEnabled(false);
		sendB.setEnabled(true);
		ready=remready=false;
		started=false;
		cb.reset();
		cbP.reset();
		clockP.reset();
		infoP.reset();
	}
	
	public void start(){	
		cb.start(Style.BLACK);
		cbP.start(currentP);
		clockP.start(currentP);
		if(isServer){			
			if(currentP==Style.BLACK)
				infoP.start(serverName,clientName);
			else
				infoP.start(clientName,serverName);
		}
		else{
			if(currentP==Style.BLACK)
				infoP.start(clientName,serverName);
			else
				infoP.start(serverName,clientName);
		}
		started=true;
		isRedoSender=false;
		connectMI.setEnabled(false);
		disconnectMI.setEnabled(true);
		establishMI.setEnabled(false);
		startB.setEnabled(false);
		redoB.setEnabled(true);
		surrenderB.setEnabled(true);
		sendB.setEnabled(true);
		disable(true);
	}
	
	public void win(){
		if(isServer)
			infoT.append(">"+serverName+" 获胜!\n"+">"+clientName+" 失败!\n");
		else
			infoT.append(">"+clientName+" 获胜!\n"+">"+serverName+" 失败!\n");
		currentP=Style.WHITE;
		over(statusDialog.WIN);
	}
	
	public void lose(){
		if(!isServer)
			infoT.append(">"+serverName+" 获胜!\n"+">"+clientName+" 失败!\n");
		else
			infoT.append(">"+clientName+" 获胜!\n"+">"+serverName+" 失败!\n");
		currentP=Style.BLACK;
		over(statusDialog.LOSE);
	}
	
	public void drawgame(){
		infoT.append(">平局\n");
		over(statusDialog.DRAW);
	}
	
	public void timeOut(){
		if(isServer){
			server.dataout("timeout,");
			infoT.append(">"+serverName+" 超时!\n"+">"+clientName+" 获胜\n");
			currentP=Style.BLACK;
			over(statusDialog.TIMEOUT);
		}
		else{
			client.dataout("timeout,");
		}
	}
	
	public void over(int s){
		reset();
		statusDialog sD=new statusDialog(f,s);
		sD.show();
	}
	
	public void redo(){
		if(isRedoSender&&(cb.currentP==currentP)){
			cb.redo();
		}
		else if(!isRedoSender&&(cb.currentP!=currentP)){
			cb.redo();
		}
		cb.redo();
	}
	
	public void disable(boolean b){
		redoB.setEnabled(b);
		surrenderB.setEnabled(b);
		cbP.disable(b);
		clockPT.setIdle(b);
	}
	
	public static void main(String arg[]){
	 	f=new BlackAndWhite("黑白棋");
		f.setResizable(false);		
		f.addWindowListener
		(new WindowAdapter() 
			{
				public void windowClosing(WindowEvent e) 
				{
					System.exit(0);
				}
			}
		);
		f.pack();
		f.setVisible(true);
	}
	
	private void mainPanel(){
		//设计界面
		cb=new Chessboard();		
		cb.addObserver(this);
		clockP=new ClockPanel(cb);
		clockP.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		infoP=new InfoPanel(cb);
		infoP.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		cbP=new ChessBoardPanel(cb);
		cbP.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		
		startB=new JButton(" 开 始 ");
		startB.addActionListener(this);
		redoB=new JButton(" 悔 棋 ");
		redoB.addActionListener(this);
		surrenderB=new JButton(" 认 输 ");
		surrenderB.addActionListener(this);
		JButtonP=new JPanel();
		JButtonP.add(startB);
		JButtonP.add(redoB);
		JButtonP.add(surrenderB);
		JButtonP.setSize(450,60);
		JButtonP.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		
		messageT=new JTextField(15);
		messageT.addKeyListener(new KeyListener(){
			public void keyPressed(KeyEvent e){
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
					if(!isAct) return ;
					if(messageT.getText().length()==0) return ;
					if(isServer){
						server.dataout("message,"+messageT.getText());
						infoT.append(serverName+":\n"+messageT.getText()+"\n");
					}
					else{
						client.dataout("message,"+messageT.getText());
						infoT.append(clientName+":\n"+messageT.getText()+"\n");
					}
					messageT.setText("");
				}
			}
			public void keyTyped(KeyEvent e){}
			public void keyReleased(KeyEvent e){}
		});
		infoT=new TextArea("",10,20,TextArea.SCROLLBARS_VERTICAL_ONLY);
		infoT.setEditable(false);
		sendB=new JButton("发送");
		sendB.addActionListener(this);
		textP=new JPanel();
		textP.setLayout(new BorderLayout());
		textP.add(infoT,BorderLayout.NORTH);
		textP.add(messageT,BorderLayout.CENTER);
		textP.add(sendB,BorderLayout.EAST);
		textP.setSize(200,250);
		textP.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		
		leftP=new JPanel();
		leftP.setLayout(new BorderLayout());
		leftP.add(cbP,BorderLayout.CENTER);
		leftP.add(JButtonP,BorderLayout.SOUTH);
		leftP.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
		
		rightP=new JPanel();
		rightP.setLayout(new BorderLayout());
		rightP.add(infoP,BorderLayout.NORTH);
		rightP.add(clockP,BorderLayout.CENTER);
		rightP.add(textP,BorderLayout.SOUTH);
		rightP.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
		
		mainP=new JPanel();
		mainP.setLayout(new BorderLayout());
		mainP.add(leftP,BorderLayout.CENTER);
		mainP.add(rightP,BorderLayout.EAST);
		
		MBA=new JMenuBar();
		operaterM=new JMenu("操作");
		aboutM=new JMenu("关于");
		connectMI=new JMenuItem("连接游戏");
		connectMI.addActionListener(this);
		establishMI=new JMenuItem("建立游戏");
		establishMI.addActionListener(this);
		disconnectMI=new JMenuItem("断开游戏");
		disconnectMI.addActionListener(this);
		exitMI=new JMenuItem("退出");
		exitMI.addActionListener(this);
		aboutMI=new JMenuItem("关于   ");
		aboutMI.addActionListener(this);
		operaterM.add(establishMI);
		operaterM.add(connectMI);
		operaterM.add(disconnectMI);
		operaterM.addSeparator();
		operaterM.add(exitMI);
		aboutM.add(aboutMI);
		MBA.add(operaterM);
		MBA.add(aboutM);
		
		setJMenuBar(MBA);
		getContentPane().add(mainP);		
		int width=Toolkit.getDefaultToolkit().getScreenSize().width;
		int height=Toolkit.getDefaultToolkit().getScreenSize().height;
		int x=(width-600)/2;
		int y=(height-500)/2;
		this.setLocation(x,y);
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==startB){
			if(clockPT==null){
				clockPT=new clockPThread(f);
				clockPT.start();
			}
			if(isServer){
				synchronized(lockready){
					if(currentP==Style.BLACK)
						server.dataout("start,"+Style.WHITE);
					else
						server.dataout("start,"+Style.BLACK);
					if(!remready)
						infoT.append(">等待对方开始游戏!\n");
					else{
						infoT.append(">游戏开始!\n");
						start();
					}
					ready=true;
				}
			}
			else{
				synchronized(lockready){
					client.dataout("start,");
					if(remready){
						infoT.append(">游戏开始!\n");
						start();
					}
					else
						infoT.append(">等待对方开始游戏!\n");
					ready=true;
				}
			}
			startB.setEnabled(false);
		}
		else if(e.getSource()==redoB){
			isRedoSender=true;
			askRedoDialog arD=new askRedoDialog(f,askRedoDialog.request);
			arD.show();
			if(arD.yes==true){
				disable(false);
				if(isServer)
					server.dataout("redo,");

⌨️ 快捷键说明

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