android 小游戏 ---- 数独(三)

segment 3

android 小游戏 ----  数独(三)

好的,既然要把数独棋盘中初始提示数字绘制出来,我们就要先了解数独的一些特点。

数独棋盘中总共是81个数字,那我们是否可以用一个数组来代表整个棋盘对应的数字呢
想象我们初始化一个9x9的数组,
private int[] sudoku = new int[9*9]

//初始化数据
    private int[] sudoku = new int[9*9];

这里使用一维数组,当然使用二维数组更加明了直接,这个随个人喜好。

那么我们可以让 sudoku[0] 对应数独棋盘上第一个方格的数字(左上角),

sudoku[1]对应第一个行第二个方格数字,以此类推。

数独的81个数字是有规律的,这个可以在网上找到初始化的数字和填好棋盘的数字。

我们找一个这样的数据,以String字符串的形式初始化,在通过分解让其填充到int数组中

    //数独初始化谜题数据的字符串
    private final String init_str =    "061030020050008107000007034"
                                    +"009006078003209500570300900"
                                    +"190700000802400060040010250";

    //正确答案字符串
    private final String correct_str = "761934825354628197928157634"
                                    +"219546378483279516576381942"
                                    +"195762483832495761647813259";


/**
     *根据一个字符串数据 生成一个整形数组 数独游戏的初始化数据
     */
    protected int[] fromPuzzleString(String str){
        int[] sudo =  new int[str.length()];
        for(int i=0;i<sudo.length;i++){
            //charAt()返回指定索引处的 char值    分解字符串填充到数组
            //减去0 做类型转换 使之成为int类型
            sudo[i]=str.charAt(i)-‘0‘;
        }
        return sudo;
    }
/**
     * 根据九宫格中当中的坐标 返回此位置的所应该填写的数据字符串
     */
    public String getTileString(int x,int y){
        int v = getTileInteger(x, y);
        if(v == 0){
            return "";
        }
        else {
            return String.valueOf(v);
        }
    }

有了getTileString(int x,int y)这个方法,我们就可以根据棋盘方格的位置代表的坐标

的到当前方格应该填充的数字。

如何的到我们绘制棋盘方格所代表的坐标呢?

首先我们重写SurfaveView的onSizeChanged方法,不重写也可以,主要目的是确定棋盘方格的高度和宽度。

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        /*
         * 计算单元格的宽度和高度
         * 设置方块的宽度和高度为屏幕w宽度的1/9 正方形
         */
        this.width = w/9f;
        this.height = w/9f;
        super.onSizeChanged(w, h, oldw, oldh);
    }

这里我们设置宽高都为宽度的1/9,这样看就是完整的正方形了。

当用户点击屏幕时,根据点击事件得到点击的坐标,在做一下运算就可得到当前所点击

的方格所代表的坐标了。

//用户点击的屏幕的坐标点
        selectedX = (int)(event.getX() / width);
        selectedY = (int)(event.getY() / height);

绘制初始数据,则不需要知道方格代表的坐标,

如下,用嵌套循环,便利sudoku数组,如果匹配到空则不绘制

for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if(!game.getTileString(i, j).equals("")){
                    paint.setColor(getResources().getColor(R.color.shudu_init_number_bg));
                    canvas.drawRect(i*width, j*height, i*width+width, j*height+width, paint);
                }
            }
        }

棋盘下方的数字键盘,是在xml中布局的,keypad.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/num_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num_1"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num_2"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num_3"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num_4"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num_5"
            android:layout_weight="1"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/num_6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/num_6"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/num_7"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/num_8"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/num_9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/num_9"
            android:layout_weight="1"
            />
        <Button
            android:id="@+id/undo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="undo"
            android:layout_weight="1"
            />

    </LinearLayout>

</LinearLayout>

然后在main.xml include进来

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@android:color/white"
    tools:context=".MainActivity" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="350dp"
        >
        <com.sphere.shudu.GameSFView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/panelSurfaceView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    </FrameLayout>

    <include android:id="@+id/keyPadView"
            layout="@layout/keypad" />

</LinearLayout>

这里使用了350dip,适用于hdpi的设备,如果是其他类型请自行配置高度大小。

最后在Activity的setContentView中传R.layout.main即可

这样,Activity中就同时包含surfaceview的显示和操作的按钮区域了。

时间: 2024-10-25 08:43:47

android 小游戏 ---- 数独(三)的相关文章

android 小游戏 ---- 数独(一)

