文章出處

今天確定了思路,大致為以下結構:

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;
	}
}

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()