Project1

标题: 做一个多个开关配合开门的谜题……某火星思路 [打印本页]

作者: 迷糊的安安    时间: 2012-10-18 14:26
标题: 做一个多个开关配合开门的谜题……某火星思路
其实也是很久以前就有的思路 突然想到了 所以就帖一下

例如我们在游戏的某个地方 需要正确地处理8个拉杆开关的状态

例如把第1、4、7、8个开关置为【上】,其他为【下】,门才会打开。
制作这种谜题通常我们的第一想法是利用8个开关分别判断,然后用很多层的分歧条件来判定,当开关1、4、7、8开、开关2、3、5、6关的时候,门打开。
于是这样就费掉了8个开关,还写了好大一版分歧条件。看起来很乱,对不对?

其实 可以用1个变量来解决的。等等……你是不是想到了什么?
如果开关1=1 开关2=2 开关3=3 开关4=4……那么是不是判定变量=1+4+7+8=20的时候,门打开就行了?
很好,沾边了,但是这样如果开关2、3、7、8打开的话,同样会让判定变量=20,门也会开,这样就混淆了。
于是我们需要用另外一种方法来编写这个判定变量。不能简单地把每个开关对应的数字就定位12345678。

于是我们换种方法
开关1=1
开关2=10
开关3=100
开关4=1000
开关5=10000
开关6=100000
开关7=1000000
开关8=10000000
这样这八个数字无论怎样相加也不会重复。
于是相应的第一个拉杆开关事件可以编写为
事件页一:
判定变量 加上 1
独立开关A 开启
事件页二——独立开关A开启时出现:
判定变量 减去 1
独立开关A 关闭

后面的开关就把1换成10、100、1000、10000……
最后判断变量=1+1000+1000000+10000000=11001001的时候,门就打开。
是不是节省了8个开关还有一大堆分歧条件判定?
唯一的问题是…… 10000000这个数字是不是太大了?
仔细看看这些数字的特点——
1 是10的0次方
10 是10的1次方
100 是10的2次方
1000 是10的3次方
……看出什么了吗?

于是这样,我们设置个小一点的底数2,然后把10的次方换成2的次方,来计算开关开启的情况。
开关1 = 1
开关2 = 2
开关3 = 2×2 =4
开关4 = 2×2×2 = 8
……
开关5 = 16
开关6 = 32
开关7 = 64
开关8 = 128
如果要开关1、4、7、8打开,那么只要判定变量=1+8+64+128=201的时候,判断门打开就行了。
这样实际是利用了一种二进制计数法的思想。
不信的话 用计算器把201转化成二进制 看看是不是写作11001001?嗯?

貌似以前在某个帖子里稍微提了一下,然后yff还回帖说是位运算什么来着……汗……总之应该是很火星的思路了……
于是还是来抛玉引砖一下吧……(顶锅盖逃)
作者: Password    时间: 2012-10-18 14:29
其实看到一半我就知道是用的二进制……
作者: 迷糊的安安    时间: 2012-10-18 14:31
Password 发表于 2012-10-18 14:29
其实看到一半我就知道是用的二进制……

= =~ 话说现在中学数学课学二进制么……
作者: 天使喝可乐    时间: 2012-10-18 14:51
用这么麻烦吗……
变量a初始为0 1-8开关全为“下”的状态

1 4 7 8 的开关 点一下(“上”)效果为 a+1 再点一下(“下”) a-1
2 3 5 6 的开关 点一下(“上”)效果为 a-1 再点一下(“下”) a+1

最后变量等于4时开关打开
作者: Luciffer    时间: 2012-10-18 16:02
@protosssonny参照上次我提到的那个数字模型
作者: 怪蜀黍    时间: 2012-10-18 17:22
P叔也来“抛玉引砖”一下
  1. $game_switches[1]=[0,0,0,0,0,0,0,0]
复制代码
如果开关1、2、3、4、5、6、7、8打开则分别操作对应的元素为1,关闭就令对应的元素为0:
  1. $game_switches[1][0] = 1
  2. $game_switches[1][1] = 1
  3. $game_switches[1][2] = 1
  4. $game_switches[1][3] = 1
  5. $game_switches[1][4] = 1
  6. $game_switches[1][5] = 1
  7. $game_switches[1][6] = 1
  8. $game_switches[1][7] = 1
复制代码
如果1、4、7、8打开则使用事件法条件分歧判断:

作者: 一瞬间的幻觉    时间: 2012-10-18 17:24
在某个英文系统的ARPG里面,第三个延时中有用到这样的思路
生活中不会缺乏创意,只会缺乏发现创意的眼睛

安安加油
作者: fxwd    时间: 2012-10-18 17:44
说实话这样还不如开关啊,设置变量还要输好多数字,开关点一下就可以了。。。(伸手党逃之~)
作者: fxwd    时间: 2012-10-18 17:48
迷糊的安安 发表于 2012-10-18 14:31
= =~ 话说现在中学数学课学二进制么……

应试教育的强大~信息学的。。
作者: feizhaodan    时间: 2012-10-18 18:23
flags
フラグテーブル。各種フラグを格納した一次元配列 (Table) です。

タイル ID を添字として取ります。各ビットの対応は以下の通りです。

0x0001 : 下方向通行不可。
0x0002 : 左方向通行不可。
0x0004 : 右方向通行不可。
0x0008 : 上方向通行不可。
0x0010 : 通常キャラの上に表示。
0x0020 : 梯子。
0x0040 : 茂み。
0x0080 : カウンター。
0x0100 : ダメージ床。
0x0200 : 小型船通行禁止。
0x0400 : 大型船通行禁止。
0x0800 : 飛行船着陸禁止。
0xF000 : 地形タグ。
ビット演算に関してはこのマニュアルでは解説していませんが、C 言語などと共通です。必要な場合は、インターネットにて「16 進数 ビット演算」等のキーワードで検索することをお勧めします。

RM其实已经先我们很多了(大雾
作者: 死基老    时间: 2012-10-18 21:52
打开是 “1”,关闭是“0”,默认是全0 ,然后判断 所得的字符串(连接),当然最好预先知道有几个开关




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1