Android开发——手把手写APP(四)——数独游戏编写(五)——填数字刷新九宫格

填数字刷新九宫格


为数字按钮绑定监听器

学过事件监听的都知道,这个很简单,就给按钮设置一下onClickListener即可。
其中有一个returnResult方法,为什么调用这个方法:我们的目的是按下数字按钮,就可以在画板显示那个数字,但是我们不在Dialog类里实现这个操作,Dialog类只写对对话框的操作,不进行其他的操作,这个显示的操作交给ShuduView来完成,起到低耦合的作用。
现在监听器绑定完成,按下按钮会调用ShuduView类中的setSelectedTile方法实现更新界面。

//遍历给按钮设置监听器
    private void setListeners() {
        for(int i = 0;i < keys.length;i++){
            final int t = i+1;
            keys[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    returnResult(t);
                }
            });
        }
    }
//通知shuduView对象刷新九宫格数据
    private void returnResult(int tile) {

        shuduView.setSelectedTile(tile);
        //取消对话框的显示
        dismiss();
    }

刷新九宫格

前面讲到setSelectedTile方法更新界面,那么我们来看一下这个方法里有什么

//设置用户所选的数字
    public void setSelectedTile(int tile) {
        if(game.setTileIfValid(selectedX,selectedY,tile)){
            //重绘整个画布
            invalidate();
        }
    }

这里的代码也很简单,里面又调用了gamesetTileIfValid方法。

更新备选数字数组

这里需要介绍一下,重绘的本质是重新调用onDraw方法,要想显示新加的数据,必须把新加的数据放入到sudoku数组中,进行onDraw重绘即可显示出来。
setTileIfValid这个方法里,判断玩家所选数字是否合法,如果合法则把该数字加入到sudoku数组中,并重新计算每个单元格的不可用数据,返回true,进行重绘。
下面代码重点是给数独数组添加数据,和进行单元格的重新计算不可用数据

    //检测玩家所选数字是否符合游戏规则
    protected boolean setTileIfValid(int x,int y,int value){

        //取出该单元格不可用数据
        int tiles[] = getUsedTiles(x,y);

        //检验玩家所选数据是否为不可用数据
        if(value != 0){
            for (int tile:tiles
                 ) {
                if(tile == value)
                    return false;
            }
        }
        //给数独数组增加数据
        setTile(x,y,value);
        //重新计算全部单元格不可用数据
        calculateAllUsedTiles();
        return true;
    }

    //获取该单元格不可用的数据
    protected int[] getUsedTiles(int x,int y){
        return used[x][y];
    }

效果如下:
在这里插入图片描述

发布了230 篇原创文章 · 获赞 250 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/weixin_42247720/article/details/103517827