五子棋游戏(1)

文章介绍了如何使用JAVA编程实现五子棋游戏,包括窗体设计、棋盘绘制、鼠标监听器来处理棋子的放置,以及判断输赢的逻辑。通过创建GUI,设置鼠标事件监听棋子的落点,并利用二维数组存储棋盘状态,实现了棋子的重绘和游戏的进行。此外,还添加了开始和结束按钮,以及判断棋子超出范围或已有棋子的功能。

五子棋游戏作为从古至今脍炙人口的小游戏,风靡全国。今天我们用JAVA来实现五子棋。

首先是窗体的设计,经典的标题、尺寸等等,以及最重要的可视化。其中,我们采用继承类的方式来操作。

public class GoBangUI extends JFrame {
 public void initUI(){
        setTitle("五子棋");
        setSize(900,900);
        setDefaultCloseOperation(3);
        setLayout(null);
        setVisible(true);

在基本的窗体构建完成后,我们开始进行绘图。因为在棋盘绘制完成后,拉动窗体或改变窗体大小都会使窗体更新致使绘制好的棋盘和棋子消失,所以我们要对棋盘和棋子进行重绘操作。首先是棋盘,设置背景颜色、获得宽高之后,设置起始坐标点,尺寸和格数。其中采取一个循环来实现棋盘的绘制。

public void paint(Graphics g){
        g.setColor(new Color(182, 155, 13));
        g.fillRect(0,0,getWidth(),getHeight());
        int X=50,Y=75,SIZE=35,ROW=19;
        g.setColor(Color.BLACK);
        for (int i = 0; i < ROW+1; i++) {
            g.drawLine(X,Y+i*SIZE,X+ROW*SIZE,Y+i*SIZE);
            g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+ROW*SIZE);
        }
}

这时就需要开始下棋,由于是使用鼠标操作,便少不了鼠标监听器的加入,并且要加入画笔。

public class GoBangListener implements MouseListener{
    Graphics g;

并且引入鼠标监听器下的所有方法

public interface MouseListener extends EventListener {

