五子棋2.0

相比五子棋1.0增加开始游戏才可落子,结束对局自动清空棋盘和判断输赢的功能。

一、开始游戏才可落子,结束对局自动清空棋盘功能

在原来的GameListener中的动作监听器部分增加该功能。

public void actionPerformed(ActionEvent e) {
        String ac = e.getActionCommand();
        if (ac.equals("登录")) {
            String name = nameIn.getText();
            String pwd = pwdIn.getText();
            if (name.equals("wky") && pwd.equals("123")){
                gameUI.showgameUI();
                gameUI.hideloginUI();
            }
        } else if (ac.equals("退出")) {
            gameUI.hidegameUI();
            gameUI.showloginUI();
        } 
//实现点击开始游戏后才可以落子和自动消除上局棋子功能。
else if (ac.equals("开始游戏")) {
            //如果按下开始游戏,默认先下的时黑棋
            chessstatus = 1;
            
            //获取按下的按钮,将其文本内容改为“结束对局”,背景色改为粉色
            JButton btn = (JButton)e.getSource();
            btn.setText("结束对局");
            btn.setBackground(Color.pink);
            
            //将棋盘中每个位置的状态归为0
            chess = new int[16][16];
            

            //重绘棋盘,达到自动消除上局棋子的功能。
            g.setColor(new Color(18, 253, 0, 255));
            g.fillRect(X - SIZE/2 , Y - SIZE/2 ,(COL+1) * SIZE,(ROW + 1) * SIZE);
            g.setColor(new Color(0xFF070707, true));
            for (int i = 0; i <= COL; i++) {
                g.drawLine(X,Y + i * SIZE,X +COL * SIZE,Y + i * SIZE);
                g.drawLine(X + i * SIZE,Y,X + i * SIZE,Y + ROW * SIZE);
            }
        } 
//实现点击结束对局后不可落子的功能。
else if (ac.equals("结束对局")) {
            //如果按下结束对局,将棋子状态归为0,后续不可下棋
            chessstatus = 0;
            
            //获取按下的按钮,将其文本内容改为“开始游戏”,背景色改为天蓝色
            JButton btn = (JButton)e.getSource();
            btn.setText("开始游戏");
            btn.setBackground(Color.cyan);


        }
    }

二、判断输赢

1、定义ToWin类

用于判断是否由五个相同颜色的棋子在相邻的直线上。

package gobangv2;


public class ToWin {
    public boolean isWin(int[][] chessArray,int r,int c){
        if (col(chessArray,r,c) >= 5 || row(chessArray,r,c) >= 5 || oblique(chessArray,r,c) >= 5){
            return true;
        }
        return false;
    }
}

2、分类进行判断输赢

注意:每次落子都要判断一次是否有一方输赢。所以需要在画出棋子的下一步就进行一次判断。因此,需要在GameListener中的画出棋子部分加上以下代码。

if (toWin.isWin(chess,r,c)){
            JOptionPane.showMessageDialog(null,chessstatus == 1?"白棋胜利":"黑棋胜利");
            //将棋子状态归为0,使得后续不能再下棋。
            chessstatus =0;
        }

(1)横向遍历

//横向遍历
    public int col(int[][] chessArray,int r,int c){
        int count = 1;
        //向右找
        for (int i = c+1; i <16 ; i++) {
            if (chessArray[r][c] == chessArray[r][i]){
                count++;
            } else {
                break;
            }
        }
        //向左找
        for (int i = c-1; i >= 0 ; i--) {
            if (chessArray[r][c] == chessArray[r][i]){
                count++;
            } else {
                break;
            }
        }
        return count;
    }

(2)纵向遍历

//纵向遍历
    public int row(int[][] chessArray,int r,int c){
        int count = 1;
        //向下找
        for (int i = r+1; i < 16 ; i++) {
            if (chessArray[r][c] == chessArray[i][c]){
                count++;
            } else {
                break;
            }
        }
        //向上找
        for (int i = r-1; i >= 0 ; i--) {
            if (chessArray[r][c] == chessArray[i][c]){
                count++;
            } else {
                break;
            }
        }

        return count;
    }

(3)斜向遍历

//斜向判断
    public int oblique(int[][] chessArray,int r,int c){
        int count = 1;
        //左斜向上线
        int i = r-1;
        int j = c-1;
        while(i >= 0 && j >= 0) {
            if (chessArray[r][c] == chessArray[i][j]) {
                count++;
                i--;
                j--;
            } else {
                break;
            }
        }
        //左斜向下线
        i = r+1;
        j = c+1;
        while (i < 16 && j < 16){
            if (chessArray[r][c] == chessArray[i][j]){
                count++;
                i++;
                j++;
            }else {
                break;
            }
        }

        //右斜向上线
        i = r-1;
        j = c+1;
        while (i >= 0 && j < 16){
            if (chessArray[r][c] == chessArray[i][j]){
                count++;
                i--;
                j++;
            }else{
                break;
            }
        }
        //右斜向下线
        i = r+1;
        j = c-1;
        while (i <16 && j>= 0){
            if (chessArray[r][c] == chessArray[i][j]){
                count++;
                i++;
                j--;
            }else {
                break;
            }
        }

        return count;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值