填数字刷新九宫格
为数字按钮绑定监听器
学过事件监听的都知道,这个很简单,就给按钮设置一下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();
}
}
这里的代码也很简单,里面又调用了game
的setTileIfValid
方法。
更新备选数字数组
这里需要介绍一下,重绘的本质是重新调用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];
}
效果如下: