ImageVerifierCode 换一换
格式:DOC , 页数:11 ,大小:211KB ,
资源ID:6654664      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6654664.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验五 扫雷游戏的实现.doc)为本站会员(ysd1539)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

实验五 扫雷游戏的实现.doc

1、闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚1上机实验须知实验名称:扫雷游戏的实现实验目的:利用二维编码方式编码地雷地图,然后基于二维地图实现扫雷游戏的各个部分的算法,最终实现扫雷游戏。实验环境:1)高档微机2)Windows 操作系统中文版3)Flash CS3 Professional 中文版实验原理:地图是许多游戏的重要组成。小游戏例如俄罗斯方块、各种棋类游戏、搬运工游戏等,大型游戏例如英雄无敌、魔兽争霸,无不与地图紧密关联。一般来说,游戏中的地图是由地图元件、编码数据和基于编码的算法三个部分组成。例如下图是已经完成的扫雷游戏的截图: 其地图(即游戏中的地板方块组合)的三个

2、部分分为为:地图元件、编码数据以及基于编码的算法地图元件就是游戏中的每个方块,它记录着是否有雷,位置所引,是否已经被打开,是否被插上旗帜以及是否爆炸等属性,状态和效果。可以采用角色设计思想设计。地图编码的作用其实是在地图元件与算法之间建立一个最简的沟通桥梁。我们可以基于编码方式设计算法,然后通过编码找到对应的元件,也可以从元件出发获取其编码值,然后用这个编码值参与算法过程。这里我们可以建立一个二维数组,每个数据项存储的是一个方块的引用。这样二维数组就是游戏的编码方式。一方面,我们可以基于二维数组的下标(即索引)找到每个方块,另一方面,我们还要在每个方块中定义变量 indexX 和 indexY

3、,用来记录其索引值,当方块触发了某个事件(如鼠标点击) ,就可以通过读取这个方块的索引值从而确定它在二维数组中的位置。好的地图编码方式应该是即满足记录数据的需要,又是最简的。经验证明,二维数组是行之有效又简单的地图编码方式。基于二维编码上的扫雷算法包括: 编码与索引 布置雷区 随机分布地雷 闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚2 计算单元格周围雷数 无雷区自动扩张的设计 判断地雷是否已经全部扫除 人机交互部分的设计 设置难度级别 显示所有地雷详细介绍请看本章(第六章地图布置与地图相关算法)的 PPT 文档。实验内容:模拟实现类似于 Windows 自带的小游戏“扫雷” 。

4、可以手动地设置难度级别,或者干脆直接设置地图的尺寸,和地雷的数量,然后开始游戏。实验步骤:1) 制作方块角色很明显,扫雷游戏中的每一个方格,都是一个雷区单元角色的实例。这个雷区单元应该包含如下的成员:成员 成员描述discovered 是否被打开了haveMine 是否有地雷haveFlag 是否有旗帜i、j 雷区单元所在的位置各个界面 如未打开、显示地雷、爆炸、显示周围雷数等界面showMine() 显示地雷界面showExplode() 显示地雷爆炸界面showInit() 显示初始化时的界面showAround(num) 显示地雷被排除的界面flag() 显示/隐藏旗帜设计这样的一个雷区

5、方格角色,对我们来说,已经是轻车熟路,为了节省篇幅,这里忽略具体的实现。已完成的方块角色的每一帧的内容如下图所示:这些画面简单明了。第一帧有初始化代码:var discovered:Boolean=false;var haveMine:Boolean=false;var haveFlag:Boolean=false;var line:int,row:int;function showMine() discovered=true;gotoAndStop(4);function showExplode() 闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚3discovered=true;

6、gotoAndStop(5);function showInit() gotoAndStop(2);discovered=false;function showAround(num) discovered=true;gotoAndStop(num+6);function flag():Boolean if (haveFlag=true) gotoAndStop(2); else gotoAndStop(3);haveFlag=!haveFlag;return haveFlag;第二帧为默认的状态,时间轴应该停止在这一帧。代码:stop();至此我们已经完成这个角色的设计,在库中选中这个方块剪辑

7、,点击右键,选择“链接” ,将其链接为 Cell 输出。如下图所示:2) 布置场景扫雷游戏只有一帧。时间轴如图所示:闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚4界面内容如下图所示:其中各个文本框的实例名称分别为:txtLineCount 、txtRowCount 、txtMineCount 、txtMineLeft 。开始按钮的实例名称为:bt_start,预设下拉框的实例名称为:mode。预设下拉框内的数据选项为:自此完成了整个界面的设计。闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚53) 编写代码本游戏的所有代码都集中在第一帧上。其中的基本部分为:stop()

