数独九宫格

这次,我做了有关数独的游戏,是有关APP的数独。

res/values/colors:增加了很多颜色,其中

<color name="shudu_background">#CC9999 </color>是背景色;

<color name="shudu_hilite">#ffffffff</color>

<color name="shudu_light">#64c6d4ef</color>

<color name="shudu_dark">#6456648f</color>,这三个是绘制格子线条颜色。

<color name="z">#FF99CC</color><!--粉红-->,是用户添数界面的颜色。

在Game.java中,

public final String STR = "360000000004230800000004200"
+ "070460003820000014500013020" + "001900000007048300000000045"是准备一个字符串数字 

private int[] data = new int[9 * 9]; 一个数组,存储某个单元格中不可用的数据  

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;
} 定义方法,将字符串常量转换为数字存入数组中,游戏初始化数据。

 计算该单元格纵向(列)不可用数据
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;
} 计算小九宫格中不可用的数据  

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;
}
}
接收KeyDialog中点击的数字  

 

在MainActivity.java中,setContentView(new MyView(this));意思是程序首先会启动这个文件的窗口。

MyView.java中,设置了onTouchEvent当屏幕有touch事件时,此方法就会被调用,如生成用户选择输入数独数字的界面。

一开始做完之后老是运行不了,因为忘了创建模拟器,后来发现了这个问题,创建了之后就可以运行了。

通过这次做数独的经历,我自己学到了很多东西,从没有接触过APP到自己完成一个作品,花了不少时间和精力,不过能自己完成一个作品我也是很开心,收货颇多。通过这次,我以后对安卓的学习更有信心。

 

 

 

 

转载于:https://www.cnblogs.com/linyangbin/p/4840599.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值