    public void mouseClicked(MouseEvent e);

    
    public void mousePressed(MouseEvent e);

    
    public void mouseReleased(MouseEvent e);

    
    public void mouseEntered(MouseEvent e);

    
    public void mouseExited(MouseEvent e);
}

那么现在为了确定棋子的位置,我们需要在鼠标点下时获取一组坐标,为了保证棋子准确地落在交叉点上,就需要对坐标进行处理,之后再在处理后的坐标处画圆。

public void mousePressed(MouseEvent e){
        int x=e.getX();
        int y=e.getY();

        int r=(y-75+35/2)/35;
        int c=(x-50+35/2)/35;
        int cx=(c*35)+50-35/2;
        int cy=(r*35)+75-35/2;

        g.fillOval(cx,cy,35,35);

为了实现黑白棋子的交替,我们需要用1和2来代替黑子和白子,这时就需要引入一个变量chessFlag,并且加入一个判断。

int chessFlag=1;

 if (chessFlag==1){
            g.setColor(Color.BLACK);
            chessFlag=2;
        }else if (chessFlag==2){
            g.setColor(Color.WHITE);
            chessFlag=1;
        }

此时我们就得到了一些棋子,为了保证在窗体发生更新时棋子依然存在,我们就需要对棋子进行重绘。这个时候我们需要记录棋子的坐标,就需要用到二维数组了。首先引入新的数组,之后将chessFlag中的数据导入。

    int[][] chessArr= new int[20][20];


    chessArr[r][c] =chessFlag;

这时我们的数组中就有了棋子的数据,如果想在界面中显示出来,则需要将数组中的数据转移到另一个类里。并且在这个类中加入鼠标监听器。

        addMouseListener(gl);
        gl.g=getGraphics();




        for (int i = 0; i < gl.chessArr.length; i++) {
            for (int j = 0; j < gl.chessArr.length; j++) {
                int chessNum=gl.chessArr[i][j];
                if (chessNum!=0){
                    if (chessNum==1){
                        g.setColor(Color.BLACK);
                    }else {
                        g.setColor(Color.WHITE);
                    }
                    int cx=(j*35)+50-35/2;
                    int cy=(i*35)+75-35/2;
                    g.fillOval(cx,cy,35,35);
                }
            }
        }

这时我们就实现了棋子的重绘。为了实现五子棋功能的多样化,我们可以在界面中加入按钮,并且设置它的大小和位置。

String[]btnstrs={"开始","悔棋","人人","人机"};
        for (int i = 0; i < btnstrs.length; i++) {
            JButton btn=new JButton(btnstrs[i]);
            btn.setBounds(730,75+i*40,90,35);
            btn.setBackground(Color.WHITE);
            add(btn);

为了使按钮可以被使用,就要加入动作监听器

public class GoBangListener implements MouseListener, ActionListener {
  public void actionPerformed(ActionEvent e){
        String action=e.getActionCommand();
        JButton btn=(JButton) e.getSource();
        if (action.equals("开始")){
            chessFlag=1;
            btn.setText("结束");
        }else if (action.equals("结束")){
            chessFlag=0;
            btn.setText("开始");
        }
    }

这时开始按钮就可以被点击。为了使开始有意义,则需要使在点击开始之前不可下棋,那么之前的chessFlag就要赋值为0,并且弹窗提示。


    if (chessFlag==0){
            JOptionPane.showMessageDialog(null,"请先开始游戏!");
            return;

并且这样的方式还可以用于实现提醒点出范围、此处有棋子

 if (r>19||c>19){
            JOptionPane.showMessageDialog(null,"此处不能下棋!");
            return;
        }
        if (chessArr[r][c]!=0){
            JOptionPane.showMessageDialog(null,"此处已有棋子");
            return;
        }

加入动作监听器后,就需要在界面中同样引入,同样为了防止按钮消失对其进行重绘操作

    JButton[] btns=new JButton[4];
    btn.addActionListener(gl);
            btns[i]=btn;
    for (int i = 0; i < 4; i++) {
            btns[i].repaint();
        }

这时就需要判断输赢,首先写出在获胜时的提示

if (isWin(c,r)){
            if (chessArr[r][c]==1){
                System.out.println("黑棋赢!");
                JOptionPane.showMessageDialog(null,"黑棋赢!");
            }
            if (chessArr[r][c]==2){
                System.out.println("白棋赢!");
                JOptionPane.showMessageDialog(null,"白棋赢!");
            }
        }

之后就是判断相连棋子是否同色

 public boolean isWin(int c,int r){
        int count1=0,count2=0,count3=0,count4=0;
        for (int i = c; i <chessArr.length ; i++) {
            if (chessArr[r][c]==chessArr[r][i]){
                count1++;
            }else {
                break;
            }
        }
        for (int i = c-1; i >=0 ; i--) {
            if (chessArr[r][c]==chessArr[r][i]){
                count1++;
            }else {
                break;
            }
        }

        for (int j=r; j<chessArr.length;j++){
            if (chessArr[r][c]==chessArr[j][c]){
                count2++;
            }else {
                break;
            }
        }
        for (int j=r-1; j>=0;j--){
            if (chessArr[r][c]==chessArr[j][c]){
                count2++;
            }else {
                break;
            }
        }
        for (int i=c+1,j=r-1;i<chessArr.length&&j>=0;i++,j--){
            if (chessArr[r][c]==chessArr[j][i]){
                count3++;
            }else {
                break;
            }
        }
        for (int i=c,j=r;i>=0&&j<chessArr.length;i--,j++){
            if (chessArr[r][c]==chessArr[j][i]){
                count3++;
            }else {
                break;
            }
        }
        for (int i=c+1,j=r+1;i<chessArr.length&&j<chessArr.length;i++,j++){
            if (chessArr[r][c]==chessArr[j][i]){
                count4++;
            }else {
                break;
            }
        }
        for (int i=c,j=r;i>=0&&j>=0;i--,j--){
            if (chessArr[r][c]==chessArr[j][i]){
                count4++;
            }else {
                break;
            }
        }
        if (count1>=5||count2>=5||count3>=5||count4>=5){
            return true;
        }
        return false;
    }

这时我们就实现了五子棋最基本的玩法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值