今天确定了思路,大致为以下结构:
1、在Game中定义数据,进行初始化格子的数据。
2、定义触摸事件。
在View类中,覆写onTouchEvent(MotionEvent event)方法。
3、继承Dialog类,自定义一个dialog。
4、做好了上述准备后,我们就可以再View类中,进行游戏的布置,和进行操作了。
5、在主类中调用MyView对象。
预计时间:5天,每天完成一个类的编码。
今天内容:
Game的类
public class Game
{
// 准备一个字符串数字
public final String STR = "360000000004230800000004200"
+ "070460003820000014500013020" + "001900000007048300000000045";
// 一个数组,存储某个单元格中不可用的数据
private int[] data = new int[9 * 9];
// 定义一个数组,用于存储所有单元格中,不可用的数据
int[][][] usedAll = new int[9][9][];
public Game()
{
data = getData(STR);
calculateAllUsedTiles();
}
// 获得每个单元格中的数字
private int getTitle(int x, int y)
{
return data[x + y * 9];
}
// 将单元格中的数字转换为字符串格式
public String getTitleString(int x, int y)
{
int v = getTitle(x, y);
if (v == 0)
{
return "";
} else
{
return String.valueOf(v);
}
}
// 定义方法,将字符串常量转换为数字存入数组中,游戏初始化数据
private int[] getData(String strData)
{
int[] sudo = new int[strData.length()];
for (int i = 0; i < sudo.length; i++)
{
sudo[i] = strData.charAt(i) - '0';
}
return sudo;
}
// 取出所有单元各种,不可用的数据
public void calculateAllUsedTiles()
{
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
{
usedAll[i][j] = calculateUsedTile(i, j);
}
}
// 取出某单元格中,不可用的数据
public int[] getUsedTile(int x, int y)
{
return usedAll[x][y];
}
// 计算某一单元格中不可用的数据
public int[] calculateUsedTile(int x, int y)
{
int[] c = new int[9];
// 计算该单元格纵向(列)不可用数据
for (int i = 0; i < 9; i++)
{
if (i == y)
continue;
int t = getTitle(x, i);
if (t != 0)
{
c[t - 1] = t;
}
}
// 计算该单元格横向(行)不可用数据
for (int i = 0; i < 9; i++)
{
if (i == x)
continue;
int t = getTitle(i, y);
if (t != 0)
c[t - 1] = t;
}
// 计算小九宫格中不可用的数据
int startx = (x / 3) * 3;
int starty = (y / 3) * 3;
for (int i = startx; i < startx + 3; i++)
for (int j = starty; j < starty + 3; j++)
{
if (i == x && j == y)
continue;
int t = getTitle(i, j);
if (t != 0)
c[t - 1] = t;
}
int numused = 0;
for (int t : c)
{
if (t != 0)
numused++;
}
int[] c1 = new int[numused];
numused = 0;
for (int t : c)
{
if (t != 0)
c1[numused++] = t;
}
return c1;
}
//接收KeyDialog中点击的数字
public boolean setTileIfValid(int x, int y, int value)
{
int[] tiles = getUsedTiles(x, y);//得到不可用的数据
for(int i = 0; i<tiles.length; i++)
Log.i("TAG", "tiles["+i+"]"+tiles[i]);
if (value != 0)
{
for (int t : tiles)
{
if (t == value)
return false;
}
}
setTile(x, y, value);//将对应的值value绘制在xy对应的格子中
calculateAllUsedTiles();//重新计算所有格子的不可用数据
return true;
}
public int[] getUsedTiles(int x, int y)
{
return usedAll[x][y];
}
public void setTile(int x, int y, int value)
{
data[y * 9 + x] = value;
}
}