博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数独游戏的设计与实现
阅读量:5299 次
发布时间:2019-06-14

本文共 2841 字,大约阅读时间需要 9 分钟。

一、数独游戏就是要求玩家在空白的小格子里填上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

你可能感兴趣的文章
返回结果数据帮助类
查看>>
SVN部署和使用
查看>>
Build Tools
查看>>
Mysql的基础使用之MariaDB安装
查看>>
单链表操作B 分类: 链表 2015-06-0...
查看>>
周赛-Heros and Swords 分类: 比赛 ...
查看>>
Error:No suitable device found: no device found for connection "System eth0"
查看>>
Go beego框架使用笔记(一)
查看>>
jQuery各种效果举例
查看>>
Day47:HTML(简介及常用标签)
查看>>
Redis.md
查看>>
软件工程课堂小测01
查看>>
大道至简阅读笔记02
查看>>
自定义日志工具LogUtil
查看>>
Linux下安装PHP遇到的各种问题
查看>>
transition
查看>>
shell脚本自动备份数据库(精简版)
查看>>
充分发挥FPGA优势 Altera首推新颖OpenCL工具
查看>>
ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序
查看>>
ORACLE手工删除数据库
查看>>