📄 blackandwhite.java
字号:
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 + -