Create a Simon Clone!
Scratch, 1604 – 125 = 1479
I'm here for the fun, not the golf.
Edit: updated scoring method based on community consensus.
Main program:
Individual sprites:
This is the sprite with number 0
. The other sprites have the same script, except the number.
Play with it online.
Code used for byte counting: (Using snippet to hide code)
when green flag clicked
set [s v] to [0]
delete (all v) of [a v]
forever
set [x v] to (pick random (0) to (3))
add (x) to [a v]
set [i v] to [1]
repeat (length of [a v] :: list)
broadcast (item (i) of [a v] :: list)
wait (0.3) secs
change [i v] by (1)
end
set [i v] to [1]
wait until <(x) = [4]>
end
when I receive [0 v]
play sound [0 v]
next costume
wait (0.3) secs
next costume
when this sprite clicked
broadcast [0 v]
wait (0.3) secs
if <[0] = (item (i) of [a v] :: list)> then
change [i v] by (1)
else
stop [all v]
end
if <(i) > (length of [a v] :: list)> then
set [x v] to [4]
change [s v] by (1)
end
when this sprite clicked
broadcast [3 v]
wait (0.3) secs
if <[3] = (item (i) of [a v] :: list)> then
change [i v] by (1)
else
stop [all v]
end
if <(i) > (length of [a v] :: list)> then
set [x v] to [4]
change [s v] by (1)
end
when I receive [3 v]
play sound [3 v]
next costume
wait (0.3) secs
next costume
when I receive [1 v]
play sound [1 v]
next costume
wait (0.3) secs
next costume
when this sprite clicked
broadcast [1 v]
wait (0.3) secs
if <[1] = (item (i) of [a v] :: list)> then
change [i v] by (1)
else
stop [all v]
end
if <(i) > (length of [a v] :: list)> then
set [x v] to [4]
change [s v] by (1)
end
when this sprite clicked
broadcast [2 v]
wait (0.3) secs
if <[2] = (item (i) of [a v] :: list)> then
change [i v] by (1)
else
stop [all v]
end
if <(i) > (length of [a v] :: list)> then
set [x v] to [4]
change [s v] by (1)
end
when I receive [2 v]
play sound [2 v]
next costume
wait (0.3) secs
next costume
Note: Code automatically generated using scratchblocks generator, modified as somehow the generator doesn't correctly handle decimal numbers (treating 0.3 as 0).
Screenshot:
Note: Please do not press two buttons within 0.3 seconds.
Bash 318 297 281 273 268 244 240-125=115
This is primarily a response to "Text probably won't work"; the following text-based bash script runs fine in Konsole
, gnome-terminal
etc. on my Ubuntu 14.04 machine. To create the regions of colour it sets the text background color. In fact, adding text makes the game more accessible to color-blind players. To make the game yet more accessible it reads the characters that the player needs to press (it assumes that espeak
is installed). It also assumes that the only file matching /d*/ur*/
is /dev/urandom
. For the regions of color to be of non-trivial size you probably want to set the text size to be quite large. Also if you want the regions of color to be quadrants, you have to run it in a terminal that is two characters wide.
To play press y, r, g or b as appropriate.
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
This solution contains two non-printable ESC characters. Although these ESC character appear in the preview, they seem to get deleted after submission, so the code above is a wrapper that generates and runs the golfed simon_golf.sh
.
See also the original ungolfed version, and the slightly more playable 256 byte version.
The screenshots below are when the yellow light is on and the player's score is 7. The screenshot on the right has been desaturated to simulate colour-blindness.
Mathematica, 409 - 125 = 284
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