绘制五子棋小游戏【awt】

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();
    }
}

效果图:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值