8、;var startx:Number=85;var starty:Number=62;var startTime:Date,endTime:Date;var len=360;var cellLength:Number;var lineCount:int;var rowCount:int;var mineCount:int;var mineLeft:int;var cells:Array;var result:String;var cellContainer:Sprite=new Sprite();mode.addEventListener(Event.CHANGE,setMode);bt_st

9、art.addEventListener(MouseEvent.MOUSE_DOWN,startGame);其中各种变量都是程序中要使用到的,通过 setMode 方法可以选择预设的游戏参数。通过startGame 进行游戏的初始化。startGame 是游戏的一个关键部分。其函数的定义如下:function startGame(e:MouseEvent) if (!init() return false;fillCells();/平铺方块setMines();/设置地雷activeCells();/激活地图自上而下,逐步细化程序,直到完成为止。完整的代码参考见附录。4) 测试程序,直到达到要

10、求为止。闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚6附录:本游戏的完整代码stop();var startx:Number=85;var starty:Number=62;var startTime:Date,endTime:Date;var len=360;var cellLength:Number;var lineCount:int;var rowCount:int;var mineCount:int;var mineLeft:int;var cells:Array;var result:String;var cellContainer:Sprite=new Sprite(

11、);mode.addEventListener(Event.CHANGE,setMode);bt_start.addEventListener(MouseEvent.MOUSE_DOWN,startGame);function setMode(evt:Event) switch (evt.target.value) case “1“ :txtLineCount.text=String(8);txtRowCount.text=String(8);txtMineCount.text=String(10);break;case “2“ :txtLineCount.text=String(14);tx

12、tRowCount.text=String(14);txtMineCount.text=String(35);break;case “3“ :txtLineCount.text=String(20);txtRowCount.text=String(20);txtMineCount.text=String(70);break;function startGame(e:MouseEvent) if (!init() return false;fillCells();/平铺方块setMines();/设置地雷activeCells();/激活地图function init():Boolean 闽江学

13、院教案课程名称Flash 游戏编程 任课老师: 肖刚7lineCount=int(txtLineCount.text);rowCount=int(txtRowCount.text);mineCount=int(txtMineCount.text);startTime=new Date();mineLeft=mineCount;txtMineLeft.text=String(mineLeft);if (lineCount40) return false;if (rowCount40) return false;if (mineCountlineCount*rowCount) return fal

14、se;cellLength=len/(lineCountrowCount?lineCount:rowCount);if (contains(cellContainer) removeChild(cellContainer);result=“playing“;return true;function fillCells() cells=new Array();cellContainer=new Sprite();for (var i=0; ilineCount*rowCount) return;var mineSet:int = 0;var i,j,k;while (mineSet=lineCo

15、unt) /超出上下边界continue;if (int_j=rowCount) /超出左右边界continue;if (cellsint_iint_j.haveMine =true) count+;if (cellsij.haveMine=true) /减去自身被统计进入的雷数count-;return count;闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚10function expand(i,j) /扩张无雷区var count=around(i,j);unaction(i,j);cellsij.discovered=true;if (cellsij.haveFlag=t

16、rue) mineLeft+;cellsij.showAround(count);if (count!=0) /非无雷区return;for (var int_i=i-1; int_i=lineCount) /超出上下边界continue;if (int_j=rowCount) /超出左右边界continue;if (int_i=i if (cellsint_iint_j.discovered=false) /未打开过,进入递归expand(int_i,int_j);function checkVictory():Boolean if (mineLeft!=0) /trace(0);retur

17、n false;for (var i=0; icells.length; i+) for (var j=0; jcellsi.length; j+) /trace(i,j,cellsii.haveMine,cellsij.haveFlag);if (cellsij.haveMine=true return false;/trace(2);闽江学院教案课程名称Flash 游戏编程 任课老师: 肖刚11return true;function unaction(i:int,j:int) MovieClip(cellsij).removeEventListener(MouseEvent.MOUSE_

18、UP,adjustClick);MovieClip(cellsij).removeEventListener(MouseEvent.MOUSE_WHEEL,flagCell);function unactionCells() for (var i=0; icells.length; i+) for (var j=0; jcellsi.length; j+) MovieClip(cellsij).removeEventListener(MouseEvent.MOUSE_UP,adjustClick);MovieClip(cellsij).removeEventListener(MouseEvent.MOUSE_WHEEL,flagCell);

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报