📄 chessboard.java
字号:
import java.io.*;
import java.awt.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.beans.*;
import javax.swing.*;
import java.util.zip.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;
public class ChessBoard extends JPanel implements MouseListener
{
public String imgFileName = null;
public Image whiteChessmanImg = null;
public Image blackChessmanImg = null;
public int step = 0;
public Graphics gs = null;
/*
** chessMap = 3 White
** chessMap = 7 Black
** chessMap = 0 Null
*/
public int[][] chessMap = new int[19][19];
public int[][] checkMap = new int[19][19];
public int lastChessX = -1;
public int lastChessY = -1;
public Vector takeVector = new Vector();
public boolean takeFlag = true;
public ChessBoard(String imgFileName)
{
this.imgFileName = imgFileName;
whiteChessmanImg = getImageOfFile("whitechess.gif");
blackChessmanImg = getImageOfFile("blackchess.gif");
addMouseListener(this);
for(int i = 0; i < 19; i ++)
for(int j = 0; j < 19; j ++)
{
chessMap[i][j] = 0;
checkMap[i][j] = 0;
}
}
public Image getImageOfFile(String fileName)
{
ImageIcon imgIcon = new ImageIcon(getClass().getResource(fileName));
return imgIcon.getImage();
}
public void paint(Graphics g)
{
gs = g;
g.drawImage(getImageOfFile(imgFileName), 0, 0, this);
drawChessBoardGrid(g);
for(int i = 0; i < 19; i ++)
for(int j = 0; j < 19; j ++)
if(chessMap[i][j] != 0)
drawChessman(i, j, chessMap[i][j]);
if((lastChessX >= 0 && lastChessX <= 19) &&
(lastChessY >= 0 && lastChessY <= 19))
markChessman(lastChessX, lastChessY);
}
public void update(Graphics g)
{
paint(g);
}
public void drawChessBoardGrid(Graphics g)
{
g.setColor(Color.black);
g.drawLine(30, 30, 588, 30);
g.drawLine(30, 30, 30, 588);
g.drawLine(588, 30, 588, 588);
g.drawLine(30, 588, 588, 588);
step = (590 - 30 - 2)/18;
int x = 30;
int y = 30;
for(int i = 1; i <= 17; i ++)
{
y += step;
g.drawLine(30, y, 588, y);
}
for(int i = 1; i <= 17; i ++)
{
x += step;
g.drawLine(x, 30, x, 588);
}
g.fillOval(30 + step*3 - 3, 30 + step*3 - 3, 7, 7);
g.fillOval(30 + step*15 - 3, 30 + step*3 - 3, 7, 7);
g.fillOval(30 + step*3 - 3, 30 + step*15 - 3, 7, 7);
g.fillOval(30 + step*15 - 3, 30 + step*15 - 3, 7, 7);
g.fillOval(30 + step*9 - 3, 30 + step*9 - 3, 7, 7);
}
public void setLastChessman(int x, int y)
{
lastChessX = x;
lastChessY = y;
}
public void markChessman(int x, int y)
{
gs.setColor(Color.red);
gs.fillOval(27 + step*x, 27 + step*y, 7, 7);
}
public void drawChessman(int x, int y, int chessColor)
{
switch(chessColor)
{
case 3:
gs.drawImage(whiteChessmanImg, 20 + step*x, 20 + step*y, this);
break;
case 7:
gs.drawImage(blackChessmanImg, 20 + step*x, 20 + step*y, this);
break;
}
}
public void takeChessman(int chessX, int chessY)
{ //提子
int thisChess = chessMap[chessX][chessY];
checkMap[chessX][chessY] = 1;
takeVector.add("" + chessX + "," + chessY);
//left:
int x = chessX - 1;
int y = chessY;
if(x >= 0 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
takeChessman(x, y);
else if(x >= 0 && chessMap[x][y] == 0)
{
takeFlag = false;
return;
}
//up:
x = chessX;
y = chessY - 1;
if(y >= 0 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
takeChessman(x, y);
else if(y >= 0 && chessMap[x][y] == 0)
{
takeFlag = false;
return;
}
//right:
x = chessX + 1;
y = chessY;
if(x < 19 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
takeChessman(x, y);
else if(x < 19 && chessMap[x][y] == 0)
{
takeFlag = false;
return;
}
//down:
x = chessX;
y = chessY + 1;
if(y < 19 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
takeChessman(x, y);
else if(y < 19 && chessMap[x][y] == 0)
{
takeFlag = false;
return;
}
}
public void takeByColor(int chessColor)
{
for(int i = 0; i < 19; i ++)
for(int j = 0; j < 19; j ++)
{
if(chessMap[i][j] == 0)
continue;
else if(chessMap[i][j] != chessColor)
continue;
takeFlag = true;
takeVector.clear();
for(int l = 0; l < 19; l ++)
for(int m = 0; m < 19; m ++)
checkMap[l][m] = 0;
takeChessman(i, j);
if(takeFlag == true)
{
String packet = new String("T");
for(int n = 0; n < takeVector.size(); n ++)
{
String[] chessMan = Go.tokenize((String)takeVector.get(n), ",");
int x = Integer.parseInt(chessMan[0]);
int y = Integer.parseInt(chessMan[1]);
chessMap[x][y] = 0;
if(n > 0) packet += ",";
packet += x;
packet += ",";
packet += y;
}
Go.out.println(packet);
}
}
repaint();
}
public void takeOneChessman(int i, int j)
{
takeFlag = true;
takeVector.clear();
for(int l = 0; l < 19; l ++)
for(int m = 0; m < 19; m ++)
checkMap[l][m] = 0;
takeChessman(i, j);
if(takeFlag == true)
{
String packet = new String("T");
for(int n = 0; n < takeVector.size(); n ++)
{
String[] chessMan = Go.tokenize((String)takeVector.get(n), ",");
int x = Integer.parseInt(chessMan[0]);
int y = Integer.parseInt(chessMan[1]);
chessMap[x][y] = 0;
if(n > 0) packet += ",";
packet += x;
packet += ",";
packet += y;
}
Go.out.println(packet);
}
repaint();
}
public void goTakeChessman(int chessX, int chessY)
{
if((chessX >= 0 && chessX <= 19) &&
(chessY >= 0 && chessY <= 19) &&
(chessMap[chessX][chessY] == 0) &&
(Go.goFlag == true))
{
chessMap[chessX][chessY] = Go.myChessColor;
Go.goFlag = false;
setLastChessman(chessX, chessY);
Go.out.println("O" + Go.myChessColor + "," + chessX + "," + chessY);
Go.sendMsg.setText("等待对方下棋 ...");
repaint();
if(Go.myChessColor == 3)
takeByColor(7);
else if(Go.myChessColor == 7)
takeByColor(3);
takeOneChessman(chessX, chessY);
}
}
public void mouseReleased(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
//System.out.println("x = " + x + " y = " + y);
int indexOfHor = (x - 30)/step;
int indexOfVer = (y - 30)/step;
if(((x - 30) % step) > 15)
indexOfHor ++;
if(((y - 30) % step) > 15)
indexOfVer ++;
//System.out.println("indexOfHor = " + indexOfHor + " indexOfVer = " + indexOfVer);
if(Go.chess == 1)
goTakeChessman(indexOfHor, indexOfVer);
if((Go.chess == 2) && (indexOfHor >= 0 && indexOfHor <= 19) &&
(indexOfVer >= 0 && indexOfVer <= 19) && (chessMap[indexOfHor][indexOfVer] == 0) &&
(Go.goFlag == true))
{
chessMap[indexOfHor][indexOfVer] = Go.myChessColor;
Go.goFlag = false;
setLastChessman(indexOfHor, indexOfVer);
Go.out.println("O" + Go.myChessColor + "," + indexOfHor + "," + indexOfVer);
repaint();
Go.sendMsg.setText("等待对方下棋 ...");
int who = 0;
if((who = whoWinGobang()) == 3)
{
Go.out.println("W3");
showMessage("白棋赢!!!");
}
if((who = whoWinGobang()) == 7)
{
Go.out.println("W7");
showMessage("黑棋赢!!!");
}
if(who == 3 || who == 7)
{
//Go.out.println("C");
for(int i = 0; i < 19; i ++)
for(int j = 0; j < 19; j ++)
chessMap[i][j] = 0;
setLastChessman(-1, -1);
repaint();
Go.sendMsg.setText("先手?");
Go.goFlag = true;
}
}
}
public void mousePressed(MouseEvent e) { }
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited (MouseEvent e) { }
public int showMessage(String msg)
{
String[] optionNames = { " 确 定 ", " 取 消 " };
Go.setDefaultFont(new Font("dialog.plain", Font.PLAIN, 12));
JPanel panel = new JPanel();
Hashtable sysCfg = null;
JLabel label = new JLabel(msg);
label.setIcon(new ImageIcon(getClass().getResource("msg.gif")));
panel.add(label);
return JOptionPane.showOptionDialog(Go.frame, panel,
"提示信息", JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE, null,
optionNames, optionNames[1]);
}
public int whoWinGobang()
{
for(int i = 0; i < 19; i ++)
for(int j = 0 ; j < 18; j ++)
{
int sum1 = sumslash(i, j, 0);
if(sum1 == 15) return 3; //: WHITE WIN
if(sum1 == 35) return 7; //: BLACK WIN
int sum2 = sumslash(i, j, 1);
if(sum2 == 15) return 3; //: WHITE WIN
if(sum2 == 35) return 7; //: BLACK WIN
int sum3 = sumslash(i, j, 2);
if(sum3 == 15) return 3; //: WHITE WIN
if(sum3 == 35) return 7; //: BLACK WIN
int sum4 = sumslash(i, j, 3);
if(sum4 == 15) return 3; //: WHITE WIN
if(sum4 == 35) return 7; //: BLACK WIN
}
return -1;
}
public int sumslash(int x, int y, int slashType)
{
int sum = 0;
int nx = x;
int ny = y;
for(int n = 0; n < 5; n ++)
{
if((nx >= 0) && (nx < 19) &&
(ny >= 0) && (ny < 18))
{
sum += chessMap[nx][ny];
switch(slashType)
{
case 0: //: /
nx ++; ny --;
break;
case 1: //: \
nx ++; ny ++;
break;
case 2: //: -
nx = nx; ny ++;
break;
case 3: //: |
nx ++; ny = ny;
break;
default:
break;
}
if((sum == 15) || (sum == 35))
return sum;
}
else break;
}
return sum;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -