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保存每一手的坐标。悔棋把数组最后一个坐标删除就好了,然后重绘棋盘