java学习-五子棋(2)

上一篇博客我们已经将五子棋游戏的基本框架搭好了;但还有很多功能无法实现,如

1.五子棋黑白先手不能更改

2.无法根据已下的棋子来判断输赢

3.没有悔棋功能

......

本篇博客我们来解决1和2两个问题

黑白先手更改

1.实现功能

在窗体上添加两个单选框黑子先手/白子先手,点击选中后可以更改先手

在窗体类NewGo中添加单选框对象jrb_b和jrb_w,并添加到按钮组b1中,使两者只能选中一个

2.添加代码

        JRadioButton jrb_b=new JRadioButton("黑子先手");
        JRadioButton jrb_w=new JRadioButton("白子先手");
        jrb_b.setBounds(850,120,100,35);//位置设置
        jrb_w.setBounds(850,150,100,35);
        ButtonGroup b1=new ButtonGroup();
        b1.add(jrb_b);
        b1.add(jrb_w);
        add(jrb_b);
        add(jrb_w);

同步两个类中的jrb_b和jrb_w


        gol.jrb_b=jrb_b;
        gol.jrb_w=jrb_w;

改善Golistener中的actionPerformed

    public void actionPerformed(ActionEvent e){
        String btnText=e.getActionCommand();
        JButton btn=(JButton) e.getSource();
        if(btnText.equals("开始游戏")){
            if(jrb_b.isSelected()){//黑子先手被选中
                chessflag=1;
            } else if (jrb_w.isSelected()) {
                chessflag=2;
            }else{
                JOptionPane.showMessageDialog (null, "请设置先手", "提示", JOptionPane.ERROR_MESSAGE);
                return;
           }
            jrb_b.setEnabled(false);//不可选定
            jrb_w.setEnabled(false);
            btn.setText("结束游戏");
        } else if (btnText.equals("结束游戏")){
            chessArr=new int[ROWS+1][COLS+1];//重置记录
            jrb_b.setEnabled(true);//可以选定
            jrb_w.setEnabled(true);
            btn.setText("开始游戏");
            chessflag=0;
        }
    }

3.运行结果

 

 

 

 判断输赢

 实现功能

每下一子进行判断,若一方连成五子则输出那一方胜利,并结束游戏

分四步判断:水平、竖直、左上到右下、右上到左下

先创建一个类IsWin,分别计算四个方向所下子同色相邻个数,若有一个方向相邻同色棋子个数大于等于5,则判断那一方胜利

代码如下

public class IsWin {
    public static boolean isWin(int r, int c ,int[][]chessArr) {
        if(x(r, c, chessArr)>=5||y(r,c,chessArr)>=5||xy(r,c,chessArr)>=5||yx(r,c,chessArr)>=5){
            return(true);//一方胜利isWin为true
        }return(false);
    }

    //水平方向判断
    private static int x(int r,int c,int[][]chessArr){
        int count=1;
        //从下的这一点向右遍历
        for(int i=c+1;i<chessArr.length;i++){
            if(chessArr[r][i]==chessArr[r][c]){
                count+=1;
            }else{
                break;
            }
        }
        //向左遍历
        for(int i=c-1;i>=0;i--){
            if(chessArr[r][i]==chessArr[r][c]){
                count+=1;
            }else{
                break;
            }
        }
        return count;
    }

    //竖直方向判断
    private static int y(int r,int c,int[][]chessArr){
        int count=1;
        for(int i=r+1;i<chessArr.length;i++){
            if(chessArr[i][c]==chessArr[r][c]){
                count+=1;
            }else{
                break;
            }
        }for(int i=r-1;i>=0;i--){
            if(chessArr[i][c]==chessArr[r][c]){
                count+=1;
            }else{
                break;
            }
        }
        return count;
    }

    //左上到右下判断
    private static int xy(int r,int c,int[][]chessArr){
        int count=1;
        int j=c;//所下点的列
        for(int i=r+1;i<chessArr.length;i++){
            j+=1;
            if(j< chessArr.length&&chessArr[i][j]==chessArr[r][c]){
                count+=1;
            }else{
                j=c;
                break;
            }
        }for(int i=r-1;i>=0;i--){
            j-=1;
            if(j>=0&&chessArr[i][j]==chessArr[r][c]){
                count+=1;
            }else{
                break;
            }
        }
        return count;
    }

    //左下到右上判断
    private static int yx(int r,int c,int[][]chessArr){
        int count=1;
        int j=c;
        for(int i=r+1;i<chessArr.length;i++){
            j-=1;
            if(j>=0&&chessArr[i][j]==chessArr[r][c]){
                count+=1;
            }else{
                j=c;
                break;
            }
        }for(int i=r-1;i>=0;i--){
            j+=1;
            if(j< chessArr.length&&chessArr[i][j]==chessArr[r][c]){
                count+=1;
            }else{
                break;
            }
        }
        return count;
    }
}

这样判断的代码就完成了,接下来要实现的是在监听器GoListener中添加判断语句,实时监测结果,并在一方胜利时提示胜利方并将棋盘复原

在GoListener中mousePressed()末尾添加

        boolean isWin= IsWin.isWin(r,c,chessArr);
        if(isWin){
            //如果chessflag==1即下一个下棋的为黑,提示白棋胜利,否则黑棋胜利
            JOptionPane.showMessageDialog (null,chessflag==1?"白棋胜利":"黑棋胜利","提示",JOptionPane.ERROR_MESSAGE);
            chessflag=0;
            chessArr=new int[ROWS+1][COLS+1];
            return;
        }

运行结果

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.山高人为峰.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值