数独游戏的设计与实现

一、数独游戏就是要求玩家在空白的小格子里填上1~9中的数字,使得每个数字在“九宫格”的每行、每列、每个小九宫格中均只出现一次。

我这次学习是通过跟着视频一步一步的写出来的,一开始遇到的问题就是搭建教程里的环境,配置各种插件来着。

然后写程序时遇到的问题就是刚开始要画出九宫格的时候只弄出了个背景,然后反复练习才分好9X9的格子,然后就在格子里放置数据。

后来在写用户点击空白格子的时候要弹出对话框还有显示出可选数字的时候不会,然后接着学习才知道需要设置碰撞检测还有一个单点触摸事件。

二、设计与实现过程。

首先是Android图形编程,

要创建color.xml文件定义颜色,用paint和canvas对象来绘制图形和字符。

绘制出九宫格,然后要在九宫格里随机放置数字。

初始化九宫格的数据

private final String str = "360000000004230800000004200"
+ "070460003820000014500013020"
+ "001900000007048300000000045";

private int sudoku[] = new int[9 * 9];

定义一个类,

public class ShuduView extends View{

//单元格的宽度和高度
private float width;
private float height;
private int selectedX;
private int selectedY;

private Game game = new Game();

public ShuduView(Context context) {
super(context);
}

继承View,复写View的onDraw函数,在onDraw当中使用Canvas和Paint对象绘制图形。

protected void onDraw(Canvas canvas) {
//生成用于绘制背景色的画笔
Paint backgroundPaint = new Paint();
//设置画笔的颜色
backgroundPaint.setColor(getResources().getColor(R.color.shudu_background));
//绘制背景色
canvas.drawRect(0, 0, getWidth(), getHeight(), backgroundPaint);

Paint darkPaint = new Paint();
darkPaint.setColor(getResources().getColor(R.color.shudu_dark));

Paint hilitePaint = new Paint();
hilitePaint.setColor(getResources().getColor(R.color.shudu_hilite));

Paint lightPaint = new Paint();
lightPaint.setColor(getResources().getColor(R.color.shudu_light));
for(int i = 0; i < 9 ;i++){
//一下两行代码用户绘制横向的单元格线
canvas.drawLine(0, i * height, getWidth(), i * height,lightPaint);
canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilitePaint);

canvas.drawLine(i * width, 0, i * width, getHeight(), lightPaint);
canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilitePaint);
}

//单点触摸事件

//获取玩家点击的地方

public boolean onTouchEvent(MotionEvent event) {

  //获取事件的种类

  event.getAction();

  //获取点击的坐标

  event.getX();

  event.getY();

 }

创建一个数组存放已经不可用的数据

private int used[][][] = new int[9][9][];

KeyDialog类

用于实现Dialog,实现自定义的对话框功能
public class KeyDialog extends Dialog {
//用来存放代表对话框当中按钮的对象
private final View keys [] = new View[9];
private final int used[];
private ShuduView shuduView;

//构造函数的第二个参数当中保存着当前单元格已经使用过的数字
public KeyDialog(Context context,int [] used,ShuduView shuduView){
super(context);
this.used = used;
this.shuduView = shuduView;
}

当用户点击一个空白的格子的时候会显示出可以填写的数字给玩家选择。

Game类

负责逻辑运算

public class Game {

// 数独初始化数据的基础
private final String str = "360000000004230800000004200"
+ "070460003820000014500013020"
+ "001900000007048300000000045";

private int sudoku[] = new int[9 * 9];

//用于存储每个单元格已经不可用的数据
private int used[][][] = new int[9][9][];

public Game() {
sudoku = fromPuzzleString(str);
calculateAllUsedTiles();
}

// 根据九宫格当中的坐标,返回该坐标所应该填写的数字
private int getTile(int x, int y) {
return sudoku[y * 9 + x];
}

三、心得体会:

通过这次实践,我学习到的Android开发的基础知识,比如Paint,Canvas,FontMetrics等等方法的使用,还有触摸事件和显示对话框的方法,这次

实验收获很大。

原文地址:https://www.cnblogs.com/iliuh/p/4841026.html