import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class test07 {
private Frame frame = new Frame();
private BufferedImage table;
private BufferedImage black;
private BufferedImage white;
private BufferedImage selected;
private int X_SET = 0;
private int Y_SET = 0;
private final int TABLE_WIDTH = 535;
private final int TABLE_HEIGHT = 536;
private final int BOARD_SIZE = 15;
private final int RATE = TABLE_WIDTH / BOARD_SIZE;
//x,y方向的偏移量
private final int X_OFFSET = 3;
private final int Y_OFFSET = 3;
//游戏结束/重新开始的弹出框
private Dialog dialog = new Dialog(frame, "游戏结束", true);
//提示内容
private Label label;
int[][] board = new int[BOARD_SIZE + 2][BOARD_SIZE + 2];
//红色选择框坐标
int seleted_X = -1;
int seleted_Y = -1;
private class MyCanvas extends JPanel {
@Override
public void paint(Graphics g) {
g.drawImage(table, 0, 0, null);
if (seleted_X >= 0 && seleted_Y >= 0 && seleted_X < 15 && seleted_Y < 15) {
g.drawImage(selected, seleted_X * RATE + X_OFFSET, seleted_Y * RATE + Y_OFFSET, null);
}
for (int i = 1; i < BOARD_SIZE + 1; i++) {
for (int j = 1; j < BOARD_SIZE + 1; j++) {
if (board[i][j] == -1) {
g.drawImage(black, X_OFFSET + RATE * (i - 1), Y_OFFSET + RATE * (j - 1), null);
}
if (board[i][j] == 1) {
g.drawImage(white, X_OFFSET + RATE * (i - 1), Y_OFFSET + RATE * (j - 1), null);
}
}
}
}
}
private MyCanvas drawArea = new MyCanvas();
//申明变量,记录当前下棋颜色
int board_type = -1;
Panel p = new Panel();
Panel p2 = new Panel();
Button whiteBtn = new Button("白棋");
Button blackBtn = new Button("黑棋");
Button deleteBtn = new Button("悔棋");
Button goonBtn = new Button("继续");
Button overBtn = new Button("退出");
public void refreshBtnColor(Color whiteBtnColor, Color blackBtnColor, Color deleteBtnColor) {
whiteBtn.setBackground(whiteBtnColor);
blackBtn.setBackground(blackBtnColor);
deleteBtn.setBackground(deleteBtnColor);
}
public void init() throws IOException {
dialog.setBounds(620, 270, 300, 200);
deleteBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
board[X_SET][Y_SET] = 0;
refreshBtnColor(Color.RED, Color.RED, Color.GREEN);
drawArea.repaint();
board_type = -board_type;
}
});
frame.add(p, BorderLayout.SOUTH);
table = ImageIO.read(new File("E:\\Defender\\Desktop\\javase练习\\javaseAWT\\img\\board.jpg"));
black = ImageIO.read(new File("E:\\Defender\\Desktop\\javase练习\\javaseAWT\\img\\black.gif"));
white = ImageIO.read(new File("E:\\Defender\\Desktop\\javase练习\\javaseAWT\\img\\white.gif"));
selected = ImageIO.read(new File("E:\\Defender\\Desktop\\javase练习\\javaseAWT\\img\\selected.gif"));
drawArea.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
seleted_X = (e.getX() - X_OFFSET) / RATE;
seleted_Y = (e.getY() - Y_OFFSET) / RATE;
//System.out.println(seleted_X+" "+seleted_Y);
drawArea.repaint();
}
});
drawArea.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int xPos = (e.getX() - X_OFFSET) / RATE + 1;
int yPos = (e.getY() - Y_OFFSET) / RATE + 1;
System.out.println(xPos + " " + yPos);
//没有棋子才可以添加
if (board[xPos][yPos] == 0) {
board[xPos][yPos] = board_type;
if (board_type == 1) {
refreshBtnColor(Color.RED, Color.GREEN, Color.GRAY);
} else if (board_type == -1) {
refreshBtnColor(Color.GREEN, Color.RED, Color.GRAY);
}
board_type = -board_type;
X_SET = xPos;
Y_SET = yPos;
}
drawArea.repaint();
if (judge() == 1) {
label = new Label("白棋胜利");
label.setFont(new Font("宋体", Font.BOLD, 60));
label.setAlignment(Label.CENTER);
dialog.add(label);
dialog.setVisible(true);
System.out.println("白棋胜利");
} else if (judge() == -1) {
label = new Label("黑棋胜利");
label.setFont(new Font("宋体", Font.BOLD, 60));
label.setAlignment(Label.CENTER);
dialog.add(label);
dialog.setVisible(true);
System.out.println("黑棋胜利");
}
}
@Override
public void mouseExited(MouseEvent e) {
seleted_X = -1;
seleted_Y = -1;
drawArea.repaint();
}
});
drawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));
frame.add(drawArea);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.dispose();
}
});
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dialog.dispose();
}
});
overBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
goonBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
dialog = new Dialog(frame, "游戏结束", true);
dialog.setBounds(600, 150, 300, 200);
p2.add(goonBtn);
p2.add(overBtn);
dialog.add(p2, BorderLayout.SOUTH);
Arrays.setAll(board, i -> new int[BOARD_SIZE + 2]);
}
});
p2.add(goonBtn);
p2.add(overBtn);
dialog.add(p2, BorderLayout.SOUTH);
p.add(whiteBtn);
p.add(blackBtn);
p.add(deleteBtn);
frame.setLocation(500, 100);
frame.pack();
frame.setVisible(true);
}
private int judge() {
int[][] coor1 = new int[BOARD_SIZE + 2][BOARD_SIZE + 2];
int[][] coor2 = new int[BOARD_SIZE + 2][BOARD_SIZE + 2];
int[][] coor3 = new int[BOARD_SIZE + 2][BOARD_SIZE + 2];
int[][] coor4 = new int[BOARD_SIZE + 2][BOARD_SIZE + 2];
for (int x = 1; x < BOARD_SIZE + 1; x++) {
for (int y = 1; y < BOARD_SIZE + 1; y++) {
//纵向扫描
if (board[x][y] * board[x][y - 1] > 0) {
coor1[x][y] = coor1[x][y - 1] + board[x][y];
}
//横向扫描
if (board[x][y] * board[x - 1][y] > 0) {
coor2[x][y] = coor2[x - 1][y] + board[x][y];
System.out.println(coor2[x][y]);
}
//右斜向扫描
if (board[x][y] * board[x - 1][y - 1] > 0) {
coor3[x][y] = coor3[x - 1][y - 1] + board[x][y];
}
//左斜向扫描
if (board[x][y] * board[x - 1][y + 1] > 0) {
coor4[x][y] = coor4[x - 1][y + 1] + board[x][y];
}
if (coor1[x][y] == 4 || coor2[x][y] == 4 || coor3[x][y] == 4 || coor4[x][y] == 4)
return 1;
if (coor1[x][y] == -4 || coor2[x][y] == -4 || coor3[x][y] == -4 || coor4[x][y] == -4)
return -1;
}
}
return 0;
}
public static void main(String[] args) throws IOException {
new test07().init();
}
}
图片素材自己画,网上找都可。该程序由本人改编自黑马的五子棋