




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告课程名称: 移动计算技术与应用 设计题目: 疯狂扫雷 院 系: 专 业: 班级: 学 号: 姓 名: 指导教师: 设计地点: 开课时间: 2011 至 2012 学年第 2 学期常熟理工学院计算机科学与工程学院 制学生姓名 手写签名 成绩 评语: 指导教师(签名) 年 月 日目录1. 设计目的和任务12. 开发环境12.1硬件环境12.2软件环境13. 设计课题13.1课题名称13.2课题详细描述13.3功能介绍14. 相关技术及知识点25. 技术与实现25.1设计与实现描述25.2程序功能实现截图25.3程序实现55.4测试应用程序176. 总结177. 参考资料1701. 设计目的和任务众所周知扫雷游戏是附带在Windows操作系统中的小游戏,它通过点击格子并以出现的数字来判断附近地雷的数量,将全部地雷做上标记即可胜利。我们一般接触的扫雷都是基于 PC 平台的,现在手机游戏那么普遍,手机版本的扫雷却一直没有得到流行,何不让这款休闲智力游戏在我们手中也能游戏呢?于是我们基于电脑版本的扫雷原理,编写了一款手机版本的扫雷,这就是我们这次项目的目标及任务,手机版本的扫雷玩起来更方便,随时随地都可以扫雷,使得这款游戏不只局限于电脑,这也方便了各位爱好扫雷的玩家们。2. 开发环境2.1硬件环境装有Windows XP的计算机一台设备齐全的实验室用于测试的手机一台2.2软件环境操作系统:Windows XP 或 Windows 7开发平台:NetBeansIDE6.5.1或以上版本辅助软件:WirelessToolkit2.5.23. 设计课题3.1课题名称疯狂扫雷(手机版扫雷游戏)3.2课题详细描述具体的设计思路参照于微软公司所出的 PC 版本的扫雷,只是我们实现的语言采用了手机易于识别的 Java。手机版本的扫雷功能与微软公司所出的电脑版本很相似,这也方便了玩家,不需要在操作习惯上做太大的改变,因此适应性很强。基本功能:点击格子并以出现的数字来判断附近地雷的数量,将全部地雷做上标记即可胜利。其次还可以进行闯关竞技。最后还可以实现雷区的随机分布功能。3.3功能介绍游戏设计为关卡式,每过一关并进入下一关,游戏的难度也会随之加大。点击格子得到数字来判断周围的地雷数,找到所有雷并做上标记(小旗)即胜利(雷区以红色填充格表示)。点击数字“1”标记地雷,数字“3”显示游戏状况,数字“5”确定,点击“0”重新开始游戏或进入下一关。4. 相关技术及知识点调用paint函数绘制游戏方格MIDlet:运用MIDlet应用程序实现入口,控制屏幕和命令数组:根据游戏逻辑,产生一个10行10列的二维数组,并与界面的100个位置相对应游戏API:运用游戏API中的GameCanvas类扩展MIDPCanvas类,提供游戏的基本接口5. 技术与实现5.1设计与实现描述在设计功能时,我们分别用了相应的函数来实现。首先扫雷游戏要有方格,因此必须有一个绘图函数绘出相应的屏幕方格,我们利用了 paint 函数来实现,在程序中,系统会自动调用该绘图函数,并传入绘图设备 g ,通过该设备,我们可以绘制如直线,矩形快,字符串,图片等。在完成绘图后,我们需要让系统随机产生雷区,这就需要编写一个“布雷”函数,利用 rand 随机 mine_num 个雷的位置,并利用相应的语句实现 X、Y 数值的随机确定。布完雷后,便要编写函数,如何识别键盘的输入指令,于是我们编写了 keyPressed ,通过该函数,系统可以自动调用该函数,当有键盘事件发生为按下某键,参数 key 为按下键的键值,并通过函数里面具体的语句来判断该数值的具体含义,以便作相应的处理。在具体的扫雷过程中,利用 boolean isWinGame 来进行红旗的标记。标记完后,应该在屏幕上显示出相应位置雷区数量的提示,这就用到了showMap,该函数是一个递归函数,把当前位置设置成显示,并判断当前位置雷数是否为 0 个,如果是 0 个雷,那么它周围的 8 个格子都要再作一次 showMap。如果闯关成功,就会进入到下一关。如果不成功,就会重新开始。这些功能都通过 rePlay 函数来实现。闯关成功,rePlay 就会自动增加雷区数量,加大游戏难度。5.2程序功能实现截图(1) 运行程序,按数字“3”看到的界面(图5.2.1): 图5.2.1(2) 游戏失败界面(图5.2.2): 图5.2.2(3) 游戏胜利,进入下一关(图5.2.3): 图5.2.3(4) 游戏第二关(每闯一关,界面变大,难度加大图5.2.4): 图5.2.45.3程序实现程序包括两个类:Game.java 和 Minesweeper.javaGame.java:import java.util.Random; /得到随机函数import javax.microedition.lcdui.*; /写界面所需要的包class Game extends Canvas /游戏状态 private static final int STATEPLAY = 0; /游戏中 private static final int STATELOST = 1; /游戏失败 private static final int STATEWIN = 2; /游戏胜利 /格子状态 private static final int MINE_OFF_SHOW = 0;/不显示格子中雷的数 private static final int MINE_ON_SHOW = 1; /显示格子中雷的数 private static final int MINE_ASK = 9; /设置问号 private static final int MINE_FLAG = 10; /设置红旗 private static final int MINE_GUESS_ERR = 11; /显示猜错了 /定义键值 private static final int KEY_UP = 1; /上 private static final int KEY_DOWN = 2; /下 private static final int KEY_LEFT = 3; /左 private static final int KEY_RIGHT = 4; /右 private static final int KEY_FIRE = 5; /中间确认键 public static Random rand; /随机数对象 private int map_x = 10; /雷区行数 private int map_y = 10; /雷区列数 private int map_w = 20; /一个雷区的格子的宽度 private int map_h = 20; /一个雷区的格子的高度 private int key_x = map_x / 2; /游戏初始时光标所在雷区的格子位置 private int key_y = map_y / 2; /游戏初始时光标所在雷区的格子位置 private int mine_num= 10; /雷区的雷数不应该大于雷区的格子总数 private int flagNum = mine_num; /剩余红旗数 private int rightNum= 0; /猜对的雷数 private int map; /雷区的地图数组 =10 为雷, 10 为周围的雷数, 0 为附近没有雷 private int map_show; /雷区的地图数组是否显示该位置的雷数/1 显示/0 不显示/9 问号/10 红旗 private int gameState = STATEPLAY; /游戏状态 private int s_width = 0; /屏幕尺寸 宽 private int s_height = 0; /屏幕尺寸高 private int addMine = 0; /重新开始后雷数增加的个数 private boolean isShowInfo = false; /是否显示游戏信息 private String strFlagNum = 红旗数; private String strMineNum = 正确率; private String gameInfo = 游戏中,游戏失败按 0 重新开始,游戏胜利按 0 进入下一关; private Font font = Font.getFont( Font.FACE_SYSTEM,Font.STYLE_BOLD, Font.SIZE_LARGE ); Game() setFullScreenMode(true); /设置游戏为全屏幕模式,该函数只能在支持 midp2.0 的手机上使用 s_width = getWidth(); /得到屏幕尺寸 s_height= getHeight(); /得到屏幕尺寸 rePlay( 0 ); /游戏初始化/重新游戏 /* */* *系统自动调用该绘图函数,并传入绘图设备g,通过该设备,我们可以绘制如直线,矩形快,字符串,图片等, */ public void paint(Graphics g) g.setClip(0,0,s_width,s_height); /设置参数描述的区域为操作区 g.setColor(0x000000); /设置颜色为黑色,三个 16 进制数表示,RGB,如 0x00ff00为绿色 g.fillRect(0, 0, s_width, s_height); /绘制一个实心矩形区域 g.setColor(0xFFFFFF); /设置颜色为白色 /绘制雷区 for( int i=0; i=map_y; i+ ) / | | /画 map_y+1 条竖线 g.drawLine(i*map_w, 0, i*map_w, map_h*map_x); for( int i=0; i=map_x; i+ ) / = /画 map_x+1 条横线 g.drawLine(0, i*map_h, map_y*map_w, i*map_h); for( int i=0; imap_x; i+ ) for( int j=0; jmap_y; j+ ) if( map_showij = MINE_ON_SHOW ) /遍历地图数组看该位置的雷数是否应该显示 if( mapij=0 ) /周围没有雷 g.setColor(0x666666); g.fillRect(j*map_h+2,i*map_w+2,map_w-3,map_h-3); else if(mapij10) /显示周围的雷数 g.setColor(0x666666); g.fillRect(j*map_h+2,i*map_w+2, map_w-3,map_h-3); g.setColor(0x00ff00); g.drawString(+mapij, j*map_h+8,i*map_w+4, g.LEFT|g.TOP); /显示该位置的雷数 else /踩到雷了 g.setColor(0xff0000); g.fillRect(j*map_h+2,i*map_w+2,map_w-3,map_h-3); else if( map_showij = MINE_FLAG ) /显示红旗 paintFlag( g, j, i ); else if( map_showij = MINE_ASK ) /显示问号 paintInterrogation( g, j, i ); else if( map_showij = MINE_GUESS_ERR )/显示猜错 g.setColor(0x666666); g.fillRect(j*map_h+2, i*map_w+2,map_w-3,map_h-3); paintGuessErr( g, j, i ); g.setColor(0xFF0000); /设置颜色红 g.drawRect(key_x*map_w+1, key_y*map_h+1, map_w-2, map_h-2);/绘制一个空心矩形框/为光标 g.drawRect(key_x*map_w+2, key_y*map_h+2, map_w-4, map_h-4);/绘制一个空心矩形框/为光标 if( isShowInfo | gameState != STATEPLAY ) /如果游戏结束 g.setFont( font ); g.drawString( strFlagNum+:+flagNum, 20, s_height-60,g.LEFT|g.TOP ); /显示剩余旗数 g.drawString( strMineNum+:+rightNum +/+ mine_num,20, s_height-45, g.LEFT|g.TOP ); /显示正确率猜对雷数/总雷数 g.drawString( gameInfo gameState , 20, s_height-30,g.LEFT|g.TOP ); /显示游戏状态 /* */* *系统自动调用该函数,当有键盘事件发生为按下某键,参数key为按下键的键值 */ public void keyPressed(int key) key = Math.abs(key); System.out.println(key=+key); /上下左右为移动光标事件,只需要调整光标位置即可,但需要做边界判断 switch( key ) case KEY_NUM2: case KEY_UP: if( gameState != STATEPLAY ) /如果游戏没结束/结束了就不做确认键操作了 break; else key_y-; if( key_y0 ) key_y = map_x-1; break; case KEY_NUM8: case KEY_DOWN: if( gameState != STATEPLAY ) /如果游戏没结束/结束了就不做确认键操作了 break; else key_y+; key_y %=map_x; break; case KEY_NUM4: case KEY_LEFT: if( gameState != STATEPLAY ) /如果游戏没结束/结束了就不做确认键操作了 break; else key_x-; if( key_x=10 )/如果雷数=10为雷, isWinGame(); addMine = 0; isShowInfo = true; gameState = STATELOST; /游戏失败 break; case KEY_NUM1: /设置红旗/问号/取消 if( gameState != STATEPLAY ) /如果游戏没结束/结束了就不做确认键操作了 break; switch( map_showkey_ykey_x ) case MINE_OFF_SHOW: map_showkey_ykey_x = MINE_FLAG; flagNum-; if( flagNum = 0 ) if( isWinGame() ) addMine = 5; isShowInfo = true; gameState = STATEWIN; else addMine = 0; isShowInfo = true; gameState = STATELOST; break; case MINE_FLAG: flagNum+; map_showkey_ykey_x = MINE_ASK; break; case MINE_ASK: map_showkey_ykey_x = MINE_OFF_SHOW; break; break; case KEY_NUM3: /是否显示游戏信息 isShowInfo = !isShowInfo; break; case KEY_NUM0: /当按下数字键 0 rePlay( addMine ); /重新开始游戏 break; /* */* *重新执行 paint()但该函数是立刻返回,也就是说他不会等待paint()执行完毕就返回了, *如果需要 paint()执行完毕才返回,可以使用serviceRepaints(),也可以两个都是用 * repaint()应该在 serviceRepaints()之前. */ this.repaint(); /本例为键盘事件驱动,刷新函数也就是每次按下键盘才作 boolean isWinGame() boolean isWin = true; for( int i=0; imap_x; i+ ) for( int j=0; jmap_y; j+ ) if( map_showij = MINE_FLAG ) /显示红旗 if( mapij g.drawLine( x+5, y+2 , x , y+ 4 ); / x += 1; y += 1; g.drawLine( x , y , x , y+11 ); / | g.drawLine( x-5, y+11, x+4, y+11 ); / - g.drawLine( x , y , x+5, y+ 2 ); / g.drawLine( x+5, y+2 , x , y+ 4 ); / void paintInterrogation( Graphics g, int key_x, int key_y ) int x = key_x*map_h+8; int y = key_y*map_w+5; g.setColor( 0xFF0000 ); g.drawString(?, x, y, g.LEFT|g.TOP); / ? void paintGuessErr( Graphics g, int key_x, int key_y ) int x = key_x*map_h+8; int y = key_y*map_w+5; g.setColor( 0xFF0000 ); g.drawString(x, x, y, g.LEFT|g.TOP); / x /该函数是一个递归函数,把当前位置设置成显示,并判断当前位置雷数 /如果是 0 个雷,那么它周围的 8 个格子都要再作一次 showMap void showMap(int x, int y) if( map_showxy = MINE_FLAG ) return; if( map_showxy = MINE_ON_SHOW ) return; else map_showxy = MINE_ON_SHOW; if( mapxy = 0 ) if( x-1 = 0 ) showMap( x-1, y ); if( y-1 = 0) showMap( x-1, y-1 ); if( y+1 = 0) showMap( x , y-1 ); if( y+1 map_y) showMap( x , y+1 ); if( x+1 = 0) showMap( x+1, y-1 ); if( y+1 0 ) map_x += 1; /雷区的行数 /10 - 15 map_y += 1; /雷区的列数 /10 - 12 if( map_x = 15 ) map_x = 15; if( map_y = 12 ) map_y = 12; addMine = 0; /每次增加的雷数 else add = 0; key_x = map_x / 2; /游戏初始时在雷区的格子位置 key_y = map_y / 2; /游戏初始时在雷区的格子位置 mine_num += add; /雷区的雷数应该大于雷区的格子总数 if(mine_num = map_x*map_y/2) mine_num = map_x*map_y/10; /纠正雷数不能超过雷区的格子数 flagNum = mine_num; /剩余红旗数 rightNum = 0; /猜对的雷数 gameState = STATEPLAY; map = new intmap_xmap_y; map_show = new intmap_xmap_y; rand = new Random( System.currentTimeMillis() ); /用事件作随机数种子的随机数 isShowInfo = false; /布雷 for(int i=0; i= 10) /如果该位置已经是雷了,就要重新布雷 i-; continue; mapxy = 10; /否则将该位置设定为雷 /并在该雷的周围的雷数都作+1 操作 /以下判断为边角判断,防止访问数组越界 if( x-1 = 0 ) mapx-1y += 1; if( y-1 = 0) mapx-1y-1 += 1; if( y+1 = 0) mapx y-1 += 1; if( y+1 map_y) mapx y+1 += 1; if( x+1 = 0) mapx+1y-1 += 1; if( y+1 map_y) mapx+1y+1 += 1; Minesweeper.java:public class Minesweeper extends MIDlet static Minesweeper s_midlet; /MIDlet类的静态对象,方便实用MIDlet 类方法 static Display s_display = null;/用来显示 Canvas static Game s_game = null; /Canvas 类对象,主要实现游戏的类 public Minesweeper() s_midlet = this; /* */* *程序开始系统会调用这个函数 *也有些手机可以把程序初始化部分放到构造函数里,这个地方应视手机的不同而定! */ public void startApp() if (s_display = null) s_display = Display.getDisplay(this);/创建 Display 对象,参数是MIDlet 类对象,也就是我们当前写的这个 Minesweeper 类 if (s_game = null) s_game = new Game(); /创建 Canvas 对象 s_display.setCurrent(s_game); /把Canvas对象设置成当前显示 else s_display.setCurrent(s_game); /* */* *程序暂停系统会自动调用这个函数,不是所有手机都支持 *手机在接到中断,如来电,来短信时候会调用这个函数,这个函数通常是空的 */ public void pauseApp() /* */* *程序关闭系统会调用这个函数,如果希望关闭程序的时候保存数据,可在这个函数里添加保存数据的方法 *比如游戏进行中,按了关机键,程序就会调用这个函数,也可以在程序中调用这个函数来结束游戏! */ public void destroyApp(boolean unconditional) notifyDestroyed(); 5.4测试应用程序将完成的扫雷游戏安装在测试手机上,安装成功,没有错误,由我们组员试玩游戏,游戏中未出现任何异常,宣告游戏开发成功。6. 总结7. 参考资料Java ME手机应用开发技术与案例详解 冼进 文杨著这本书以J2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 固定资产转让合同
- 劳务分包安全合同
- 儿童玩具购销合同书
- 工程装饰装修合同文书
- 木门签订合同协议怎么写
- 合同代保管协议
- 学术推广合同协议
- 石头加工合同协议
- 公寓楼转卖合同协议
- 员工解除合同协议书丢失
- DB21-T 3413-2021地下工程自防护混凝土结构耐久性技术规程
- 学校食品安全管理
- 2024年安徽六安城市建设投资有限公司招聘笔试参考题库含答案解析
- 无人驾驶除冰车研发及示范应用
- 痉挛性斜颈的物理治疗与按摩技术
- 团队沟通与协作培训
- 工作交接表表格模板
- 媒介的欺骗性:后图灵时代的人工智能和社会生活
- 老年专科护士准入(选拔)考试理论试题及答案
- 国开学习行为表现(通用11篇)
- 废气治理设施运行管理规程制度
评论
0/150
提交评论