java实现五子棋 需要添加开始和悔棋退出功能qq

package chess;

import javax.swing.;
import java.awt.
;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL;

public class MainWin {
public static void main(String[] args) {
new FiveWindow();
}
}
class FiveWindow extends JFrame{
FiveWindow(){
JPanel right=new JPanel();
right.setBackground(Color.lightGray);
right.setPreferredSize(new Dimension(100,0));//BorderLayout需设置大小时,需使用setPreferredSize
add(right, BorderLayout.EAST);
JButton btn[]=new JButton[3];
String btnTitle[]={"开始","悔棋","退出"};
for (int i = 0; i < 3; i++) {
btn[i]=new JButton(btnTitle[i]);
btn[i].setPreferredSize(new Dimension(90,30));
right.add(btn[i]);
}
URL icopath=getClass().getResource("five.jpg");
ImageIcon ico=new ImageIcon(icopath);
setIconImage(ico.getImage());
setTitle("五子棋");
ChessBoard board=new ChessBoard();
add(board,BorderLayout.CENTER);
setBounds(0,0,560,480);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
validate();
}
}
class ChessBoard extends JPanel implements MouseListener {
Graphics g;
int chess[][] = new int[15][15];
boolean curStone;
Rule rule;
ChessBoard() {
Start();
rule=new Rule();
curStone=false;
addMouseListener(this);
}

public void paint(Graphics g) {
    super.paint(g);
    this.g = g;
    stone = new Stone(g);
    Draw();
}

public void Draw() {
    for (int i = 0; i < 15; i++) {
        g.drawLine(10, 10 + 30 * i, 10 + 14 * 30, 10 + 30 * i);
        g.drawLine(10 + 30 * i, 10, 10 + 30 * i, 10 + 14 * 30);
    }
    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15; j++) {
            if (chess[i][j] == 0) {
                stone.Draw(i, j, ChessType.Black);
            }
            if (chess[i][j] == 1) {
                stone.Draw(i, j, ChessType.White);
            }
        }
    }
}
    public void Start(){
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                chess[i][j] = 2;
            }
        }
    }
public void DownStone(int x,int y){
    if(x<440&&y<440) {
        int m = (x + 5) / 30;
        int n = (y + 5) / 30;
        if (curStone) {
            System.out.println(m+","+n);
            stone.Draw(m, n, ChessType.White);
            chess[m][n]=1;
        } else {
            stone.Draw(m, n, ChessType.Black);
            chess[m][n]=0;
        }
        this.repaint();
        if(rule.Result(m,n,chess)){
            if(curStone){
                JOptionPane.showMessageDialog(null,"白子胜","对战结束",JOptionPane.PLAIN_MESSAGE);
            }else{
                JOptionPane.showMessageDialog(null,"黑子胜","对战结束",JOptionPane.PLAIN_MESSAGE);
            }
            Start();
        }
        curStone = !curStone;
        this.repaint();
    }
}
@Override
public void mouseClicked(MouseEvent e) {
    System.out.println(e.getX());
    DownStone(e.getX(),e.getY());
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}

}
enum ChessType {Black, White}
class Stone {
Graphics g;
Stone(Graphics g) {
this.g = g;
}
public void Draw(int m, int n, ChessType chessType) {
if (chessType == ChessType.Black) {
g.setColor(Color.BLACK);
} else {
g.setColor(Color.WHITE);
}
g.fillOval(10 + m * 30 - 8, 10 + n * 30 - 8, 16, 16);
}
}
class Rule {
public boolean Result(int m, int n, int chess[][]) {
int r[] = new int[4];
r[0] = CheckX(m, n, chess);
r[1] = CheckY(m, n, chess);
r[2] = CheckXY(m, n, chess);
r[3] = CheckYX(m, n, chess);
for (int i = 0; i < 4; i++) {
if(r[i]>=5){
return true;
}
}
return false;
}
public int CheckX(int m,int n,int chess[][]){
int num=1;
int i=n+1;
while(i<15){
if(chess[m][i]==chess[m][n]){
num++;
i++;
}else{
break;
}
}
i=n-1;
while (i>=0){
if(chess[m][i]==chess[m][n]){
num++;
i--;
}else{
break;
}
}return num;
}
public int CheckY(int m,int n,int chess[][]){
return 0;
}
public int CheckXY(int m,int n,int chess[][]){
return 0;
}
public int CheckYX(int m,int n,int chess[][]){
return 0;
}
}

用redis保存每一手的坐标。悔棋把数组最后一个坐标删除就好了,然后重绘棋盘