数独设计(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;
	}
}
时间: 2024-08-10 12:44:46

数独设计(2)的相关文章

数独设计(1)

在设计数独之初,就遇到了很多困难,这个是事先已经想到的,已经做好了思想准备,所以遇到困难的时候也没有太大的打击. 最好的老师就是百度,作为一个没学过安卓开发的我,通过这次老师布置的任务,从而上百度自学安卓. 幸运的是,这个学期我们开了安卓开发的课程,从老师上课讲解的一些界面设置,安卓开发的流程,然后再加上自己上网找安卓教程. 勉强的了解了一些安卓开发的基础.接下来就是设计数独, 网上找了一些老师的视频,看完后,整理作为学习笔记. 有前面的基础学习,现在正式进入数独开发的业务逻辑处理,和基本代码的

数独设计(4)

经过了前两天的设置后,我们就可以再View类中,进行游戏的布置,和进行操作了. package com.mars.demo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.FontMetrics; import android.uti

实验5 数独游戏界面设计

一.实验目的及要求(本实验所涉及并要求掌握的知识点) 实现数独游戏的完整界面设计 掌握ActionBar的使用: 二.实验环境(本实验所使用的硬件设备和相关软件) (1)PC机 (2)操作系统:Windows XP (3)软件: Eclipse, JDK1.6,Android SDK,ADT 1) 导入工程Sodoku 2) 添加以下的Activity类 3) 添加以下layout资源文件 4) 完成设计后,界面运行如下 初始界面: 新游戏界面: 帮助界面: 关于界面: 四.实验结果(本实验源程

C#程序之二 -- 数独小游戏(1. UI设计)

老师分配的项目需要编软件,刚好最近一直在玩手机上的数独,所以就想用空余时间写一个PC上的单机版的数独小游戏,练练自己的编程能力.不能保证每天都有时间花在这个小程序上面,不过会尽量坚持下去,每完成一点东西,都会把核心代码和查到的相关资料发一下,目前还处在语法都没学完的阶段,想借这个机会记录一下自己的成长~ 一.UI 设计 1. 用 ComboBox 控件来选择游戏难度: 2. 用 Label 控件显示本局游戏累计用时: 3. 九宫格大背景是一个设置了背景色的 Label 控件: 4. 每个格子都是

《数独游戏的设计与实现》

数独游戏的规则很简单,只需要在空格初填入1~9的数字,并保证每个数字在每个九宫格内只能出现一次,且每个数字在每一行.每一列也只能出现一次,而一半的游戏过程是系统随机生成一个棋局,然后玩家需要在空白处填上相应的数字使其满足游戏的规则. 完成过程:绘制一个9*9的九宫格,设计了简单和困难两种难度,设置其中几个格子的数字,使其形成一个数独游戏,然后通过X,Y轴获取用户输入的数字. 设计与实现思想:运用遍历算法完成九宫格的获取 遇到的问题与解决方法:因为之前没有学习过安卓,从现在才开始慢慢接触,只能上网

实验5数独游戏界面设计

实验报告 课程名称 基于Android平台移动互联网开发 实验日期 2016.4.8 实验项目名称 数独游戏界面设计 实验地点 S30002 实验类型 □验证型    √设计型    □综合型 学  时 2 一.实验目的及要求(本实验所涉及并要求掌握的知识点) 目的:实现数独游戏的完整界面设计 要求:掌握ActionBar的使用 二.实验环境(本实验所使用的硬件设备和相关软件) (1)PC机 (2)操作系统:Windows XP (3)软件: Eclipse, JDK1.6,Android SD

数独游戏的设计与实现之第一篇——理解数独过程

数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复. 摒除法,数独盘面是个九宫,每一宫又分为九个小格.在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字.使1-9每个数字在每一行.每一列和每一宫中都只出现一次,所以又称“九宫格”.基本解题方法:摒除法,余数法,直观法,候选数法(参考百度百科)

数独游戏的设计与实现

前景:数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 然而如何制作出这个游戏?首先要了解它的规则: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件:在空

第二次作业——个人项目实战:数独

1.阅读 刚开始泛看<构建之法>的时候,还是觉得非常难理解里面的内容,特别是代码部分.后来第二次拿起这本书,从第一章开始看起,慢慢了解了"软件企业=软件+商业模式"和对软件工程的定义,但是更多地还是记忆了一遍,没有明白这里面的深意:看第二章的时候,跟着单元测试.回归测试的.效能分析的内容自己照着书上的代码敲了一敲,偶尔会出现bug,但是能得到书上所说的效果还是很开心的,效能分析,感觉就是代码的效率问题,追求高效,然后接触到了软件工程师的一套模型-个人开发流程PSP,我也尝试