📄 j_fir_board.java
字号:
//棋盘类
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.Polygon;
import java.awt.Rectangle;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JOptionPane;
public class J_FIR_Board extends JPanel
{
public static int LINE_NUM = 15;
public static int CHESSMAN_SIZE = 28;
public static int STAR_SIZE = 5;
public static int LINE_DIST = 30;
public static int[][] DIRECTION = {{0,-1},{-1,-1},{-1,0},{-1,1}};
protected static int ORI_X = 10;
protected static int ORI_Y = 10;
private int[] x = new int[LINE_NUM*LINE_NUM];
private int[] y = new int[LINE_NUM*LINE_NUM];
int[][] Board= new int[LINE_NUM][LINE_NUM];
private int n = -1;
public boolean updateCompleted = true;
private boolean SingleMode = false;
private int winner = 0;
public J_FIR_Board() //构造函数
{
addMouseListener(new MouseListener()
{
public int Num_to_Pix(int Num,int d)
{
if (d==1) return ORI_X+LINE_DIST/2+Num*LINE_DIST;
else return ORI_Y+LINE_DIST/2+Num*LINE_DIST;
}
public int Pix_to_Num(int Pix,int d)
{
int temp;
if (d==1) {
temp = (Pix-ORI_X-LINE_DIST/2)/LINE_DIST;
if (Num_to_Pix(temp+1,d)-Pix<Pix-Num_to_Pix(temp,d)) temp++;
} else {
temp = (Pix-ORI_Y-LINE_DIST/2)/LINE_DIST;
if (Num_to_Pix(temp+1,d)-Pix<Pix-Num_to_Pix(temp,d)) temp++;
}
return temp;
}
public void mouseClicked(MouseEvent e)
{
updateCompleted = false;
n++;
x[n] = Pix_to_Num(e.getX(),1);
y[n] = Pix_to_Num(e.getY(),2);
if (x[n]<0 || y[n]<0 || x[n]>=LINE_NUM || y[n]>=LINE_NUM) {
System.out.println("Out of chessboard!\n");
} else {
boolean ok = true;
for (int i=n-1;i>=0;i--) if (x[i]==x[n] && y[i]==y[n]) { ok = false; break; }
if (!ok) n--;
}
repaint();
checkStatus();
updateCompleted = true;
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
}
);
addMouseMotionListener(new MouseMotionListener()
{
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
}
}
);
}
public int getCurrentN()
{
return n;
}
public int getCurrentX(int k)
{
return x[k];
}
public int getCurrentY(int k)
{
return y[k];
}
//以上3个函数供J_FIR_Client调用
public void MyDrawCircle(Graphics2D g,int x,int y,int r) //画棋子或星位
{
g.fill(new Ellipse2D.Double(LINE_DIST/2+x*LINE_DIST-r/2.0,LINE_DIST/2+y*LINE_DIST-r/2.0,r,r));
}
public void updateBoard(int u[],int v[],int n1) //接收J_FIR_Client的数据
{
updateCompleted = false;
int i;
n = n1;
for (i=0;i<=n;i++) x[i] = u[i];
for (i=0;i<=n;i++) y[i] = v[i];
repaint();
checkStatus();
updateCompleted = true;
}
public void setSingle(boolean ModeSwitch) //设置单机/网络模式
{
SingleMode = ModeSwitch;
}
public void checkStatus() //判断胜负
{
int i,j,t,tempX,tempY;
int k = 0;
boolean win = false;
for (i=0;i<LINE_NUM;i++)
for (j=0;j<LINE_NUM;j++) Board[i][j] = 0;
for (i=0;i<=n;i++) {
Board[x[i]][y[i]] = i%2+1;
}
for (i=0;i<=n && !win;i++) {
k = i%2+1;
for (j=0;j<4;j++) {
t = 1;
tempX = x[i];
tempY = y[i];
do {
tempX += DIRECTION[j][0];
tempY += DIRECTION[j][1];
if (tempX<0 || tempY<0 || tempX>=LINE_NUM || tempY>=LINE_NUM) break;
if (Board[tempX][tempY]!=k) break;
t++;
} while (true);
if (t>=5) { win = true; break; }
}
}
if (win) {
winner = k;
if (SingleMode) {
if (k==1) JOptionPane.showMessageDialog(null,"黑棋获胜!"); else
if (k==2) JOptionPane.showMessageDialog(null,"白棋获胜!");
}
}
}
public boolean isWinner(int k) //判断胜者
{
if (k==winner) return true; else return false;
}
protected void paintComponent(Graphics gg)
{
Graphics2D g = (Graphics2D) gg;
int i;
//g.clearRect(0,0,getWidth(),getHeight());
Color c = g.getColor();
g.translate(ORI_X,ORI_Y);
g.setColor(new Color(230,230,30));
g.fill(new Rectangle(0,0,LINE_DIST*LINE_NUM,LINE_DIST*LINE_NUM));
g.setColor(Color.black);
for (i=0;i<LINE_NUM;i++) g.drawLine(LINE_DIST/2+i*LINE_DIST,
LINE_DIST/2,
LINE_DIST/2+i*LINE_DIST,
LINE_DIST*LINE_NUM-LINE_DIST/2 );
for (i=0;i<LINE_NUM;i++) g.drawLine(LINE_DIST/2,
LINE_DIST/2+i*LINE_DIST,
LINE_DIST*LINE_NUM-LINE_DIST/2,
LINE_DIST/2+i*LINE_DIST );
//画棋盘
MyDrawCircle(g,3,3,STAR_SIZE);
MyDrawCircle(g,3,LINE_NUM-4,STAR_SIZE);
MyDrawCircle(g,LINE_NUM-4,3,STAR_SIZE);
MyDrawCircle(g,LINE_NUM-4,LINE_NUM-4,STAR_SIZE);
//以上画星位
if (LINE_NUM%2==1) MyDrawCircle(g,(LINE_NUM-1)/2,(LINE_NUM-1)/2,STAR_SIZE);
for (i=0; i<=n;i++)
{
if (i%2==0) g.setColor(Color.black); else g.setColor(new Color(245,245,245));
MyDrawCircle(g,x[i],y[i],CHESSMAN_SIZE);
}
if (n>=0) {
g.setColor(Color.red);
int LastCenterX = LINE_DIST/2+x[n]*LINE_DIST;
int LastCenterY = LINE_DIST/2+y[n]*LINE_DIST;
int[] LastStepSignX = { LastCenterX,LastCenterX,LastCenterX-CHESSMAN_SIZE/2};
int[] LastStepSignY = { LastCenterY,LastCenterY-CHESSMAN_SIZE/2,LastCenterY};
g.fill(new Polygon(LastStepSignX,LastStepSignY,3));
//最新的一着棋标以红色三角形
}
g.setColor(c);
System.out.println("n="+n); //调试时用
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -