基于Android的数独游戏设计_第1页
基于Android的数独游戏设计_第2页
基于Android的数独游戏设计_第3页
基于Android的数独游戏设计_第4页
基于Android的数独游戏设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学生姓名班级学号专业计算机科学与技术课程设计题目基于Android的数独游戏设计评语组长签字:成绩日期2014年 月 日课程设计任务书学院信息科学与工程学院专业计算机科学与技术学生姓名班级学号课程设计题目基于Android的数独游戏设计实践教学要求与任务:能够运用Java语言设计数独游戏,实现基本游戏效果。会搭建An droid的开发环境,并学会运用 Eclipse开发工具相关An droid程 序进行开发;深入了解 An droid项目生成的文件之间的关系和它们 的作用。工作计划与进度安排:第一阶段:20学时。设计阶段。学生根据所选题目,查阅有关 资料,综合所学的理论知识,完成整体设计及具体

2、设计。第二阶段:8学时。调试测试阶段。上机调试测试,要求学生务 必认真,思想高度集中,调试成功后,整理、编写设计资料及实验 报告。第三阶段:4学时。验收答辩。指导教师:2014年 月 日专业负责人:2014年 月 日学院教学副院长:2014年 月 日摘要移动互联网时代的到来极大的改变了我们的生活,而 Android 是一种以 Linux 为基础的开放源码操作系统迅速占领了智能机操作系统,所以在 android 环境下开发显得尤为必要。 Android 是开放性体系架构, 不仅具有非常好的开发、 调试环境, 而且还支持各种可扩展的用户体验, 包括丰富的图形组件、 多媒体支 持功能以及强大的浏览器

3、。因此,对于软件从业人员来说, Android 平台具有无 限的吸引力。本文就在分析讨论 Android 手机软件开发技术原理的基础上, 为用户开发出 基于 Android 平台的数独游戏的软件。通过对 Android 系统架构和应用开发进 行初步研究,设计一款数独游戏。在对系统进行详细需求分析的基础上,确 定了系统的功能和性能要求,对游戏的开机动画,菜单界面、屏幕绘制、时 间控制、布局算法等进行了设计。本文详细介绍了在 Android 平台上以 Java 为语言编写游戏的过程,最终实 现了一个界面友好、操作简单的手机益智游戏。关键词: Android 数独 智能机目录1、开发工具与环境 5.

4、2、系统分析与设计 9.2.1 数独游戏背景 9.2.2 游戏功能简介 9.3、系统详细设计 1.2.3.1 欢迎界面的设计和实现 1.23.2 游戏界面相关类的实现 1.73.3 数独算法类的实现 1.93.4 游戏的测试和运行 2.34、总结 2.8.参考文献 2.9.1、开发工具与环境Android 是谷歌公司发布的手机操作系统, 它是基于 Linux 平台的开源手机 操作系统,谷歌公司将要把其打造为基于移动终端的真正开放的移动软件平台, 不仅拥有移动电话所需要的工作软件, ,而且在专利权方面能够不侵犯他人权利 去推动移动互联网的创新。谷歌公司为了开发 Android ,与开放手机联盟进

5、行了合作,手机开放联盟由 全球 30 多家移动开发和手机应用的领先企业组成。 谷歌公司不仅仅和运营商达 成了合作关系、 而且与设备制造商以及开发商保持长期合作, 目的就在于利用其 优势建立移动软件平台,其特点是标准化、开放式的。 Android 是谷歌公司未来 企业战略的一部分,其目的是为了在任何时候任何地点能够提供信息。Android 应用程序与其他很多计算机平台的应用程序不同,他们没有唯一的 启动入口,一个An droid应用程序是由多个不同组件组合而成,组件间通过In te nt 实现通信。An droid 系统的基本组件包括 Activity 、Service、Broadcast Re

6、ceiver 和Content Provider等,要实现组件间通信,还需要Intent消息组件。并不是每 个An droid应用程序都必须具备这四个组件,很多时候只需要这四种中的某几种 就可以了。除此之外,应用程序的所有组件还都必须在 AndroidManifest.xml 中 声明。这是一个XML配置文件,这个配置文件用于定义应用程序的组件、组件 的功能及必要条件等。这个配置文件是任何一个 Android 应用程序所必需的。1.1 ActivityActivity 可以说是开发人员最常用的组件,同时也属于 Android 最基本的 组成部分之一。 Android 程序中,一般一个 Acti

7、vity 代表手机屏幕上的一屏。 举例来说, 如果将手机比作一个浏览器, 那么一个 Activity 就相当于一个网页。 在Activity中,可以添加多个视图,然后为这些视图添加一些事件处理。这些视图可以是按钮、文本框、列表等。可以看到, Activity 的概念和网页的概念 相当类似。一般一个 Android 应用是由多个 Activity 组成,同时这些 Activity 相互之间可以进行跳转, 例如,按下某个 Activity 中的 Button 按钮后, 可能会 跳转到一个其他的 Activity 。不过和网页跳转稍有不同, Activity 之间的跳转可 以有返回值,例如,在 Ac

8、tivity A 跳转到 Activity B 后,那么当 Activity B 运行结束时,可能会返回给 Activity A 一个值。在多个 Activity 交流的过程中, 这种返回机制是相当实用的。 当用户进入一个新的屏幕时, 之前的屏幕会转入暂 停状态,并且保存在历史堆栈中。 正是由于历史堆栈的存在, 用户可以通过返回 操作,返回到之前打开过的所有屏幕。 Android 默认的是将应用程序从开始到当 前的每一个屏幕都保存到堆栈中,不过与此同时, Android 还提供了很方便的机 制,让开发人员自定义某个屏幕是否需要保存到历史堆栈。 Activity 的跳转实 现,必须借助于In t

9、e nt类。因此Intent在An droid应用中占据的地位是极其重 要的。简单来说,一个 Intent 就是对一个将要执行的操作请求的抽象描述。Intent 的描述,主要包含有两个数据结构:动作 (action) 和动作对应的数 据(data)。动作有很多种,系统中最常见的动作类型有:MAIN表明该Activity是应用程序的入口 )、VIEW、PICK、EDIT 等等;而动作对应的数据一般以 URI 的形 式表示,例如:要查看某一个网页,则需要创建 Intent ,它的动作类型为 VIEW, 对应的数据应该是该网页的网址。 值得一提的是, 有一个类叫 IntentFilter ,它 是I

10、ntent的相关类。如果说Intent是一个有效的操作请求,那么一个IntentFiler 则用于描述一个Activity( 或者Intent Receiver等)能够接收哪些Intent的请求。比如系统浏览器的 Activity 用于查看某一个网页,那么它用于接收 Intent 的IntentFilter,要定义类型为VIEW勺动作并且能够过滤表示一个网页网址的URI。通常 IntentFilter要被注册在 AndroidManifest.xml 文件中。Activity之间的跳转正是通过解析各种 Intent 来实现的。例如一个 Activity 调用 startActivity(int

11、ent) 方法,希望跳转到其他的 Activity 时,会触发系统的 Intent 解析过程, 在所有安装的应用程序中已注册的 IntentFilter 中查找,并 最终挑选出能够匹配Intent的Activity 。然后这个新的Activity 因为接收到 Intent的请求而开始运行,完成Activity的跳转。这种跳转机制提供了两个关键好处:(1) 操作请求被 Intent 封装起来,方便 Activity 重复利用。(2) 相互跳转的多个 Activity 之间实现了松耦合。只要 IntentFilier 保持 不变,一个 ctivity 可以随意修改,而不用担心其他 Activity

12、 找不到它。1.2 Broadcast Receiver应用程序可以通过 Broadcast Receiver 监听一个外部的事件, 并做出响应。 例如,当应用程序需要对电话呼入这个外部事件做出反应时, 可以利用 Broadcast Receiver 进行处理。再如,当一个后台下载任务成功的事件发生时,需要提示 用户下载完成,仍然可以利用 Broadcast Receiver 来进行处理。Broadcast Receiver不能生成UI,也就是说对于用户来说是透明的,用户是 看不到的。 Broadcast Receiver 只能通过 NotificationManager 来通知用户这些 事件

13、发生了。 Broadcast Receiver 既可以在 AndroidManifest.xml 中注册,也可 以在运行时的代码中使用 Context.registerReceiver() 进行注册。注册完成之 后,当事件来临的时候,即使程序没有启动,系统依然可以根据定义,自动启动 程序。各种应用也可以通过使用 Context.sendBroadcast() 将它们自己的 Intent Broadcast 广播给其他应用程序。1.3 ServiceService 是一种程序,它可以运行很长时间,但是它却没有用户界面,不可 交互,而且不能自己运行。它需要通过某一个 Activity 或者其他的

14、Context 对象 来调用 12 。最常见的例子, 比如说用户正在运行一个音乐播放器的程序, 此时如 果想浏览网页,那么,在用户导航到 Android 的浏览器以后,虽然进入了浏览器 屏幕,但是歌曲的播放并没有停止, 而是在后台继续播放着。 其实播放的动作正 是由播放音乐的 Service 执行着。当然,如果需要的话, Service 也是可以停止。 通过 startService(l ntent service)可以启动一个 Service,通过Context.bindService() 可以绑定一个 Service 。1.4 Content Provider对于数据存储, Android

15、 与其他的操作系统有一点不太一样,即数据在 Android 程序中都是私有的,这些数据包括文件类型和数据库类型以及其他类型 的数据。这样系统和应用程序的数据就各自独立起来, 以避免受到某些不正常程 序或是病毒的影响。 不过这并不代表各应用程序之间就因此而无法进行数据交换 了。当某个应用程序希望与其它的应用共享其数据时, Android 提供的 Content Provider 就可以发挥作用了。在实现 Content Provider 的抽象接口以后,程序便 可以将自己的数据暴露出去, 其他程序只要有权限, 就可以通过这一套标准而统 一的接口,读取或是删除该程序的数据 13 。2、系统分析与设

16、计2.1 数独游戏背景数独的前身为“九宫格” ,最早起源于中国。但当时的算法比现在的更为复 杂,要求纵向、横向、斜向上的三个数字之和等于15,而不是数字不能重复。儒家典籍易经中的“九宫图”也是来源于此。到了 18世纪末,瑞士数学家莱昂哈德欧文又发明了一种叫做“拉丁方块” 的游戏,之后不久, 美国的一家数字逻辑游戏杂志开始刊登这类游戏, 使此类游 戏得到良好发展,之后又在日本得到了广泛的传播。 2004 年,第一个“数独” 游戏被刊登上了英国 泰晤士报 的封面, 此时开始数独游戏才真正为世界所知 晓。数独游戏的规则很简单,只需要在空格处填写 19的数字,并保证每个数字 在每个九宫格内只出现一次,

17、 而一般的游戏过程是系统随机生成一个棋局, 然后 玩家需要在空白处填上相应的数字使其满足游戏规则。由于此类游戏操作简单, 不需要特定的语言基础, 也不需要进行数字运算且可玩性高、 锻炼思维、 开发大 脑,所以很快风靡全球。2.2 游戏功能简介数独游戏的规则很简单,只需在空格处填入19的数字,并保证每个数字 在每个九宫格内只能出现一次,且每个数字在每一行、每一列也只能出现一次, 而一般的游戏过程是系统随机生成一个棋局, 然后玩家需要在空白处填上相应的 数字使其满足游戏规则。游戏框架如下图所示:点击图标该游戏的运行步骤如下。1. 启动游戏后首先进入的便是欢迎界面的动画,在欢迎界面中,“点击屏幕继续

18、,,”闪动,达到提示的效果。2. 在游戏界面点击屏幕,便进入菜单界面。3. 在菜单界面单击“关于游戏”菜单可进入“关于”界面,在“关于”界面 中介绍了该游戏的目标平台及开发日期。4. 在菜单界面单击“帮助游戏”菜单可进入“帮助”界面,在“帮助”界面 介绍了游戏的基本规则。5. 在菜单界面单击“开始游戏”菜单可进入游戏界面。6. 当在游戏过程中单击“暂停”按钮时,便进入暂停状态。7在游戏过程中随时可以通过“换题”按钮来更换题目。8. 当玩家单击“放弃”按钮时,会提示玩家是否真的需要退出游戏,然后根 据玩家的选择进行操作。9. 当玩家单击“提示”按钮时,界面上会出现一个红心表示当前可以提示玩 家输

19、入数字,此时再单击空白处,便会自动填上正确答案。10. 当玩家将界面中所有的空白全部填满数字时,系统会自动判断所填写的 数字正确与否,当有错误时,会出现游戏失败界面;当全部填写正确时,会出现 游戏胜利界面。11. 在胜利或者失败状态时, 玩家可以通过点击屏幕任意位置返回欢迎界面12.在菜单界面单击“退出游戏”便可退出该游戏。3、系统详细设计3.1 欢迎界面的设计和实现3.1.1 主类 KLSDActivity 实现在本游戏设计中,控制调度模块主要是由 KLSDActivity 类来实现的 KLSDActivity 继承自 Activity 类,它提供了整个游戏的入口。 并且在游戏运行 过程中也

20、随时需要 KLSDActivity 的管理。组成该类的成员变量如下所示:WelcomeView welcomeView;GameView gameView;AboutView aboutView;HelpView helpView;Handler myHandler以上类都是对View的继承,其中WelcomeView是对欢迎动画界面的引用, GameVie是对游戏界面的引用,AboutView是对目录界面的引用,HelpView是对 帮助界面的引用, Handler Handler 主要负责线程之间的通信,通过接受消息来 更新UI线程中的控件。这里使用Handler类主要实现的是根据接收到的

21、消息做出 相应的切换视图操作,从而控制调度各个视图的显示。Han dler机制使得线程间的通信通过Messages Runnable对象来传递和处理。在此模块的实现中,Handler 传递的消息内容被封装到一个Message寸象中,Messaged包含了消息的描述和任 何形式的可以被Handler发送的数据对象,其最主要的字段是 what,此字段由用 户自己定义, 为消息类型码, 接收方可以根据该字段的值来确定收到的消息是关 于什么的。这里重点实现了 Handler类中的handleMessage()方法,此方法用来接 收并处理消息,接收的参数为一个Message寸象。在这里定义了 Messa

22、ge的what 字段,根据接收到的what字段的值来切换到不同的界面,从而实现对整个游戏运 行的管理。下面介绍 KLSDActivity 的成员函数:onCreat() :此函数是 Activity 类的入口函数, 在此函数中先将手机设置成全屏模式,然后切换到加载界面并在后台初始化欢迎动画界面in itWelcomeView():此函数实现欢迎界面的切换。initGameView():此函数实现游戏界面的切换。ini tHelpView():此函数初始化帮助界面。ini tAboutView():此函数初试化关于界面。上面介绍了实现控制调度模块的KLSDActivity 类,可以看出这里主要通

23、过 An droid中的Ha ndler机制来控制当前屏幕显示哪一个界面,从而完成控制调度 功能。3.1.2欢迎界面WelcomeView类的实现欢迎界面WelcomeView类实现的是开机动画的功能,简要流程图如下: 开始图片载入文字载入*是菜单界面图4.1 WelcomeView 类功能流程图欢迎界面是通过 WelcomeView类实现的。该类继承自SurfaceView 类,采 用双缓冲机制进行绘图。它可以控制表面的格式,比如大小,显示在屏幕中的位 置,最关键是的提供了 SurfaceHolder类,使用getHolder方法获取。在用 WelcomeView绘制之前必须使用lockCa

24、nvas()方法锁定画布,并得到画布,然后 在画布上绘制;当绘制完成后,需要使用unlockCanvasAndPost方法来解锁画布, 于是才能显示在屏幕上。BitmapID 创建了存放动画帧图片 ID 的数组,将其存放到数组中方便管理, 在之后进行系统维护时,如需新增动画帧,只需在此数组中添加新的 ID 即可。在 WelcomeView 类中, public WelcomeView(KLSDActivity activity) 是此类的构造器,主要用来初始化刷帧线程、 动画线程、以及初始化图片, onDraw() 方法主要用来绘制屏幕,按次序分别欢迎动画以及菜单界面。 onTouchEven

25、t() 方法为屏幕的监听方法, 该方法通过玩家单击位置的坐标判断出玩家单击的是菜 单界面的哪些区域,并根据单击的按钮向 Activity的Handler发送消息。3.1.3 WelcomeViewDrawThread 类和 WelcomeViewGoThrea类的实现为了实现欢迎界面的动画效果,这里设计了 WelcomeViewDrawThread类,这个类主要负责界面的定时刷新,而WelcomeViewGoThrea类负责动画的生成。WelcomeViewDrawThread和 WelcomeViewGoThrea类的生成都继承自 Thread类,重写了 Thread 类里的 run() 方

26、法,都是通过 run() 方法实现功能。WelcomeViewDrawThrea其run()方法的代码如下:public void run() / Canvas c;/ while (this.flag) /重写的 run 方法 声明画布循环c = null;try /锁定整个画布c = this.surfaceHolder.lockCanvas(null);synchronized (this.surfaceHolder) /同步welcomeView.onDraw(c);/调用绘制方法 finally /用 finally 保证一定被执行if (c != null) /更新屏幕显示内容th

27、is.surfaceHolder.unlockCanvasAndPost(c);tryThread. sleep (sleepSpan);/ 睡眠指定毫秒数 catch(Exception e)/捕获异常e.printStackTrace();/打印异常信息分析其代码,这里主要控制c值的变化,当其值为null时,结合WelcomeView类里的onDraw()方法,绘制背景图片,绘制完成后,c值不为null,解锁屏幕, 将画布置空,c值又为null,释放和更新屏幕显示的内容,从而实现刷帧作用。WelcomeViewGoThrea类中run()方法代码如下所示:public void run()

28、 / while (flag) /重写的 run 方法法循环public void onDraw(Canvas canvas) /绘制方法welcomeView.drawIndex+;/ 自加 if(welcomeView.drawIndex>welcomeView.bitmapsID.length-1) welcomeView.drawIndex = welcomeView.bitmapsID.length-10; if(welcomeView.drawIndex%5 = 0)welcomeView.drawString = !welcomeView.drawString;tryThr

29、ead. sleep (sleepSpan);/ 睡眠catch(Exception e)打印异常信息e.printStackTrace();/分析该类的run ()方法,控制drawlndex的值,每次循环将欢迎界面的drawIndex 加1,然后判断是否到达数组的最后,当到达最后时,将其减10,然后继续进行循环。同时,判断drawlndex是否为5,这样每循环5次改变drawString 的值,从而实现文字的闪动效果。3.1.4 HelpView 类和 AboutView 类的实现游戏中关于游戏帮助和游戏说明,我们分别通过 HelpView类和AboutView类的实现。HelpView类

30、和AboutView类都是通过on Draw ()方法来绘制界面。由于这两个类在很大程度上是相似的,所以下面只分析 HelpView类,代码如下所示:public HelpView(KLSDActivity activity) super(activity);this.activity = activity;/ surfaceHolder = this.getHolder();/ getHolder().addCallback(this);/得到 activity 的引用获得 surfaceHolder添加 Callback 接口的实现helpBitmap = BitmapFactory. R

