之前在日本夸张向竞技节目“头脑王”看过类似题目,就是3D砖块计数
总觉得一眼看出60~70个砖块的那家伙,数量感真是好啊
凡人如我要相信数量感可以训练,世界才会有光明与希望XD 所以就写了这个
edit: 包成cdf了 https://dl.dropboxusercontent.com/u/19027436/cubeEnu.cdf
理论上只需要 http://www.wolfram.com/cdf-player/ 就能执行
增加了一些功能,代码如下:
- - -
f[{x_, y_}] :=
Table[{Hue[.08, .8], Cuboid[{x, y, i}]}, {i, 1, array[[x, y]]}]
DynamicModule[{cap = 1},
Manipulate[
(*切换按钮自动刷新*)
Refresh[doRand, TrackedSymbols -> {难度, 均高}];
(*产生新随机方格的"副程式"*)
doRand := (array =
Transpose[ Sort /@ Transpose[Sort /@
RandomVariate[PoissonDistribution[均高 - 1],
If[难度 == "High", RandomChoice[{{4,7},{5,6},{7,4},{6,6},{6,4},{4,6},
{6,5},{5,5}}], RandomChoice[{{4, 4}, {3, 5}, {5, 3}, {3, 4}, {4, 3}}]]]
]]);
(*外观格式部分*)
Panel@Column[{Dynamic[Deploy@Graphics3D[
Flatten[f[#] & /@ Tuples[Range /@ Dimensions[array]], 1],
Lighting -> {{"Ambient", White}}, Boxed -> False,
ViewPoint -> {-RandomReal[{1.2, 1.8}], -RandomReal[{1.2,
1.8}], 1}, ImageSize -> Medium]],
Dynamic[Row[{Button[Style[cap /. {1 -> "答案", -1 -> "刷新"}, {24}],
If[cap == -1, doRand]; cap *= -1, FrameMargins -> Medium],
Panel[If[cap == -1, Total[Flatten@array], "xxx"]]},
Spacer[6]]]
}, Alignment -> Center], {均高, Range[2, 4]}, {难度, {"High", "Low"}},
SaveDefinitions -> True, Initialization -> doRand]]
- - -
已知quirk是开启第一次会自动运行一次Button内的代码,cap变成-1。
不妨,只要再按一次好了。
从这个小project中学到了
Manipulate, Refresh, TrackedSymbols, SaveDefinitions, Initialization
的用法。