场景:编程时,您会突然怀念80年代和俗气的游戏。
要求:为游戏Simon制作一个GUI程序(文本可能不起作用)。输入可以单击,也可以按一个键。您应将屏幕分为4个区域:黄色,蓝色,红色,绿色。游戏开始时,随机颜色会亮起,然后将其激活。然后,两个指示灯点亮,一个接一个,接着您需要按顺序激活它们,依此类推。当您按错误的颜色时,游戏结束。
奖金:
如果包含声音,则为-100(按每个区域时以及游戏显示颜色时播放的音符不同)
-25(如果您包括得分计数器)。
场景:编程时,您会突然怀念80年代和俗气的游戏。
要求:为游戏Simon制作一个GUI程序(文本可能不起作用)。输入可以单击,也可以按一个键。您应将屏幕分为4个区域:黄色,蓝色,红色,绿色。游戏开始时,随机颜色会亮起,然后将其激活。然后,两个指示灯点亮,一个接一个,接着您需要按顺序激活它们,依此类推。当您按错误的颜色时,游戏结束。
奖金:
如果包含声音,则为-100(按每个区域时以及游戏显示颜色时播放的音符不同)
-25(如果您包括得分计数器)。
Answers:
这主要是对“文本可能不起作用”的回应;下面的基于文本的bash脚本运行在精Konsole
,gnome-terminal
我的Ubuntu 14.04的机器上等等。要创建颜色区域,它设置文本背景颜色。实际上,添加文本可使色盲玩家更容易访问游戏。为了使游戏更加易于使用,它会读取玩家需要按的字符(假定espeak
已安装)。它还假定唯一的文件匹配/d*/ur*/
是/dev/urandom
。为了使颜色区域的大小不重要,您可能希望将文本大小设置得很大。同样,如果您希望颜色区域为象限,则必须在两个字符宽的终端中运行它。
要播放,请按y,r,g或b。
cat <<"EOF"|sed s/E/`echo -e '\E'`/>simon_golf.sh;bash simon_golf.sh;wc simon_golf.sh
d(){ echo Ecx1r09mRx2g10mGx3y11mYx4b14mBx0m$s|sed s/.$1"//
s/[rgyb]..//g
s/x/E[48;5;/g";};x(){ d $c;espeak $c;d j;};l(){
for c in $o;{ eval $1;x;};};f(){ o=$o\ `tr -dc yrgb</d*/ur*|head -c1`
l;l 'read -n1 i;[ $c = $i ]||exit;let s++';f;};f
EOF
此解决方案包含两个不可打印的ESC字符。尽管这些ESC字符显示在预览中,但是它们似乎在提交后被删除,因此上面的代码是一个包装器,用于生成并运行golfed simon_golf.sh
。
下面的屏幕截图是当黄灯亮且玩家的分数是7时的屏幕。右侧的屏幕截图已被降低饱和度以模拟色盲。
我在这里是为了娱乐,而不是高尔夫。
编辑:基于社区共识的更新评分方法。
主程序:
个别精灵:
这是带有数字的精灵0
。除数量外,其他精灵具有相同的脚本。
在线玩。
用于字节计数的代码:(使用代码段隐藏代码)
注意:使用暂存器生成器自动生成的代码,修改为生成器无法正确处理十进制数字(将0.3设为0)。
屏幕截图:
注意:请勿在0.3秒内按下两个按钮。
k = 2;
p = Tuples[{0, 1}, 2];
f[c_, p_] :=
EventHandler[{c, Rectangle[p]},
"MouseClicked" :> (AppendTo[x, p]; Beep[]; g)]
h[R_] := (i = 1;
RunScheduledTask[
H = If[OddQ@i,
Beep[]; {EdgeForm[{Thickness[0.02], Black}], FaceForm[],
Rectangle@R[[Ceiling[i/2]]]}, {}]; i++, {.3, 2 Length@R}])
s := (m = 0; x = {}; h[R = RandomChoice[p, k]];)
g := (m++; If[Take[R, m] != x, k = 2; s, If[m == k, k++; s]])
Dynamic@Graphics[{MapThread[f, {{Yellow, Red, Blue, Green}, p}], H},
PlotLabel -> k]
s
$d={param($c)cls;sleep -m 99;'R','Y','Blu','Gre'|
%{Write-Host '#' -N -F "$(if($i%4-ne $c){'Dark'})$_";
$i++}};$b={param($c)&$d $c;[console]::Beep(($c+1)*99,700);&$d};
$m=@();$s=0;for(){$m+=0..3|Get-Random;$m|%{&$b $_};$m|%{
if((read-host)-ne $_){$s;exit}&$b $_};$s++;sleep 1}
我在这里添加了换行符以避免侧滚动,但是它作为一行使用,因此字符数没有换行符。
屏幕截图:
玩:
注释:
ZXBasic:422-100-25 = 297
这绝对算是80年代的怀旧气息...
ZXBasic使用FreeBASIC类型命令和ZX Spectrum BASIC的组合来允许循环和重复,然后将其转换为TZX格式以加载到Spectrum模拟器中。
此版本更改了边框(尽管屏幕上的图例显示了要按下的键)。它具有与原始Simon游戏相同的音符(http://en.wikipedia.org/wiki/Simon_%28game%29)。
d=0.5:s=0:l=1:t=1:n$="4261":dim m(4)=>{-8,9,1,4}
border 7
while l>0
cls:a$="":print at 1,1;"Level: ";t;at 2,1;"Score:";s::for i=1 to 4:print at 0,i;paper val(n$(i));ink 0;i:next
for i=1 to t
c=1+int(rnd*4)
border val(n$(c)):beep d,m(c):border 7
a$=a$+str(c)
next
print at 10,1;"your turn"
p$="":i=1
do
pause 100:k$=inkey:print at 6,i;k$
if k$=a$(i) then s=s+1:print at 2,7;s:beep d,m(val(k$)):i=i+1
else l=l-1:i=t+1:print "bad luck!"
end if
loop until i>t
t=t+1:pause 25
end while
HTML + Js版本太肿了。
通过Web Audio API播放声音。
音符的频率也应该是原始西蒙的音符,颜色和颜色位置。
这里有一个在线演示:http : //www.dantonag.it/miniSimon.html。在兼容Web Audio的浏览器中运行(至少Chrome和Firefox,IE不支持,AFIAK)。
<html><script>
var hc=["#0f0","red","#ff3","blue"],lc=["#090","#930","#cc0","#33c"],nt=[391,329,261,195],ln=[],qpos=0,pm=0,x,ct=new AudioContext;function ps(a,d){var b=ct.createOscillator();b.frequency.value=d;b.connect(ct.destination);var c=ct.createGain();b.connect(c);c.connect(ct.destination);c.gain.value=-.5;x[a].style.backgroundColor=hc[a];b.start(0);setTimeout(function(a,b){a.stop(0);x[b].style.backgroundColor=lc[b]},500,b,a)}
function w(a){2==pm&&(a!=ln[qpos]?(pm=3,document.getElementsByTagName("span")[0].innerHTML="game over!",ps(a,156)):(qpos++,ps(a,nt[a]),qpos>=ln.length&&(pm=qpos=0)))}function ml(){if(0==pm)document.getElementsByTagName("div")[0].innerHTML=ln.length,ln.push(Math.floor(4*Math.random())),pm=1;else if(1==pm){var a=ln[qpos];qpos<ln.length?(ps(a,nt[a]),qpos++):(qpos=0,pm=2)}setTimeout(ml,500)}window.onload=function(){setTimeout(ml,1);x=document.getElementsByTagName("td")};</script><div>0</div><table cellpadding=40><tr><td bgcolor=#090 onmousedown=w(0)><td bgcolor=#930 onmousedown=w(1)><tr><td bgcolor=#cc0 onmousedown=w(2)><td bgcolor=#33c onmousedown=w(3)></table><span></span>
我的战绩是15(我在这场比赛中表现很差)。你的是啥呢?