开关灯游戏,又称为点灯游戏、灭灯游戏、翻转游戏。
游戏基本设置为:有m×n排的圆(或者正方形),将一个圆(或者正方形)视为一盏灯,灯只有亮、暗两种状态。当点击一盏灯时,会同时改变此盏灯及其相邻灯的状态。
当点亮所有灯(也有的设置为灭掉所有灯),则游戏过关。
示例
啊K尝试用GeoGebra制作了5×3的开关灯游戏,来看下效果:
“重新开始”按钮是做了随机开关灯的设置。所以,游戏的难易程度也是随机的。
另外,还顺手做了个关掉所有灯的按钮:
这个功能真的是顺手做的......
想玩这个游戏的话,请点击文末的“了解更多”,前往游戏,看看你能不能点亮所有灯!
若是对怎么制作这个游戏感兴趣,请接着往下看!
制作思路:
(有没有发现和很类似!)
下面开始制作!
一次性生成所有圆l1 = 扁平列表(序列(序列(圆周((i, j), 1), i, 1, 9, 2), j, 1, 5, 2))
注:扁平列表(Flatten)、圆周(Circle)。
构造独立的圆由于每个圆都有亮与暗两种状态,即在两种颜色间切换。“两”——考虑引入布尔值:假设为真时,显示黄色;若是假,显示成暗黄色。
■ 于是,需构造15个布尔值,即:
在单元格A1,输入:true;并下拉填充至A15。
■ 而独立的圆的构造,则:
在B1、B2处分别输入1、2,再选中B1、B2,下拉填充至B15。
在C1处,输入=元素(l1, B1)。
如果此时下拉C1进行填充,即可产生相应的独立的圆。不过——我们需要先输入C1的单击时脚本,再下拉填充,以保证得到的所有圆都有脚本!
问题来啦——圆的单击时脚本应输入什么,以保证可以改变本身及其相邻圆的颜色?
现在,布尔值A1,A2,……,A15对应的圆编号如下:
■ 根据开关灯的规则:在C1的单击时脚本输入如下六条指令,并下拉填充至C15。
下面进行解释
注:执行(Execute)、SetValue(赋值)、Row(行序)、If(如果)、Mod(余式)、SetColor(设置颜色)。
将上面的脚本拆开来看,我们一边找开关灯的规律,一边说明:
点击圆时,自身也会改变颜色,于是:
执行({"SetValue(A" Row(%0) ",!A" Row(%0) ")"})
除了点击第1、6、11个圆之外,它的前一个圆也会改变颜色。而1、6、11可看为除以5的余数为1,于是:
执行({"If(Mod(" Row(%0) ",5)!=1,SetValue(A" (Row(%0)-1) ",!A" (Row(%0)-1) "))"})
除了点击第5、10、15个圆之外,它的后一个圆也会改变颜色。而5、10、15可看为除以5的余数为1,,于是:
执行({"If(Mod(" Row(%0) ",5)!=0,SetValue(A" (Row(%0) 1) ",!A" (Row(%0) 1) "))"})
当点击第1至10个圆时,它后面的第五个圆也会改变颜色,于是:
执行({"If(1<=" Row(%0) " <=10,SetValue(A" (Row(%0) 5) ",!A" (Row(%0) 5) "))"})
当点击第6至15个圆时,它前面的第五个圆也会改变颜色,于是:
执行({"If(6<=" Row(%0) " <=15,SetValue(A" (Row(%0)-5) ",!A" (Row(%0)-5) "))"})
上面是改变相应的布尔值,而要设置颜色,还需要:
执行(序列("SetColor(C" k ",If(A" k ",%1,%2))",k,1,15), "黄色","#4e3a00")
完善按钮及其脚本如下:
至于文本,如下:
注:乘积(Product)。
text1是在所有布尔值都为真时,即,当A1×A2×……×A15不等于0,才显示。
结语5×3型的开关灯游戏就这么完成啦!当然也可以制作出其他类型的,关键在于找出规律——让相应的布尔值改变,结合执行指令与表格区,即可完成。
如需源文件,请回复:开关灯。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved