zoukankan      html  css  js  c++  java
  • 数独游戏的设计与实现

    数独游戏的规则:

       1.游戏会从一个部分带有数字的九宫格开始。 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格。

       2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字。

       3.填数字时必须满足以下条件:在空白的小格子里填上1~9中的数字,使得每个数字在“九宫格”的每行、每列、每个小九宫格中均只出现一次。

    数独游戏的分析与实现:

     1.游戏中的每个格子可能的数字有1-9。

       2. 游戏开始显示的数字,通过一份完整的数独,将部分格子设为空白,得到游戏初始值。

       3.游戏中的每个空白格子可以填写的数字是:同一行未出现的数字,同一列未出现的数字,同一个3x3的九宫格中未出现的数字三部分的交集。

       4.游戏中的每个格子的三种状态:答案数字(即正确的数字),初始化数字(即游戏开始是数字,显示有数字或者空白),当前数字(即玩家填写前,

             后的数字)。

       5.游戏完成的条件是满足规则中说明的情况。

    游戏设计:

     1.绘制游戏界面。    【activity_main.xml】

     2.绘制游戏框架,大九宫格和小九宫格。   【Kuangjia.java中】

                  (1)用屏幕的宽width和高height分别除于9即可得到九宫格中每个单元格的宽度和高度。

                  (2)用 onDraw方法生成用于绘制背景色的画笔并设置画笔的颜色和设置横向、纵向的单元格线的颜色、背景色并绘制横向单元格线和纵向单元格线。

                  (3)在values文件夹中新建color的XML文件并设置好四种颜色,以后的颜色设置就可以直接调用这里的颜色。    【color.xml】

     3.游戏格子中数字绘制,且字体在格子中居中显示。   【Kuangjia.java中】

                  (1)用paint中的方法绘制数字,设置数字的颜色为黑色并把数字设置居中显示。

                  (2)用FontMetrics fm = paint.getFontMetrics();即FontMetrics方法真正实现文字在矩形框当中居中显示。

     4.游戏交互事件处理,点击小格子,提示玩家选择填写的数字,并将选择的数字绘制到所点击的格子中。   【Kuangjia.java和Shuzi.java中】

                  (1)用onTouchEvent();函数实现单点触摸事件,即鼠标(手)触动手机屏幕事件,当手触动该view时该函数会被调用onTouchEvent

                  (MotionEvent event)中的方法获取当前点击的单元格坐标 。

           (2)调用Shuzi方法实现提示玩家选择填写的数字的自定义对话框,用setListeners();方法为对话框当中所有的按钮设置监听器,即可实现

                  将选择的数字绘制到所点击的格子中。

    5.自定义对话框的实现过程,从提示到消失。    【Shuji.java中】

                   (1)新建Shuzi类,实现自定义的对话框功能。

                   (2)用Shuzi();构造函数保存着对话框当前单元格已经使用过的数字,当一个对话框第一次显示的时候调用其onCreate方法实现提示功能,

                   最后用dismiss();方法取消对话框的显示。

    6.具体的逻辑处理的实现过程。    【Jiugong.java】

                   (1)新建String str存储字符串数据,存储数独游戏中要用到的数字。

                   (2)用fromPuzzleString(String src)方法根据一个字符串数据,生成一个整形数组(将字符串常量转换为数字存入数组中),即所谓的数独

                   游戏的初始化数据。

                   (3)用calculateAllUsedTiles()方法计算所有单元格对应的不可用数据;用calculateUsedTiles(int x, int y)方法计算某一单元格当中已经

                  不可用的数据;用getUsedTilesByCoor(int x,int y)方法取出某一单元格当中已经不可用的数据;用setTileIfValid(int x, int y, int value)

                 方法接收KeyDialog中点击的数字。

                   (4)用setTile(x, y, value)方法将对应的值value绘制在xy对应的格子中,最后用calculateAllUsedTiles()方法重新计算所有格子的不可用

                   数据。

     7.最后根据游戏完成的条件判断游戏是否完成。    【MainActivity.java】

                   (1)在主类MainActivity中调用Kuangjia对象。

                   (2)根据规则完成数独游戏。

    结果截图:

    问题及解决办法:

    (1)用paint中的方法绘制数字时,设置字体居中的方法很容易,但却无法实现文字在矩形框当中居中显示。后

           来找一些Android数独开发视频观看,才学习到原来是用FontMetrics方法才能真正实现文字在矩形框当中居中显示。

       

    (2)最后在自定义对话框中,也不知道如何显示当前单元格要提示输入的备选数字。上网找也找不到,结果询问了一下师兄,师姐。才能实现出来。

           其实也不难就是先放9个按钮上面分别是数字1-9,然后遍历整个九宫格分别在横向和纵向找到出现过的数字,最后把对话框中出现过的数字按

    钮屏蔽不显示,这样就得到对话框中提示的备选数字。

    心得与体会:

      在该数独游戏的开发过程中遇到过不少困难,虽然解决起来不是那么容易,但是在这其中学到了很多知识,同时也提升了我对Android程序开

    发的兴趣,希望能够在这方面有更进一步的发展。

  • 相关阅读:
    PDO扩展
    阿里云ECS VSFTP上传本地文件
    Nginx+lua_Nginx+GraphicsMagick来实现实时缩略图
    Mysql 5.6主从同步配置与解决方案
    windows安装配置mongodb及图形工具MongoVUE
    安装phpredis扩展以及phpRedisAdmin工具
    Redis安装配置以及开机启动
    CentOS安装Git服务器 Centos 6.5 + Git 1.7.1.0 + gitosis
    OpenStack 入门3
    Openstack 入门2
  • 原文地址:https://www.cnblogs.com/ddyyhh/p/4836863.html
Copyright © 2011-2022 走看看