31、.drawable. help );decodeResource(getResources(),绘制图片canvas.drawColor(Color. WHITE);/ 背景色 canvas.drawBitmap(helpBitmap, 0, 0, null);/public boolean onTouchEvent(MotionEvent event) /键盘监听方法if(event.getAction() = MotionEvent.ACTION_DOW)/N 屏幕被按下double x = event.getX();double y = event.getY();/得到坐标if(x>

32、;270 && x<310 && y>440 && y<480)/点击确定按钮activity.myHandler.sendEmptyMessage(2);return super.onTouchEvent(event);public HelpView(KLSDActivity activity) 为“帮助”界面的构造器,在 构造器中先得到 activity 以及 surfaceHolder 的引用,然后添加 Callback 接口 的实现并对图片资源进行初始化。onDraw()为重写的绘制方法,在该方法中,首先绘制白色背景,然

33、后将帮 助界面的背景图片绘制到指定位置。onTouchEvent ()为重写的键盘监听方法,当玩家点击屏幕时,会调用该方 法来处理玩家的屏幕事件,在“帮助”界面中该方法实现比较简单,只是判断玩 家点击的是否为返回按钮即可。当玩家点击返回按钮时,需要向 activity 发送 Handler 消息通知控制器切换屏幕。3.2游戏界面相关类的实现游戏界面实现游戏展示,计时界面展示,以及功能按键。流程图如下图所示:图4.2游戏界面流程图3.2.1 游戏界面GameView的实现首先理解下GameVieW的运行思路,GameVie在初始化时候读取相关图片信息,包括背景图片,数独背景框图片等等,在初始化同

34、时,启动GameViewDrawThrea线程进行刷帧,TimeThread线程来更新界面中的时间。当 玩家点击背景框空白位置,需要绘制数字键盘时,会启动DrawKeyThread线程绘 制数字键盘。当玩家点击按钮时候,相关方法会被调用。以上的过程都需要 KLSDActivity的参与管理。GameView同样继承自SurfaceView 类,其关键也是实现onDraw()方法。onDraw()方法分别绘制游戏界面背景图片,数字背景框,选题提示等等按钮,时 间显示区域等。DrawKey()方法实现了数字键盘的绘制,保证在点击空白框时候 有圆盘数字选框出现。通过 surfaceCreated (

35、)和 surfaceDestroyed ()两个方 法负责相关线程的启动和调用工作。3.2.2 时间线程 TimeThread 的实现TimeThread线程主要用来更新界面中的时间,作为数独游戏玩家计时功能,代码如下:public class TimeThread extends ThreadGameView gameView;/ 声明 GameVieW勺弓 I用boolean flag=true;/ 循环标志位public TimeThread(GameView gameView)/ 构造器 this.gameView=gameView;得至U GameVieW的弓 I用public vo

36、id run()/ 重写的 run 方法while(flag) gameView.time+;/ 时间自加tryThread. sleep (1000);/ 睡眠一秒种 catch(Exception e)/ 捕获异常 e.printStackTrace();/ 打印异常信息 TimeThread类的实现比较简单,只需每隔一秒钟通过gameView.time自加更改一下GameView中表示时间的属性即可。public TimeThread(GameView gameView) 为时间线程的构造器,在构造器 中先得到GameView引用。然后重写run()方法,通过时间的自加,实现一秒钟 功能

37、。3.3数独算法类的实现数独算法类主要实现数独的生成以及填入数字的检测功能,流程图如下:3.3.1数独算法基本逻辑本节将对数独算法类ShuDuSuanFa.java进行解释,该类基本上是数学计算, 通过一定的算法产生所需要的数独数组,通过特定的接口供其他类使用。该类的目的是创建一个二维数组来表示数独矩阵。使矩阵的每行、每列、每块都没有重复的数字。算法的简单思路是先随机取出一个09的数字,然后检查 其所在的行、列、块是否都符合要求。当符合要求时继续填充下一个,而当不符 合要求时,再次随机取出一个没有取出过的数字,再判断。当9个数字都取出过后还没有找到符合要求的数字时, 进行回退处理,即将最后一个

38、取出的符合要求 的数字进行重新取值,直到所有数字全部填充完毕。在求解数独时候,运用到回溯法,将所有的解(问题的解空间)按照一定结 构排列,再进行搜索。一般解空间构造成为为树状结构,用深度优先的策略搜索, 一般有两种方式:1. 只需要一个解的话,找到解即停止。2. 需要求出所有解,则需做“树的遍历”找到所有解。回溯法的基本做法是搜索, 或是一种组织得井井有条的, 能避免不必要搜索 的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。回溯法在问题的解空间树中, 按深度优先策略, 从根结点出发搜索解空间树。 算法搜索至解空间树的任意一点时, 先判断该结点是否包含问题的解。 如果肯定 不包含,则跳

39、过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进 入该子树,继续按深度优先策略搜索。回溯法是一种搜索算法, 其基本思路是: 在一个问题中, 根据题意给出的边 界条件划定出所有可能解的范围(称为可能解) ,根据题意确定出约束条件。利 用程序顺次在所有可能解中搜索时按照深度搜索的方式进行。 即在第一层选定一 个满足约束条件的解, 然后以该可能解为出发点, 搜索第二层的一个可能解 (试 探)。如果搜索到第二层的一个可能解,则继续搜索第三层得一个可能解。依次 类推,直到所有层得可能解都被找到, 则得到了该问题的一个完整解。 如果第二 层所有的肯可能解都不满足约束条件, 则返回第一层, 放弃原

40、有的可能解, 使用 第一层的下一个可能解(回溯) 。一次类推,寻找第二层的一个可能解。回溯法相对于其他穷举的特点在于, 不必把问题的每一层的所有可能解都遍 历一遍, 只要当前的可能解不满足约束条件就抛弃该解, 寻求下一个可能解, 而 不必求解其余的下层解。 当当前层得所有可能解都不满足约束条件, 则回溯到上 一层,抛弃上一层的当前可能解。从以上分析中结合数独问题的规则,得出数独问题的约束条件为: 每一格的数值范围仅限 1-9每一格内的数字在当前行不允许重复 每一格内的数字在当前列不允许重复 每一格内的数字在当前小宫格内不允许重复 由此,回溯法通过约束条件的筛选, 在所有解中除掉不可能的解, 从

41、而获得 问题的一个或者全部解。3.3.2 检测填充结果根据数独游戏的规则, 玩家填充 81个宫格之后,要满足所有行, 所有列和 所有小九宫格内不能出现重复的数字,并以此为条件进行检测。列检测首先对各列进行检测,提供了检测列内 9 个数字是否有重复数据的方法 checkLine () ,该方法以此遍历列中的 9 个数字,当遍历到某个数字时,检 测该数字后面的数字是否出现重复。 比如, 当检测到第 3 个数字是 7 时,则检测 第 4-9 个数字是否出现 7,如果出现重复则停止检测, 只有既可以避免重复检测, 又可以避免遗漏。public boolean checkLine(int col)/检查

42、列是否符合要求for(int j = 0;j < 8;j+)if(njcol = 0)continue;for(int k =j + 1;k< 9;k+)if(njcol = nkcol)return false;return true;行检测类似于对列数据的检测, 还需要对每行进行检测, 因此程序提供了对行数据 的检测方法 checkRow () ,该方法代码如下: public boolean checkRow(int row)/ 检查行是否符合要求f or(int j = 0;j < 8;j+)if(nrowj = 0)continue;for(int k =j + 1

43、;k < 9;k+)if(nrowj = nrowk)return false;r eturn true;小九宫格检测除了对行和列的重复数据检测之外, 还需要对小九宫格内的所有数字进行检测,避免出现重复现象。检测原理与行,列检测相同,但需要计算九宫格内数字的位置。Row和Col指定了检测九宫格的位置,数独单元格中一共有3X3个九宫格,Row和Col的范围为0到2。用以下程序完成九宫格内重复数字的检测。public boolean checkNine(int row,int col)检查 3X3区域是否符合要求int j = row/3*3;/ 获得左上角的坐标int k = col/3*

44、3;for(int i = 0;i < 8;i+)/循环比较if(nj + i/3k + i % 3 = 0)continue;for(int m = i+ 1;m < 9;m+)if(nj + i/3k + i % 3 = nj + m/3k + m % 3)return false;return true;3.4 游戏的测试和运行3.4.1 游戏测试概述当游戏软件制作完成之后, 为了验证本游戏是否存在缺陷、 能否达到预期的 设计标,我们还需要在预设环境 (如: 模拟环境或真实移动终端设备 )中进行调试 和运行,以发现游戏中可能存在的问题和不足、 解决这些缺陷, 从而完善软件功

45、能并进而提升产品质量。 作为软件测试的重要组成部分, 游戏测试具备软件测试 的一切共同特性, 但由于游戏本身又具有一定的特殊性, 因而游戏测试主要由两 个部分组成:(1) 传统的软件测试由于测试是软件开发过程中极为重要的组成部分, 因而针对软件本身的测试 贯穿于软件存在的整个生命周期。 首先,程序员需要在程序设计开发过程中按阶 段对产生的模块集中测试, 以保证系统各模块能实现各自的功能, 在此阶段软件 的测试一般主要集中在程序的细节部分。当软件制作开发出来之后, 为保证软件整体的完善性, 还需要在软件工程理 论的指导下对整个系统进行测试, 这阶段的测试主要有黑盒测试和白盒测试。 所 谓黑盒测试

46、就是把要测试的对象当作一个黑盒子,不需要知道里面是怎么处理 的,只要对输入和输出数据进行测试, 这种测试方案属于高端测试, 主要是在操 作层面对游戏进行测试; 而白盒测试正好相反, 基于白盒测试的测试方案属于低 端测试,是对各种设计细节方面的测试, 测试者必须对测试对象的内部处理过程 非常了解, 对里面所有的分支和循环进行实验从而达到测试的目的。 在进行软件 测试的过程中, 测试人员应根据需要把墨盒和白盒测试有效的结合, 以达到发现 软件错误并进而完善软件的目的。(2) 对游戏性的测试 由于游戏特别是在很大程度上是对现实世界的一种模拟, 因而它不但包含了 人类社会的一部分特性, 同时还涉及娱乐

47、性、 可玩性等独有特点, 所以针对游戏 的测试还包括三个部分: 游戏情节的测试:主要是针对体现游戏主线的故事情节和游戏世界中的任 务系统等进行测试。 游戏世界的平衡测试: 平衡性主要体现在经济平衡、 能力平衡 (包含技能、 属性等等 ) ,测试的目的是为了能保证游戏世界的公平竞争。 游戏文化的测试: 比如整个游戏世界的风格, 是中国文化主导, 还是日韩 风格等等,大到游戏整体,小到 NPC对话,比如一个书生,他的对话就必需斯 文,不可以用江湖语言。目前在游戏开发过程中,对游戏性的测试主要有以下几种实现途径 : 一是通 过内部测试人员对以下的三个方面进行测试, 由于他们往往都是经过精选而来的 职

48、业玩家, 对游戏有很深的认识, 因而也能较好完成游戏的测试目标; 二是邀请 一定数量的玩家或游戏媒体人员对外围系统进行测试, 其目的主要是测试游戏的 可玩性和易用性,及一些外围的 Bug ;三是通过大范围的内测和公测,让更多的 玩家进行试玩。3.4.2 测试环境本游戏的测试环境包括两种,一种是基于 Android 虚拟设备 AVD 的测试, 在测试之前,首先要创建一个 AVD在测试游戏时选用的是基于 An droid 2.3的 AVD。还有一种便是基于 Android 手机的测试,在测试之前,需要首先将游戏文 件夹下的 bin 目录下的游戏的 apk 文件通过数据线传到 Android 手机上, 然后 通过 Android 手机上的第三方文件浏览器找到需要安装的 apk 文件,即可安装。本人在基于 Android 手机的测试时, 选用的手机为 SONYWT19I, SONYWT19I 的主要参数为:主屏尺寸: 3.2 英寸;主屏色彩:彩屏, 1600 万色;主屏像素: 480X 320 像素(HVGA; CPU 高通 骁龙 Snapdragon MSM8255 1GHz 内存容量: 512MB RAM 1G ROM系统平台:Android2.3.3,可升级至更高版本。3.4.3 游戏运行结果在测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论