Add 2020 source files for real
This commit is contained in:
1 parent
a3c1748648
commit
9d61fc0fb4
147 files changed
+32101
No files matched your search
@@ -0,0 +1,814 @@
|
||||
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional //EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta name="GENERATOR" content="mkd2html 2.2.2">
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"> <link rel="stylesheet"
|
||||
type="text/css"
|
||||
href="../hint.css" />
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<CENTER>
|
||||
<IMG SRC="/png/ioccc.png" ALT="IOCCC" height=78 width=267>
|
||||
<P><FONT size="6"><I>The International Obfuscated C Code Contest</I></FONT></P>
|
||||
<div id="bar">
|
||||
<ul>
|
||||
<li><a href="../index.html">About the 27th IOCCC</a></li>
|
||||
<li><a href="../whowon.html">27th IOCCC Winners</a></li>
|
||||
<li><a href="/index.html">IOCCC home</a></li>
|
||||
<li><a href="/winners.html">List of All Winners</a></li>
|
||||
<li><a href="/judges.html">The Judges</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<P><FONT size="6"><B>Supplemental Info</B></FONT></P>
|
||||
</CENTER>
|
||||
|
||||
|
||||
<p>Playing the game is very simple but because there are many different modes I
|
||||
have included much more than just the input keys and a few printouts of the
|
||||
game. For normal play you probably don’t even need this file at all unless it be
|
||||
for the input keys.</p>
|
||||
|
||||
<p><a name="toc"></a>
|
||||
1. <a href="#support">Testing terminal environment/capabilities</a>
|
||||
2. <a href="#input">Input keys</a>
|
||||
3. <a href="#gameplay">Gameplay</a>
|
||||
* <a href="#initial">The initial screen</a>
|
||||
* <a href="#playing">Playing the game</a>
|
||||
* <a href="#walls">Walls</a>
|
||||
* <a href="#cannibalism">Cannibalism</a>
|
||||
* <a href="#shedding">Stretching (shedding)</a>
|
||||
* <a href="#winning">Winning</a>
|
||||
* <a href="#quitting">Quitting</a>
|
||||
4. <a href="#modes">Gameplay modes</a>
|
||||
* <a href="#warning"><strong>Photosensitive epilepsy/Stimulation overload trigger warnings</strong></a>
|
||||
* <a href="#drawing">Drawing / Practice mode</a>
|
||||
* <a href="#auto">Computer playing / Automatic mode (<strong>Photosensitive epilepsy/Stimulation overload trigger</strong>)</a>
|
||||
* <a href="#auto-variations">Variations</a>
|
||||
* <a href="#grow-shrink">Grow-Shrink (Positive/Negative Winning) mode</a>
|
||||
* <a href="#hypnotic">Hypnotic / Sleepy mode (<strong>Photosensitive epilepsy/Stimulation overload trigger</strong>)</a>
|
||||
* <a href="#stim">Stimulation / Calming mode</a>
|
||||
* <a href="#other-ideas">Other ideas</a>
|
||||
5. <a href="#scripts">Scripts</a>
|
||||
* <a href="#colours">Colours selection</a>
|
||||
* <a href="#preset">Automate the above gameplay modes</a>
|
||||
6. <a href="#variables">Game variables</a>
|
||||
* <a href="#wait">WAIT - Snake speed</a>
|
||||
* <a href="#evade">EVADE - Bug evasion frequency</a>
|
||||
* <a href="#sizes">SIZE / MAXSIZE - Initial snake / max sizes</a>
|
||||
* <a href="#growth">GROW / SHEDS - Growth / Shedding sizes</a>
|
||||
7. <a href="#conclusions">Conclusion (and inspirational words for everyone)</a></p>
|
||||
|
||||
<h1>1. <a name="support" href="#toc">Testing terminal environment/capabilities</a></h1>
|
||||
|
||||
<p>Most people probably won’t have any issue at all but for those who have any
|
||||
problems with the terminal see the <a href="terminals.markdown">terminals.markdown</a> file for more
|
||||
information on the terminal capabilities testing utility I include.</p>
|
||||
|
||||
<p>For troubleshooting other problems see <a href="troubleshooting.markdown">troubleshooting.markdown</a>
|
||||
(<a href="troubleshooting.html">troubleshooting.html</a>) and <a href="bugs.markdown">bugs.markdown</a> (<a href="bugs.html">bugs.html</a>).</p>
|
||||
|
||||
<h1>2. <a name="input" href="#toc">Input keys</a></h1>
|
||||
|
||||
<ul>
|
||||
<li><p>Left, right, up and down <strong>arrow keys</strong>: Move that direction.</p></li>
|
||||
<li><p>‘q’ (and ‘Q’): Quit the game.</p></li>
|
||||
<li><p>Space (<code>' '</code>): Pause/resume the game (direction keys will also resume).
|
||||
Note that no other keys will resume the game; however if you press a key
|
||||
that <code>getch()</code> picks up on and the game is not paused then it will be as if
|
||||
you pressed the current direction key (assuming you already moved the snake).</p></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h1>3. <a name="gameplay" href="#toc">Gameplay</a></h1>
|
||||
|
||||
<p>Here I will show the initial screen as well as what a few things look like. If
|
||||
you don’t feel you need this but you want to configure colours jump to <a href="#colours">colour
|
||||
selection</a>. You can also jump to <a href="#modes">gameplay modes</a> or <a href="#variables">game
|
||||
variables</a>.</p>
|
||||
|
||||
<p>The bug colour by default is white; the snake head colour is red and the snake
|
||||
body colour is green. The walls are cyan.</p>
|
||||
|
||||
<h2><a name="initial" href="#toc">Gameplay: The initial screen</a></h2>
|
||||
|
||||
<p>When you load the game you will see a screen that looks something like the
|
||||
below. Note that the top line is the score/status line: the top wall is at line
|
||||
1 and the left wall is column 0. Below I use the coordinates in the X/Y order
|
||||
(ncurses is the opposite: Y/X). I will parenthesise the numbers below to refer
|
||||
to the number in the diagram:</p>
|
||||
|
||||
<pre><code> X:24/49 Y:8/16 S:5/658 B:0
|
||||
##################################################
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# + #
|
||||
# #
|
||||
# * #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<ul>
|
||||
<li><p>The snake (<code>+</code>) is at (24),(8). The bug char is <code>*</code> and the wall char is
|
||||
<code>#</code>. When the snake moves the head will be an arrow facing the direction it
|
||||
is moving; the body is ‘o’.</p></li>
|
||||
<li><p>The top wall is always line (1), the left wall is always column (0), the
|
||||
bottom wall is line (16) and the right wall is column (49). If walls are
|
||||
impassable and you run into any of these the game is over (you can slither
|
||||
at the edge of the wall); else you’ll come out the opposite side.</p></li>
|
||||
<li><p>The snake size is (5): but until you start to move it’s technically 1 (even
|
||||
if you set <strong>SIZE=0</strong> this applies). This is so that you can decide which
|
||||
direction from the centre of the screen. By default the head colour is red;
|
||||
the body is green. The snake will grow by one until it reaches the right
|
||||
size.</p></li>
|
||||
<li><p>The maximum snake size is (997): this is the default; it can be changed but
|
||||
it will always have an upper limit depending on the terminal size.</p></li>
|
||||
<li><p>The number of bugs eaten so far is 0.</p></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2><a name="playing" href="#toc">Gameplay: Playing the game</a></h2>
|
||||
|
||||
<pre><code> X:39/49 Y:8/16 S:5/658 B:0
|
||||
##################################################
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# oooo> #
|
||||
# #
|
||||
# * #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>I let the snake grow to its full size (with the head at (39),(8)) and I’m two
|
||||
places above the bug so let’s go down:</p>
|
||||
|
||||
<pre><code> X:39/49 Y:9/16 S:5/658 B:0
|
||||
##################################################
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# oooo #
|
||||
# v #
|
||||
# * #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>Now you see that the snake is going down and in one move the bug will be eaten.
|
||||
Let’s do that:</p>
|
||||
|
||||
<pre><code> X:36/49 Y:10/16 S:10/658 B:1
|
||||
##################################################
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# * #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# ^ o #
|
||||
# oooo #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>Observe that the bug was eaten and a new bug spawned elsewhere. I went left
|
||||
three and then up one and could slither on to the bug.</p>
|
||||
|
||||
<h1><a name="walls" href="#toc">Gameplay: Walls</a></h1>
|
||||
|
||||
<p>By default walls are passable (<strong>WALLS=1</strong>). Let’s get to full size and go
|
||||
through the top wall:</p>
|
||||
|
||||
<pre><code> X:36/49 Y:15/16 S:10/658 B:1
|
||||
##################################################
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# * o #
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# ^ #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>There you can see I have grown to the full size and went through the top wall;
|
||||
the head is now at the opposite wall. Continuing:</p>
|
||||
|
||||
<pre><code> X:36/49 Y:11/16 S:10/658 B:1
|
||||
##################################################
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# * o #
|
||||
# o #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# ^ #
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>I might then have turned to the left and then shortly go up to get the bug. This
|
||||
goes on until you lose, quit or win the game.</p>
|
||||
|
||||
<p>When you specify <strong>WALLS=0</strong> the walls become an obstacle that end the game. It
|
||||
might look like (I set the starting size to 150 and had only just started):</p>
|
||||
|
||||
<pre><code> X:20/49 Y:2/16 S:150/658 B:0
|
||||
##################################################
|
||||
# ^ #
|
||||
# o #
|
||||
# o * #
|
||||
# o #
|
||||
# o #
|
||||
# o #
|
||||
# ooooo #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>If I continue going up I will see:</p>
|
||||
|
||||
<pre><code> OUCH!
|
||||
X:20/49 Y:1/16 S:150/658 B:0
|
||||
</code></pre>
|
||||
|
||||
<h1><a name="cannibalism" href="#toc">Gameplay: Cannibalism</a></h1>
|
||||
|
||||
<p>By default cannibalism is disabled (<strong>CANNIBAL=0</strong>) so if you run into yourself it might look
|
||||
something like:</p>
|
||||
|
||||
<pre><code> X:45/49 Y:10/16 S:10/658 B:1
|
||||
##################################################
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# * #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# ooooo #
|
||||
# ^ o #
|
||||
# ooo #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>If I were to do any movement but turn to the left I would run into myself. I’ll
|
||||
go to the right two spaces:</p>
|
||||
|
||||
<pre><code> OW!
|
||||
X:47/49 Y:10/16 S:10/658 B:1
|
||||
</code></pre>
|
||||
|
||||
<p>But <strong>CANNIBAL=1</strong> can look very funny both in movement and still especially
|
||||
when you go through yourself several times when the snake is rather long. For
|
||||
example going through walls and the snake a few times:</p>
|
||||
|
||||
<pre><code> X:4/49 Y:12/16 S:165/658 B:3
|
||||
##################################################
|
||||
#oo o ooooo o o o#
|
||||
# oooo o ooo o#
|
||||
# ooooooooooooooooooo#
|
||||
# o #
|
||||
# oooooooooo o #
|
||||
# o o o #
|
||||
# o oooo o o #
|
||||
# o o o o #
|
||||
# ooooooooooooooo #
|
||||
# o o* #
|
||||
# oo> o o #
|
||||
# o oooooooo o #
|
||||
#oooooooooooooo o oooo oooooooo#
|
||||
# o o o o o #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>I’ll go back through myself now:</p>
|
||||
|
||||
<pre><code> X:6/49 Y:14/16 S:165/658 B:3
|
||||
##################################################
|
||||
#oo o ooooo o o o#
|
||||
# oooo o ooo o#
|
||||
# ooooooooooooooooooo#
|
||||
# o #
|
||||
# oooooooooo o #
|
||||
# o o o #
|
||||
# o oooo o o #
|
||||
# o o o o #
|
||||
# ooooooooooooooo #
|
||||
# o o* #
|
||||
# ooo o o #
|
||||
# oo oooooooo o #
|
||||
#ooooo>oooooooo o oooo oooooooo#
|
||||
# o o o o o #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>If you note that the head is at (6),(14) I will go one more to the right and you
|
||||
will see that the arrow has moved over:</p>
|
||||
|
||||
<pre><code> X:7/49 Y:14/16 S:165/658 B:3
|
||||
##################################################
|
||||
#oo o ooooo o o o#
|
||||
# oooo o ooo o#
|
||||
# ooooooooooooooooooo#
|
||||
# o #
|
||||
# oooooooooo o #
|
||||
# o o o #
|
||||
# o oooo o o #
|
||||
# o o o o #
|
||||
# ooooooooooooooo #
|
||||
# o o* #
|
||||
# ooo o o #
|
||||
# oo oooooooo o #
|
||||
#oooooo>ooooooo o oooo oooooooo#
|
||||
# o o o o o #
|
||||
##################################################
|
||||
</code></pre>
|
||||
|
||||
<p>Try this: Get a reasonable length and then go back on yourself (if you’re going
|
||||
left go right etc.) and then after some length (but before you get beyond the
|
||||
snake) turn (so that you go perpendicular) and then watch as the snake starts
|
||||
unwinding at one place and then suddenly unwinds another direction.</p>
|
||||
|
||||
<p>An example of extreme cannibalism is in the <a href="cannibalism.log">cannibalism.log</a> file. It has
|
||||
more than one run the first of one has several dumps. I didn’t move for a long
|
||||
time: the initial size was 1500 and I would have won before moving if I went
|
||||
after bugs right away. In the last two captures of the first invocation (the
|
||||
third and second to last dump) the bug, head and tail of the snake are at:</p>
|
||||
|
||||
<pre><code> Bug: line 87, col 47
|
||||
Head: line 88, col 62; and line 115, col 48
|
||||
Tail: line 84, col 46; and line 112, col 29
|
||||
</code></pre>
|
||||
|
||||
<p>The final example has the snake inside itself.</p>
|
||||
|
||||
<h1><a name="shedding" href="#toc">Gameplay: Shedding (stretching)</a></h1>
|
||||
|
||||
<p>This feature will make you grow by the value of <strong>SHEDS</strong> for every <strong>SHED</strong>
|
||||
movements (the counter isn’t incremented when you eat a bug). Basically growing
|
||||
without eating a bug (stretching would be better name here).</p>
|
||||
|
||||
<h1><a name="winning" href="#toc">Gameplay: Winning</a></h1>
|
||||
|
||||
<p>If you ever get to the <strong>MAXSIZE</strong> the game is won. You can force a win by
|
||||
setting the max size to a smaller value than the size you specify (or the
|
||||
default) or setting the size to higher than the default (or < 0 which will end
|
||||
up being > the max size though I suppose there might be some value that makes it
|
||||
less than again - I’m not going to try and figure that out however). Anyway:</p>
|
||||
|
||||
<pre><code> SIZE=-1 ./prog
|
||||
YOU WIN!
|
||||
X:24/49 Y:8/16 S:658/658 B:0
|
||||
</code></pre>
|
||||
|
||||
<p>Observe that the size isn’t the default 997: because the screen size is too
|
||||
small for that value (see <a href="terminals.markdown">terminals.markdown</a>).</p>
|
||||
|
||||
<p>The reason I chose 997 is that it leaves a bit of a challenge for some (maybe
|
||||
most) people but it’s still winnable. Previously even I couldn’t have won unless
|
||||
maybe a much bigger screen, if both cheat modes were disabled. I probably could
|
||||
win without any cheat mode enabled on my 24" monitor but I probably would need
|
||||
at least one cheat mode on my 13" laptop (I don’t need both enabled).</p>
|
||||
|
||||
<p>The beauty though is the game can be winnable by anyone since you can define the
|
||||
max size to win. Games are meant to be fun: who enjoys games that can never be
|
||||
won? Very few probably do and those who do enjoy them it probably are games that
|
||||
are relaxing and stimulating (which admittedly this game can be - but still I
|
||||
want it to be winnable too).</p>
|
||||
|
||||
<p>Another reason I chose 997: it’s prime and the judges love prime numbers.
|
||||
Actually, this is the main reason for the number: I had changed it down to 1000
|
||||
but then it occurred to me that there are prime numbers close to 1000 so why not
|
||||
choose one instead (that was less than 1000)? And so I did. Another fun fact: at
|
||||
the default starting size and growth size of 5 the number of bugs needed before
|
||||
the game is won is 199 - also a prime!</p>
|
||||
|
||||
<h1><a name="quitting" href="#toc">Gameplay: Quitting</a></h1>
|
||||
|
||||
<p>If you wish to quit you can hit ‘q’ (case-insensitive). For example:</p>
|
||||
|
||||
<pre><code> X:24/49 Y:8/16 S:5/658 B:0
|
||||
</code></pre>
|
||||
|
||||
<h1>4. <a name="modes" href="#toc">Gameplay modes</a></h1>
|
||||
|
||||
<p>Here I list a number of different modes of play. In the <a href="bugs.markdown">bugs.markdown</a>
|
||||
(<a href="bugs.html">bugs.html</a>) file I even show how there’s a built-in test unit for some
|
||||
modes! There are certainly other modes that could be imagined: the modes below
|
||||
happened over time and some were simply an accidental discovery or something I
|
||||
thought of by a chance; others were thought out from the beginning but were
|
||||
improved over time.</p>
|
||||
|
||||
<p>The <a href="play.sh">play.sh</a> script sets up some of these automatically; I describe it after
|
||||
the modes below.</p>
|
||||
|
||||
<h2><a name="warning" href="#toc">Photosensitive epilepsy/Stimulation overload trigger warnings</a></h2>
|
||||
|
||||
<p>If you have <strong>photosensitive epilepsy please be careful</strong> especially with low values
|
||||
for both <strong>WAIT</strong> and <strong>EVADE</strong>. It appears that the <a href="https://www.epilepsysociety.org.uk/photosensitive-epilepsy#.Xjgpwi2ZOgQ">number of hertz (flashes)
|
||||
per second triggering seizures</a> is wide but depending on the variables it
|
||||
easily can be in the range.</p>
|
||||
|
||||
<p>There are different patterns and lights flashing at different speeds so please
|
||||
exercise caution. This could trigger seizures and <strong>it might also be too much
|
||||
stimulation for some people.</strong></p>
|
||||
|
||||
<p><strong>Please be careful of these if these types of things have ever affected you or if
|
||||
you have any form of epilepsy. Thank you.</strong></p>
|
||||
|
||||
<h2><a name="drawing" href="#toc">Gameplay mode: Drawing / Practice mode</a></h2>
|
||||
|
||||
<p>If you want to draw the snake wherever you like on the screen you can do this by
|
||||
modifying the wait time (for input) to -1 (or any value < 0): then the snake
|
||||
does not move until you press a movement key. For example:</p>
|
||||
|
||||
<pre><code> WAIT=-1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>When you eat a bug the snake will grow and you can draw more. If you want to
|
||||
make it so you can go through yourself:</p>
|
||||
|
||||
<pre><code> WAIT=-1 CANNIBAL=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>If you don’t want to start out so small (i.e. you want to be able to draw more
|
||||
quickly) you can just set the size to a bigger number (and you could do the same
|
||||
with growth and moult/shed):</p>
|
||||
|
||||
<pre><code> SIZE=50 CANNIBAL=1 WAIT=-1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>Do note that although you’re a bigger size you still grow one movement at a
|
||||
time.</p>
|
||||
|
||||
<p>Okay but then if you get too many bugs the drawing will be over. If this proves
|
||||
to be a problem simply do:</p>
|
||||
|
||||
<pre><code> SIZE=100 CANNIBAL=1 WAIT=-1 GROW=0 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>Or something like that (maybe make the size bigger but that’s up to you). You
|
||||
could also set the max size to be the highest possible by saying</p>
|
||||
|
||||
<pre><code> MAXSIZE=-1
|
||||
</code></pre>
|
||||
|
||||
<p>Which I’ve done in the <a href="play.sh">play.sh</a> script.</p>
|
||||
|
||||
<p>I discuss how this mode works in <a href="spoilers.markdown">spoilers.markdown</a>.</p>
|
||||
|
||||
<p>Here’s an example run where I spelt ‘SNAKE’. As you can see it’s far from
|
||||
perfect: the snake after all does not leave gaps and the game does not support
|
||||
diagonal movement and I also made a mistake and had to modify what I was aiming
|
||||
for. But you can consider this mode drawing or practice mode.</p>
|
||||
|
||||
<pre><code> oooooooooo ooooo o oo ooooo
|
||||
o o oo o oo o ooo o
|
||||
oooo o oo ooooooo oooo ooooo
|
||||
o o ooo oo o ooo o
|
||||
oooo o oo ooo oooooooo>
|
||||
</code></pre>
|
||||
|
||||
<h2><a name="auto" href="#toc">Gameplay mode: Computer playing / Automatic mode (Photosensitive epilepsy/Stimulation overload trigger)</a></h2>
|
||||
|
||||
<p><strong>Photosensitive epilepsy/stimulation overload trigger warning:</strong>
|
||||
For those who have epilepsy or are susceptible to stimulation overload from
|
||||
flashing lights please do be careful with this mode. Depending on your
|
||||
susceptibility this could very well trigger seizures or other discomforts and I
|
||||
wouldn’t want that to happen to anyone. This mode has a lot of flashing of
|
||||
different colours and depending on the exact parameters you specify it could
|
||||
easily be in the trigger range for epilepsy but potentially stimulation overload
|
||||
too.</p>
|
||||
|
||||
<p>If you’re still here you can create this effect like:</p>
|
||||
|
||||
<pre><code> WAIT=0 WALLS=1 CANNIBAL=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>As long as the bug evades you’ll find that the snake is growing because it’s
|
||||
actually eating bugs; the computer is actually playing the game by itself! You
|
||||
can still move the snake though it won’t seem like you have much control over
|
||||
it. If you pause the game you can see that it’s bigger (you probably will be
|
||||
able to even without pausing it).</p>
|
||||
|
||||
<p>Basically the snake is moving so fast that because the bug evades the bug will
|
||||
inevitably move in the snake path’s and therefore be eaten.</p>
|
||||
|
||||
<p>You might find it goes quicker if you set the evade count to a lower value for
|
||||
example 1. Or you might not. But as long as the bug moves the computer can play
|
||||
by itself.</p>
|
||||
|
||||
<p>Quick tests suggest that bigger dimensions it gets bigger quicker. But it also
|
||||
seems to take longer for it to get a bug as it gets longer. I believe these
|
||||
happen because the bug has to find a X and Y coordinate that’s not occupied and
|
||||
so with fewer available it has a harder time finding a place in that one line.</p>
|
||||
|
||||
<h3><a name="auto-variations" href="#toc">Computer player variations</a></h3>
|
||||
|
||||
<p>Here’s how to make the bug move every time the snake moves:</p>
|
||||
|
||||
<pre><code> CANNIBAL=1 WALLS=1 WAIT=0 EVADE=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<h4>Help the computer win fairly quickly</h4>
|
||||
|
||||
<p>If you want to see the game ‘win’ try something like:</p>
|
||||
|
||||
<pre><code> CANNIBAL=1 WALLS=1 WAIT=0 EVADE=1 MAXSIZE=10 ./prog
|
||||
</code></pre>
|
||||
|
||||
<h4>Negative growth (Shrink) Automatic mode</h4>
|
||||
|
||||
<p>Here’s a fun one I just thought of (a long time after these other modes were
|
||||
thought of):</p>
|
||||
|
||||
<pre><code> WAIT=0 EVADE=1 GROW=-1 SIZE=9 MAXSIZE=10 CANNIBAL=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>What you’ll see is that first the snake will get to the size of 9 - whether it
|
||||
shows to be 10 characters depends on whether or not it gets a bug before it can
|
||||
get to that length - and then it’ll start shrinking until it’s just the head
|
||||
then the head again (i.e. 1 then 0 in size) and then win! This is also in the
|
||||
<a href="play.sh">play.sh</a> script.</p>
|
||||
|
||||
<h4>Adjusting the time/speed</h4>
|
||||
|
||||
<p>Of course you can also do something like:</p>
|
||||
|
||||
<pre><code> WAIT=5 WALLS=1 CANNIBAL=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>Which although might not seem like it is significantly slower.</p>
|
||||
|
||||
<h4>Moving the snake about to create patterns</h4>
|
||||
|
||||
<p>If you press different direction keys in some pattern you will see a pattern
|
||||
form too (entirely dependent on how fast you react, what keys you press and I
|
||||
suppose also how much the bug moves and the chance of being eaten also).</p>
|
||||
|
||||
<h4>Other ideas</h4>
|
||||
|
||||
<p>Here’s an idea: how many moves is needed to make it possible to have some sort
|
||||
of success in catching bugs? Obviously the dimensions will affect this value.</p>
|
||||
|
||||
<p>How long will it take for the snake to run into itself? For instance by doing:</p>
|
||||
|
||||
<pre><code> WAIT=0 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>On my 13" MacBook Pro at the default settings going horizontally the snake ran
|
||||
into itself at:</p>
|
||||
|
||||
<pre><code> OW!
|
||||
X:57/156 Y:20/41 S:155/997 B:30
|
||||
</code></pre>
|
||||
|
||||
<p>What if you set the size to a high value? The lowest? There are bound to be
|
||||
other games to play with this feature!</p>
|
||||
|
||||
<h2><a name="grow-shrink" href="#toc">Gameplay mode: Grow-Shrink mode (Positive and Negative Winning)</a></h2>
|
||||
|
||||
<p>In this mode you’re simultaneously growing and shrinking but because the max
|
||||
size is unsigned you can win both by shrinking to the point of losing your body
|
||||
or growing to the full size directly. This is how it works:</p>
|
||||
|
||||
<p>You have a negative shedding growth and a positive growth size: negative and
|
||||
positive winning. Depending on the parameters specified it might go one way over
|
||||
the other. Try:</p>
|
||||
|
||||
<pre><code> SIZE=150 SHEDS=-5 GROW=10 SHED=50 MAXSIZE=250 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>What this does is set the size to 150 (to make it not go down so quickly) and
|
||||
then for each bug you eat it adds 5 to the size; for every 50 moves (that you
|
||||
don’t get the bug) you shrink by 5. You will find that at times you might only
|
||||
decrease in size but then at other times - depending on size of screen and how
|
||||
lucky you are with where the bug is relative to where it last was - you might be
|
||||
growing. Combining this with the drawing mode could be interesting but I never
|
||||
actually tried it.</p>
|
||||
|
||||
<p>The parameters above were chosen after playing with the mode a bit to find a
|
||||
value that wouldn’t take that much time but still would pose a challenge. One
|
||||
could reverse it so that one shrinks more than growing.</p>
|
||||
|
||||
<p>The <a href="crazy.log">crazy.log</a> file has several screen dumps with this idea.</p>
|
||||
|
||||
<p>You could also have it so that eating a bug makes you shrink and moving so many
|
||||
moves you grow. I tried this and for me it was far more fun. The <a href="play.sh">play.sh</a>
|
||||
also has this mode:</p>
|
||||
|
||||
<pre><code> SIZE=100 SHEDS=5 GROW=-10 SHED=50 MAXSIZE=250 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>Obviously there are many other variations. The <a href="play.sh">play.sh</a> script has some
|
||||
of them (the above is option 5; others are 4, 15 and 16 but only options 4 and 5
|
||||
are called Grow / Shrink).</p>
|
||||
|
||||
<h2><a name="hypnotic" href="#toc">Hypnotic / Sleepy mode (<strong>Photosensitive epilepsy/Stimulation overload trigger</strong>)</a></h2>
|
||||
|
||||
<p><strong>Photosensitive epilepsy/stimulation overload trigger warning:</strong>
|
||||
For those who have epilepsy or are susceptible to stimulation overload from
|
||||
flashing lights and patterns please do be careful with this mode. Depending on your
|
||||
susceptibility this could very well trigger seizures or other discomforts and I
|
||||
wouldn’t want that to happen to anyone. The default wait time is 231ms, the
|
||||
typical range of seizures is 3 to 30 flashes per seconds (but can be higher) and
|
||||
that means that at <strong>EVADE=1</strong> every 231ms there will be a flash in addition to the
|
||||
snake moving too.</p>
|
||||
|
||||
<p>Anyway this might sound absurd but it can be somewhat hypnotic by doing:</p>
|
||||
|
||||
<pre><code> EVADE=1 CANNIBAL=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<p>And just moving the snake about not trying to catch any bugs - just let whatever
|
||||
happens happen.</p>
|
||||
|
||||
<h2><a name="stim" href="#toc">Gameplay mode: Stimulation / Calming mode</a></h2>
|
||||
|
||||
<p>If you just need something to stimulate your mind to keep you calm or simply you
|
||||
want to play a game without having to worry about winning or losing you can set
|
||||
the growth size to 0 and then just move the snake round and round eating bugs
|
||||
until you want to quit. You can enable cannibalism so that you don’t have to
|
||||
worry about even running into yourself and losing:</p>
|
||||
|
||||
<pre><code> GROW=0 CANNIBAL=1 ./prog
|
||||
</code></pre>
|
||||
|
||||
<h2><a name="expansibility" href="#toc">Gameplay mode: Expansibility</a></h2>
|
||||
|
||||
<p>As I was writing this document and the game modes I have thought of other game
|
||||
modes (they were added) and I have come back to this document to add more modes.
|
||||
That’s the beauty of the variables I have implemented: together with the
|
||||
imagination and even just chance different modes of play can be devised. The
|
||||
drawing mode was a happy chance of how the <code>timeout()</code> function works for
|
||||
example.</p>
|
||||
|
||||
<p>As a person who was heavily involved in MUD development and design I know very
|
||||
well how games need to be fun and have different options, not be too easy but
|
||||
not be too hard either. And a game developer who does not play their games is a
|
||||
game developer who is detached from their player base and the wants and needs
|
||||
are therefore disregarded if even heard. I have played this game a lot for this
|
||||
reason as well as I simply enjoy it and thinking up new modes.</p>
|
||||
|
||||
<h1>5. <a name="scripts" href="#toc">Scripts</a></h1>
|
||||
|
||||
<p>The following scripts are provided to simplify and automate some of the things
|
||||
this file discusses as well as allowing to easily change the colours.</p>
|
||||
|
||||
<h2><a name="colours" href="#toc">Colours selection: snake-colours</a></h2>
|
||||
|
||||
<p>To do this use the <a href="snake-colours">snake-colours</a> script like so:</p>
|
||||
|
||||
<pre><code> ./snake-colours
|
||||
</code></pre>
|
||||
|
||||
<p>If you want to pass in specific variables you can do that too e.g.:</p>
|
||||
|
||||
<pre><code> CANNIBAL=1 ./snake-colours
|
||||
</code></pre>
|
||||
|
||||
<p>The script will prompt you for the colour of the walls, snake head, body and the
|
||||
bug.</p>
|
||||
|
||||
<h2><a name="preset" href="#toc">Automate the above gameplay modes</a></h2>
|
||||
|
||||
<p>The <a href="play.sh">play.sh</a> script has the gameplay modes described in this file and is menu
|
||||
based (there might be differences and some of the modes I include a variation).
|
||||
The script tests the terminal (allowing you to continue even if problems are
|
||||
detected), prompts you if you want to select colours (like those in
|
||||
snake-colours above) and then gives you a list of game modes to play. You can
|
||||
pass in the game variables but note that if you pass in a variable that the mode
|
||||
you choose uses then the script will override what you pass in.</p>
|
||||
|
||||
<p>To use you can do something like:</p>
|
||||
|
||||
<pre><code> ./play.sh
|
||||
</code></pre>
|
||||
|
||||
<p>Or to make it so walls are an obstacle:</p>
|
||||
|
||||
<pre><code> WALLS=0 ./play.sh
|
||||
</code></pre>
|
||||
|
||||
<h1>6. <a name="variables" href="#toc">Game variables</a></h1>
|
||||
|
||||
<p>The game variables can be used for a variety of things including different
|
||||
gameplay modes as above but here are some notes about a few of them.</p>
|
||||
|
||||
<h2><a name="wait" href="#toc">WAIT: Snake speed</a></h2>
|
||||
|
||||
<p>Besides the different game modes if you find it too fast/slow you can change it
|
||||
to a value that’s better for you. Remember it’s a wait time so if you want the
|
||||
snake to move slower you have to increase the wait time!</p>
|
||||
|
||||
<h2><a name="evade" href="#toc">EVADE: Bug evasion frequency</a></h2>
|
||||
|
||||
<p>For every <strong>EVADE</strong> snake movements the bug will try and find a new place to
|
||||
occupy. It might be very close to it and I do not ensure it’s a new place at
|
||||
all.</p>
|
||||
|
||||
<p>Each time the bug is placed the counter will be reset whether from eating the
|
||||
bug or not reaching it in time. Default 300 moves.</p>
|
||||
|
||||
<p>This can help you get out of a trap but it can also sometimes make it harder.</p>
|
||||
|
||||
<h2><a name="sizes" href="#toc">SIZE / MAXSIZE: Initial / Max snake sizes</a></h2>
|
||||
|
||||
<p>997 might be a bit high for many people. Or maybe you don’t have enough time. Or
|
||||
you’re not in the mood to lose. Or you want to get close to a size you were last
|
||||
time but quickly. It might be in conjunction with drawing mode.</p>
|
||||
|
||||
<p>Note on snake size: there’s a stated size (in the score line) which is what
|
||||
the snake will ‘populate’ in the snake arrays and the visible size: as I have
|
||||
discussed here and there the snake doesn’t grow immediately so it takes time
|
||||
before the snake is visibly that many characters. In other words just because it
|
||||
says SIZE 29 doesn’t mean it will instantly be 29 characters on the screen.</p>
|
||||
|
||||
<h2><a name="growth" href="#toc">GROW / SHEDS : Growth / Shedding sizes</a></h2>
|
||||
|
||||
<p>Similar to the initial size. Notice that the above point on size applies here:
|
||||
it will take the number of movements before it is ‘its full size’.</p>
|
||||
|
||||
<h1>7. <a name="conclusions" href="#toc">Conclusion (and inspirational words for everyone)</a></h1>
|
||||
|
||||
<p>I believe that this file has given more than enough information for anyone to
|
||||
get an idea of what is possible with my implementation of Snake. I realise also
|
||||
that most people won’t have read this far and that’s quite all right; I’m very
|
||||
thorough and pay attention to details obsessively. Creating this game was a
|
||||
delight and I am quite proud of what I have done.</p>
|
||||
|
||||
<p>Thank you for whatever level of attention you felt you could or wanted to give
|
||||
and enjoy it in whatever way you see fit!</p>
|
||||
|
||||
<p><strong>Much more importantly is that Snake aside I hope I have demonstrated how with
|
||||
the imagination and creativity almost anything is possible.</strong> This is something
|
||||
<strong>that applies in our world in every way and <em>everyone</em> can do something amazing if
|
||||
they believe in themselves!</strong> I would have never thought this the case for me
|
||||
years ago but I know it’s true now. <strong>Believe in yourself. Always.</strong></p>
|
||||
<BR>
|
||||
<HR>
|
||||
<TABLE><TR>
|
||||
<TD><a rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="/png/by-sa-3.0-88x31.png" /></a></TD>
|
||||
<TD><P>© Copyright 1984-2020,
|
||||
<A HREF="/judges.html">Leo Broukhis, Simon Cooper, Landon Curt Noll</A>
|
||||
- All rights reserved<BR>
|
||||
This work is licensed under a <a rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.</P></TD>
|
||||
<TD> <!--<a href="https://validator.w3.org/check?uri=referer"><img src="https://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a>--></TD>
|
||||
</TR></TABLE>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user