您的位置:首页 > 移动开发 > Unity3D

Unity中扫雷游戏的脚本编写

2013-07-30 16:46 411 查看
扫雷

1.首先写一个雷类:

每个雷对象代表游戏界面里的一个小方格,

这个类里需要有int型x和y来表示雷的坐标,

需要有int型num来表示该雷对象周围有几个雷,

需要有bool型isshow来表示该雷对象是否显示,

还需要有一个Rect型的rect来表示该雷对象的大小。

然后需要在其他脚本文件里访问这些类属性,所有需要为每个属性设置属性方法,用get和set。

最后需要为该类,写一个构造函数,用来初始化雷对象。

Public class Thunder



Private int x;

Private int y;

Private int num;

Private bool isshow;

Private Rect rect;

……//设置属性访问set,get

Public Thunder(int x, int y, int num, bool isshow, ) //构造函数初始化



……





2.还需要一个写一个控制类:

该类用于控制整个游戏元素,比如有多少个小方格,有多少个雷

这个类里需要有int型x和int型y来表示横着竖着各多少个方格,

需要有int型size来表示每一个小方格的大小尺寸,

还需要int型total来表示总共有多少个雷,

这些属性都应该是在游戏一开始就设置好的,不需要更改,所以需要都设置为常量const

Public class Control



Public const int x = 20;

Public const int y = 15;

Public const int size= 20;

Public const int total = 10



3.最后需要再写一个脚本文件:

1.在该脚本文件里首先需要用之前的雷类定义一个二维数组。

Public Thunder【,】 thunder = new thunder[Control.x, Control.y];

切记,这只是声明了一个二维数组,还需要重写一个函数(在start里调用)或者直接在start函数里用两重for循环为没个雷对象用构造函数初始化分配空间一下,这样才真正存在了这样的雷对象。

在这里我写一个函数

void create()

{

双重for循环调用构造函数初始化二维数组的每一个雷对象

}

2.在OnGUI函数里绘制游戏界面。

绘制界面的时候也需要用到双重for循环,循环上限分别是控制类Control.x,和Control.y然后在最里层调用GUI.Button(),第一个参数是个矩形直接用雷对象的rect属性即可,第二个参数是string类型,在这里可以先用空字符串代替,这样绘制过后,会在game 视图屏幕出现一块用按钮组成的矩形区域。

3.第三步就是该部雷了。

一个方格周围最多只有八颗雷,所以可以用9来标识这是个雷。

可以还在create函数里用一个for循环,循环上限是Control.total,调用随机函数random.range()来随机产生雷的坐标i,j,然后thunder【i, j].num = 9;可能随机的时候两次随机产生的坐标是一样的,这样就会造成雷的个数减少而非是Control.total,所以需要限制一下。可以在for循环里加上个do{这里是随机函数产生坐标的语句}while(thunder【i, j].num ==9),然后给thunder【i, j].num 赋值为9.

4.第四步就是判断已部好的雷的周围那八个格子里都该是几。

这也可以写成一个函数void check(int x, int y)有两个参数,表示的是雷的坐标,也就是thunder【i, j].num =9.中的i和j,很显然,该函数的调用发生在上一步布雷里,即for循环之外。如此以来,当i和j传到该函数里之后,显然需要检查的范围在x-1到x+1和y-1和y+1之间,很自然我们会想到用双重for循环来遍历雷周围的八个格子。

在这里有一个很重要的问题,就是当雷的坐标到了边边上的时候,即x=0或最大值,或y=0或最大值,这时候x-1,x+1,y-1,y+1都会发生越界的问题,所以在这里需要判断一下是否越界,这也可以写成一个独立功能的函数返回值应该是bool yuejie(int x, int y),而该函数的调用发生在check函数双重循环的最内层,为什么呢?因为要检查是否越界的坐标是雷周围的那八个格,这样一样直接传过来的参数就是最直接的判断,越界啥也不做,不越界的话,在用一个if判断thunder【i, j].num 是否为9,不为9的话,那么直接就可以thunder【i, j].num++。

这样第四步检查周围也完成了,整个游戏查不到做好,剩下的就是当你点中某一个格子(按钮)的时候,让它对应的数字显示出来。即第五步。

5.第五步剩下的就是当你点中某一个格子(按钮)的时候,让它对应的数字显示出来

这一步都应该在上面的OnGUI函数里,并且还应该放在双重for循环里,这个不需要多说吧。然后需要把第二步写好的GUI.button函数改一下,该在if()中,表示当鼠标按下去的时候{在这里将雷对象thunder【i, j].isshow置为true}表示可以将该对象中的数字即thunder【i, j].num显示出来。

之后我有用了一个if语句判断thunder【i, j].isshow,如果为真,表示可以显示就在这里面用GUI.button()画,同样两个参数,第一个参数不变,第二个参数应该改为thunder【i, j].num显示出按下格子的数字。之后考虑到到即使显示也要分情况,分是否等于0是否等于9,等于9的话很简单直接表示踩雷了,游戏结束。当不等于9也不等于0的时候要直接显示数字,所以可以直接写上面的GUI.button()语句,当不等于9等于0时其实是可以不显示0这个数字的(实际中就是没显示嘛,直接为空白)但是在这里需要做一步,当点中的是0的时候它会自动扩散开来,把不是雷的格子显示出来,直到边界或者遇到是非0数字停下来。这个功能应该放在if判断点中的是0 的语句里,为了清晰,可以把该功能独立成一个函数,然后在这里调用。这个函数我写成void showSide(int x, int y)同样两个参数,即是thunder【i, j].num为0的i和j,然后同样需要双重循环遍历该雷对象的周围,范围即x-1,x+1,y-1y+1

卡住了。。。写不下去了,睡觉去,明天继续,先传到群里大家做个参考吧,有不对的还请指正,谅解。。。

现在继续。。。

样需要双重循环遍历该雷对象的周围,范围即x-1,x+1,y-1y+1,同样需要进行是否越界的判断,也是在双重循环最内层,用if语句判断如果不越界,然后判断如果不等于9,在游戏里表示这些都是该自动扩散开来显示出来的,所以在if语句里将thunder【i, j].isshow置为true。到此该函数写完了,然后只是在上面提到的地方调用一下,调用完自然需要显示,在用GUI.button函数。第一个参数依旧,第二个参数因为这里判断的是0,在游戏里是不需要显示0的所以第二个参数可以用空字符串。0k。。。

对了,在上面判断9的位置,游戏里当点中是雷的时候会全部显示过来,所以可以在这里写一个函数并调用一下,函数里也需要用到双重for循环,并且用到GUI.button绘制,第一个参数依旧,主要是第二个参数:在里面判断是否为0,如果为0,则第二个参数可以是空的字符串,如果不为0,则需要照常显示它的字符,即thunder【i, j].num。(注意这个是个数字需要用到tostring()来转化成字符串,才可以用)。

OK,至此,扫雷游戏算是全部完成啦。总体思路也就这样子,可以参考一下。帮助理解。当然了,思路也可能有绕弯子,但是我脑子里就是这么想的,然后就这么写了,功能到也实现了。仅供参考……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: