zoukankan      html  css  js  c++  java
  • 数独设计(2)

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

    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;
    	}
    }
    
  • 相关阅读:
    项目中的*签到*小功能!
    亲们,拿到DateTime.Now你是否也是这样比较的?
    <input type="file" />,美化自定义上传按钮
    让你的页面实现自定义的 Ajax Loading加载的体验!
    按回车键提交表单!
    字符串比较大小,CompareTo来搞定!
    巧用Contains可以做到过滤同类项!
    项目开发中遇到的Bug知识整理!
    SharePoint中详细的版本对比
    ASP.NET安全隐患及SharePoint中的Workaround
  • 原文地址:https://www.cnblogs.com/kasion/p/4833334.html
Copyright © 2011-2022 走看看