Android开发——手把手写APP(四)——数独游戏编写(二)——初始化数独数据

初始化数独数据


fontMetrics的使用方法

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。

FontMetrics对象

它以四个基本坐标为基准,分别为:

・FontMetrics.top
・FontMetrics.ascent
・FontMetrics.descent
・FontMetrics.bottom

该图片将如下
在这里插入图片描述
baseline为基准线,top为最顶端,ascent为文字最顶端,descent为文字最下端,bottom为最下端

文字在矩形框中居中的方法

我们要文字居中的话,就需要考虑文字的位置,这涉及到算法问题。
根据上面对于fontMetrics的介绍,不难想出,文字的左边界应该是第几个格子 * 一个格子的宽度 + 一个格子的一半,上边界比较麻烦,就记下面代码中y的公式慢慢理解吧。

        /*以下几行设置数字居中*/
        //创建fontMetrics
        Paint.FontMetrics fontMetrics = numberPaint.getFontMetrics();
        //x轴偏移量
        float x = width / 2;
        //y轴偏移量
        float y = height / 2 - (fontMetrics.ascent + fontMetrics.descent) / 2;
        //在第一行第4列画出“1”这个数字
        canvas.drawText("1",3 * width + x,y,numberPaint);

在这里插入图片描述

初始化数独数据

创建一个Game类用于初始化数独

首先要有一个模板,给大家准备好了。

    //数独初始化的数据基础
    private final String str = "360000000" +
            "004230800" +
            "000004200" +
            "070460003" +
            "820000014" +
            "500013020" +
            "001900000" +
            "007048300" +
            "000000045";

我们需要一个数独的9 * 9的整形数组,然后要想如何把这些字符串变为整形数组

    /**
     * 根据一个数独的字符串基础数据,生成一个整形数组作为数独游戏的初始化数据
     * @param str 基础数独字符串
     * @return 一个整形数组
     */
    private int[] fromPuzzleString(String str) {
    	//定义一个整形数组,以字符串长度为其长度
        int [] sudo = new int [str.length()];
        //把字符串变为整形,加入到整形数组中
        for(int i = 0;i < sudo.length;i++){
            sudo[i] = str.charAt(i) - '0';
        }
        return sudo;
    }

在Game的构造方法中获取这个整形模板,现在有了模板就想如何把模板画到九宫格中了。
根据九宫格的位置,获取数组中的值,再根据数组的值来绘制九宫格。

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

    /**
     * 根据X轴和Y轴位置,返回一个应该填写的字符
     * @param x X轴坐标
     * @param y Y轴坐标
     * @return 该填的数据
     */
    public String getTitleString(int x,int y){
        int v = getTitile(x,y);
        //如果是0,绘制空的图形
        if(v==0){
            return "";
        }
        //如果不是0,绘制其本身数字
        else
            return String.valueOf(v);
    }

基本方法完成,现在就要在ShuduView的画布上把字符画出来即可。

        /*以下几行设置数字居中*/
        //创建fontMetrics
        Paint.FontMetrics fontMetrics = numberPaint.getFontMetrics();
        //x轴偏移量
        float x = width / 2;
        //y轴偏移量
        float y = height / 2 - (fontMetrics.ascent + fontMetrics.descent) / 2;
        //画出九宫格的初始化数据
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++){
                canvas.drawText(game.getTitleString(i,j),i * width + x,j * height + y,numberPaint);
            }
        }

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狮子座的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值