segment 1 android 小游戏 ----  数独(一) 规则:在9X9的棋盘中,每个横行和竖列中的9个格子都包含数字1至9,不重复, 且每个黑色粗实线围住的9个格子都包含数字1至9,不重复. 既然涉及到棋盘,那就少不了绘图,我们知道在android中绘图的工作是由UI线程完成的, 一般是指主线程,而android系统设定UI绘图线程超过5秒不响应就会报异常,所以一般在 子线程中进行数据的计算,然后将消息发给UI线程,使之更新界面. 在Java中我们可以通过View来绘图,在默认情况下

android 小游戏 ---- 数独(四)

segment 4 android 小游戏 ----  数独(四) 好的,棋盘绘制出来了.那么我们如何在空白方格中填写数字呢? 这时按钮就发挥出来它的作用了. 我们在控制器类game中设置一个标志,标示当前用户想要填写的数字, 可以通过监听器监听当前用户点击是哪个按钮,然后用game的set方法设置一下. 首先在MainActivity.java 中设置一下监听器. public class MainActivity extends Activity { private Game game; p

android 小游戏 ---- 数独(二)

> 首先创建一个自己的View类 -->继承SurfaceView并实现SurfaceHolder.Callback接口 --> SurfaceView.getHolder()获得SurfaceHolder对象 -->SurfaceHolder.addCallback(callback) 添加回调函数 -->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布 --> Canvas绘画 -->SurfaceHolder.unlockC

android小游戏模版—重力感应

好久没更新博客了,今天来谈谈android小游戏---重力感应,一般在游戏里运用的比较多,比如这类游戏有:神庙逃亡,极品飞车,平衡球,三围重力迷宫,重力赛车等. 首先什么是重力感应,重力感应是指现在手机中常用的一个器件,及加速度传感器.当手机静止时,加速度就是重力,所以一般也叫做重力传感器.这个硬件可以感应加速度的变化,转化为数据提供给系统.还有一种传感器是陀螺仪,检测围绕某轴的旋转动作,是利用有质量的刚体的在做旋转或震动时,如果发生垂直于旋转或震动轴的旋转,因为惯性会产生垂直于旋转或震动轴的柯

Android开发系列(十六):【Android小游戏成语连连看】第二篇

写的晚了,在分工个Z市高中的一个成绩查询的系统,原系统竟然是用VB写的,我不得不佩服原本写系统的那位哥们真能耐得住. 明天搭建下SVN就等着先发工程款然后开始项目了,想想有工资进账,心里也为我那干瘪的钱包小兴奋了一把. 闲话不多说了,今天我们来分析下这个小游戏的工作原理以及核心代码的解析: 工作原理: "主界面"以及"关卡界面"不多说了,这两个是直接写了xml文件, 然后,我们在"游戏界面"的搭建是: 用java代码动态生成了这个界面,在界面中通

软件工程 Android小游戏 猜拳大战

一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Android系统下的节奏大师,自己也就考虑做一个类似的,然后自己写技术水平有限,还是在学习Android阶段,自己就想到可以写一个猜拳的比较小游戏. 这是一款基于Android平台小游戏—猜拳大战,简单,易操作,趣味强,训练反应速度,内存小,没有广告,安全. 最大的特点:训练人的反应速度. 游戏规则:在3

介绍一款Android小游戏--交互式人机对战五子棋

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6589025 学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐.之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看到机器的思考过程,还可以标识出每一个落子点的优劣势:二是因为可以为机器增加游戏经验,使得机器越来越聪明.希望喜欢五子棋的同学能够喜欢,

Android开发系列(十五):【Android小游戏成语连连看】第一篇

学了一个多月安卓,因为暑假的时候要给朋友说写个小游戏,而且也想检测下自己的能力,所以说从7号开始就着手写这个小游戏了,前前后后带上课到今天总算是写完了,但是写的这个小游戏还是有很多问题,但是还好,勉强能跑起来,一些瑕疵就不要在乎太多了,毕竟咱又不准备发布供别人下载. APK安装包下载链接(我给放在百度云盘了,可以直接点击下载):http://pan.baidu.com/s/1bnxpQrH 代码文件下载:(放在CSDN的下载那里了,不需要积分):http://download.csdn.net/

Python编写微信打飞机小游戏(三)

通过之前的任务,我们已经能够实现小飞机在屏幕上自由移动了,这次博客的任务是是的我们的小飞机看起来更有灵性——尾部喷气特效的绘制. 1.帧率 说道帧率,玩游戏的人可能并不陌生.如果你是一个lol的玩家,那你肯定最关心两件事,一是帧率(FPS),二是延迟.延迟取决于网络性能,而帧率则取决于电脑的硬件配置,自然是帧率越高游戏画面就越流畅.帧率,简单老理解就是游戏在一秒钟进行多少次画面刷新.Pygame支持的帧率大约是从30到120,为了避免游戏程序因为电脑性能的差异出现太大差别,我们在此为程序指定一个