码迷,mamicode.com
首页 > 其他好文 > 详细

数独设计(2)

时间:2015-09-23 21:12:34      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

今天确定了思路,大致为以下结构:

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

 

数独设计(2)

标签:

原文地址:http://www.cnblogs.com/kasion/p/4833334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!