import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
public class Gobang {
private Frame frame=new Frame("五子棋游戏");
//声明四个BufferedImage对象,分别记录四张照片
BufferedImage table;
BufferedImage black;
BufferedImage white;
BufferedImage selected;
//声明棋盘的宽和高
final int TABLE_WIDTH=535;
final int TABLE_HEIGHT=536;
//声明棋盘横向和纵向分别可以下多少子,她们的值都为15
final int BOARD_SIZE=15;
//声明每个棋子占用棋盘的比率
final int RATE=TABLE_WIDTH/BOARD_SIZE;
//声明变量,记录棋子对于x方向和y方向的偏移量
final int X_OFFSET=5;
final int Y_OFFSET=6;
//声明一个二维数组,记录棋子,0代表没有棋子,1代表白棋,2代表黑棋
int[][] board=new int[BOARD_SIZE][BOARD_SIZE];
//声明红色选择框的坐标,该坐标其实就是二维数组board中的索引
int select_X=-1;
int select_Y=-1;
//自定义类,继承Canvas
private class ChessBoard extends Canvas{
@Override
public void paint(Graphics g){
//todo 绘图
//绘制棋盘
g.drawImage(table,0,0,null);
//绘制选择框
if(select_X>0 && select_Y>0) {
g.drawImage(selected, select_X *RATE + X_OFFSET, select_Y * RATE + Y_OFFSET, null);
}
//绘制棋子
for(int i=0;i<BOARD_SIZE;i++){
for(int j=0;j<BOARD_SIZE;j++){
//绘制黑棋
if(board[i][j]==2){
g.drawImage(black,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);
}
//绘制白棋
if(board[i][j]==1){
g.drawImage(white,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);
}
}
}
}
}
ChessBoard chessBoard=new ChessBoard();
//声明变量,记录当前下棋的颜色
int board_type=2; //默认黑棋
//底部需要用到的组件
Panel p=new Panel();
Button whiteBtn=new Button("白棋");
Button blackBtn=new Button("黑棋");
Button deleteBtn=new Button("删除");
public void refreshColor(Color whiteBtnColor,Color blackBtnColor,Color delateBtnColor){
whiteBtn.setBackground(whiteBtnColor);
blackBtn.setBackground(blackBtnColor);
deleteBtn.setBackground(delateBtnColor);
}
public void init() throws Exception{
//组装视图,编写逻辑
whiteBtn.addActionListener(e->
{
//修改当前要下的棋子的标志为1
board_type=1;
//刷新按钮的颜色——因为按下按钮,按钮会变色
//因为每次都要刷新,所以封装为一个方法
refreshColor(Color.GREEN,Color.GRAY,Color.GRAY);
});
blackBtn.addActionListener(e->
{
//修改当前要下的棋子的标志为2
board_type=2;
//刷新按钮的颜色——因为按下按钮,按钮会变色
//因为每次都要刷新,所以封装为一个方法
refreshColor(Color.GRAY,Color.GREEN,Color.GRAY);
});
deleteBtn.addActionListener(e->
{
//修改当前要下的棋子的标志为0
board_type=0;
//刷新按钮的颜色——因为按下按钮,按钮会变色
//因为每次都要刷新,所以封装为一个方法
refreshColor(Color.GRAY,Color.GRAY,Color.GREEN);
});
p.add(whiteBtn);
p.add(blackBtn);
p.add(deleteBtn);
frame.add(p,BorderLayout.SOUTH);
//组装棋盘
//对图片进行初始化
table= ImageIO.read(new File("...."));
white= ImageIO.read(new File("...."));
black= ImageIO.read(new File("...."));
selected= ImageIO.read(new File("...."));
chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
frame.add(chessBoard);
//当我们鼠标移动时,红色选择框要随着一起移动
chessBoard.addMouseMotionListener(new MouseMotionAdapter() {
//当鼠标移动时会调用该方法
@Override
public void mouseMoved(MouseEvent e) {
//接着将获取的位置转换成棋盘中正确的索引坐标
select_X=(e.getX()-X_OFFSET)/RATE;
select_Y=(e.getX()-X_OFFSET)/RATE;;
chessBoard.repaint();
}
});
//当鼠标单击的时候,要绘制一枚棋子
chessBoard.addMouseListener(new MouseAdapter() {
//当鼠标点击后,会调用这个方法
@Override
public void mouseClicked(MouseEvent e) {
int xPos = (e.getX() - X_OFFSET) / RATE;
int yPos = (e.getX() - X_OFFSET) / RATE;
board[xPos][yPos]=board_type;
chessBoard.repaint();
}
//当我们的鼠标移除界面的时候,取消显示选择框
@Override
public void mouseExited(MouseEvent e) {
select_X=-1;
select_Y=-1;
chessBoard.repaint();
}
});
//设置最佳大小并可以见
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) throws Exception {
new Gobang().init();
}
}
效果图: