build missing HTML files for entries

Setup a simple topnav for missing HTML files for entries.

Added `bin/gen-other-html.sh` to build entry HTML files from
markdown other than README.md to index.html HTML files.

Fixed duplicate link text in `2020/ferguson1/gameplay.md`.

Improved `inc/md2html.cfg` to support building the missing HTML
files for entries.

Added `make gen_other_html` to top level Makefile.
Added `make gen_other_html` to `make quick_www` and `make www`.

Fixed inventory links for year level index.html files.
Changed `bin/output-year-index.sh` VERSION from "1.0.1 2024-02-23"
to "1.1 2024-02-27".

Added missing lines in `manifest.numbers`.  Update the affected
`.entry.json` files.

The manifest (in both `manifest.numbers` and the collection of
manifests from of all entry `.entry.json` files) now match.  Errors
from `make verify_entry_files` will now abort both `make quick_www`
and `make www` rules in the top level `Makefile`.

Changed markdown files in manifest to have an _inventory_order_ of
_2000000000_ so that the `index.html` file will usually appear at
the start of the _Secondary files_ set for the "#inventory" section
of an entry's `index.html` file.

Changed compressed tar files (files that end in _.tar.bz2_) in
manifest to have an _inventory_order_ of _100000_ so that these
files will usually appear at the end of the _Primary files_ set for
the "#inventory" section of an entry's `index.html` file.

Added 'Jump to top` link above the _Primary files_ section.
Changed `bin/output-index-inventory.sh` VERSION from "1.1.1 2024-02-23"
to "1.2 2024-02-27".

Updated HTML files to perform the above via `make www`.
This commit is contained in:
Landon Curt Noll committed 2024-02-27 22:36:20 -08:00
1 parent 7babf792e4
commit 9d3438fb88
718 files changed
+17515 -4084

No files matched your search

+879
View File
@@ -0,0 +1,879 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- START: two lines up starts content from: inc/top.default.html -->
<!-- -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- -->
<!-- END: this line ends content from: inc/top.default.html -->
<!-- -->
<!-- The original markdown content was formed by the tool: bin/gen-other-html.sh -->
<!-- The HTML was converted from markdown by the tool: bin/md2html.sh -->
<!-- -->
<!-- START: this line starts content from: inc/head.default.html -->
<head>
<link rel="stylesheet" href="../../ioccc.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>The International Obfuscated C Code Contest</title>
<meta name="description" content="gameplay.md for 2020/ferguson1">
<meta name="keywords" content="IOCCC, 2020/ferguson1, gameplay.md">
</head>
<!-- END: this line ends content from: inc/head.default.html -->
<!-- START: this line starts content from: inc/body.default.html -->
<body>
<!-- END: this line ends content from: inc/body.default.html -->
<!-- START: this line starts content from: inc/header.default.html -->
<div class="header">
<img src="../../png/ioccc.png" alt="IOCCC image by Matt Zucker" width=300 height=110>
<h1>The International Obfuscated C Code Contest</h1>
<h2>gameplay.md for 2020/ferguson1</h2>
</div>
<!-- END: this line ends content from: inc/header.default.html -->
<!-- START: this line starts content from: inc/topnav.up2index.html -->
<div class="topnav">
<a class="Left" href="index.html">&uarr; jump to index.html &uarr;</a>
</div>
<!-- END: this line ends content from: inc/topnav.up2index.html -->
<!-- START: this line starts content from: inc/begin-row.default.html -->
<div class="row">
<!-- END: this line ends content from: inc/begin-row.default.html -->
<!-- START: this line starts content from: inc/begin-leftcolumn.default.html -->
<div class="leftcolumn">
<!-- END: this line ends content from: inc/begin-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/sidenav.default.html -->
<div class="sidenav">
<a href="#content">Jump to contents</a>
</div>
<hr>
<div class="sidenav">
<a href="../../index.html">IOCCC Home</a>
<a href="../../years.html">Winning Entries</a>
<a href="../../authors.html">People who have won</a>
</div>
<hr>
<div class="sidenav">
<a href="../../news.html">IOCCC News</a>
<a href="../../faq.html#submit">How to enter the IOCCC</a>
<a href="../../faq.html">FAQ</a>
</div>
<hr>
<div class="sidenav">
<a href="../../bugs.html">Bugs &amp; (mis)features</a>
<a href="../../faq.html#fix_an_entry">Fixing IOCCC entries</a>
<a href="../../faq.html#fix_web_site">Fixing the web site</a>
<a href="../../faq.html#fix_author">Fixing author info</a>
<a href="../../thanks-for-help.html">Thanks for the help</a>
</div>
<hr>
<div class="sidenav">
<a href="../../judges.html">The IOCCC Judges</a>
<a href="../../contact.html">Contacting the IOCCC</a>
</div>
<hr>
<div class="sidenav">
<a href="#top">Jump to top</a>
</div>
<!-- END: this line ends content from: inc/sidenav.default.html -->
<!-- START: this line starts content from: inc/end-leftcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/begin-rightcolumn.default.html -->
<div class="rightcolumn">
<!-- END: this line ends content from: inc/begin-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/before-content.default.html -->
<a name="content"></a>
<!-- END: this line ends content from: inc/before-content.default.html -->
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<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></p>
<ol type="1">
<li><p><a href="#support">Testing terminal
environment/capabilities</a></p></li>
<li><p><a href="#input">Input keys</a></p></li>
<li><p><a href="#gameplay">Gameplay</a></p>
<ul>
<li><p><a href="#initial">The initial screen</a></p></li>
<li><p><a href="#playing">Playing the game</a></p></li>
<li><p><a href="#walls">Walls</a></p></li>
<li><p><a href="#cannibalism">Cannibalism</a></p></li>
<li><p><a href="#shedding">Stretching (shedding)</a></p></li>
<li><p><a href="#winning">Winning</a></p></li>
<li><p><a href="#quitting">Quitting</a></p></li>
</ul></li>
<li><p><a href="#modes">Gameplay modes</a></p>
<ul>
<li><p><a href="#warning"><strong>Photosensitive epilepsy/Stimulation
overload trigger warnings</strong></a></p></li>
<li><p><a href="#drawing">Drawing / Practice mode</a></p></li>
<li><p><a href="#auto">Computer playing / Automatic mode
(<strong>Photosensitive epilepsy/Stimulation overload
trigger</strong>)</a></p>
<ul>
<li><a href="#auto-variations">Variations</a></li>
</ul></li>
<li><p><a href="#grow-shrink">Grow-Shrink (Positive/Negative Winning)
mode</a></p></li>
<li><p><a href="#hypnotic">Hypnotic / Sleepy mode
(<strong>Photosensitive epilepsy/Stimulation overload
trigger</strong>)</a></p></li>
<li><p><a href="#stim">Stimulation / Calming mode</a></p></li>
<li><p><a href="#other-ideas">Other ideas</a></p></li>
</ul></li>
<li><p><a href="#scripts">Scripts</a></p>
<ul>
<li><p><a href="#colours">Colours selection</a></p></li>
<li><p><a href="#preset">Automate the above gameplay modes</a></p></li>
</ul></li>
<li><p><a href="#variables">Other game variables</a></p>
<ul>
<li><p><a href="#wait">WAIT - Snake speed</a></p></li>
<li><p><a href="#evade">EVADE - Bug evasion frequency</a></p></li>
<li><p><a href="#sizes">SIZE / MAXSIZE - Initial snake / max
sizes</a></p></li>
<li><p><a href="#growth">GROW / SHEDS - Growth / Shedding
sizes</a></p></li>
</ul></li>
<li><p><a href="#conclusions">Conclusion (and inspirational words for
everyone)</a></p></li>
</ol>
<h1 id="testing-terminal-environmentcapabilities">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.html">terminals.html</a> (<a
href="terminals.md">terminals.md</a> on GitHub) file for more
information on the terminal capabilities testing utility I include.</p>
<p>For troubleshooting other problems see <a
href="troubleshooting.html">troubleshooting.html</a> (<a
href="troubleshooting.md">troubleshooting.md</a> on GitHub) and <a
href="bugs.html">bugs.html</a> (<a href="bugs.md">bugs.md</a> on
GitHub).</p>
<h1 id="input-keys">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><code>q</code> (and <code>Q</code>): quit the game.</p></li>
<li><p>Space: 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 id="gameplay">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
id="gameplay-the-initial-screen"><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
id="gameplay-playing-the-game"><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&gt; #
# #
# * #
# #
# #
# #
# #
# #
##################################################</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 id="gameplay-walls"><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
id="gameplay-cannibalism"><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&gt; 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&gt;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&gt;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.html">cannibalism.log.html</a> (<a
href="cannibalism.log.md">cannibalism.log.md</a> on GitHub) file. It
explains information about the file including how to find the bug, head
and tail of the snake, at least where it was documented. The first run
has several dumps. The final example has the snake inside itself.</p>
<h1
id="gameplay-shedding-stretching"><a name="shedding" href="#toc">Gameplay:
Shedding (stretching)</a></h1>
<p>This feature will make you grow by the value of
<strong><code>SHEDS</code></strong> for every
<strong><code>SHED</code></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 id="gameplay-winning"><a name="winning" href="#toc">Gameplay:
Winning</a></h1>
<p>If you ever get to the <strong><code>MAXSIZE</code></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 &lt; 0 which will end up being &gt; 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>
<div class="sourceCode" id="cb14"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="va">SIZE</span><span class="op">=</span>-1 <span class="ex">./prog</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a><span class="ex">YOU</span> WIN!</span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a><span class="ex">X:24/49</span> Y:8/16 S:658/658 B:0</span></code></pre></div>
<p>Observe that the size isn’t the default 997: because the screen size
is too small for that value (see <a
href="terminals.md">terminals.md</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 16”
laptop (I don’t need both enabled). I don’t think I need either for
997.</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 id="gameplay-quitting"><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 id="gameplay-modes">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.html">bugs.html</a> (<a href="bugs.md">bugs.md</a> on GitHub)
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
id="photosensitive-epilepsystimulation-overload-trigger-warnings"><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><code>WAIT</code></strong> and
<strong><code>EVADE</code></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
id="gameplay-mode-drawing-practice-mode"><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 &lt;
0): then the snake does not move until you press a movement key. For
example:</p>
<div class="sourceCode" id="cb16"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="va">WAIT</span><span class="op">=</span>-1 <span class="ex">./prog</span></span></code></pre></div>
<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>
<div class="sourceCode" id="cb17"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="va">WAIT</span><span class="op">=</span>-1 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<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>
<div class="sourceCode" id="cb18"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="va">SIZE</span><span class="op">=</span>50 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="va">WAIT</span><span class="op">=</span>-1 <span class="ex">./prog</span></span></code></pre></div>
<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>
<div class="sourceCode" id="cb19"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="va">SIZE</span><span class="op">=</span>100 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="va">WAIT</span><span class="op">=</span>-1 <span class="va">GROW</span><span class="op">=</span>0 <span class="ex">./prog</span></span></code></pre></div>
<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>
<div class="sourceCode" id="cb20"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a><span class="va">MAXSIZE</span><span class="op">=</span>-1</span></code></pre></div>
<p>Which I’ve done in the <a href="play.sh">play.sh</a> script.</p>
<p>I discuss how this mode works in [spoilers.markdown][].</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&gt; </code></pre>
<h2
id="gameplay-mode-computer-playing-automatic-mode-photosensitive-epilepsystimulation-overload-trigger"><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>
<div class="sourceCode" id="cb22"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="va">WAIT</span><span class="op">=</span>0 <span class="va">WALLS</span><span class="op">=</span>1 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<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
id="computer-player-variations"><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>
<div class="sourceCode" id="cb23"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a><span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="va">WALLS</span><span class="op">=</span>1 <span class="va">WAIT</span><span class="op">=</span>0 <span class="va">EVADE</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<h4 id="help-the-computer-win-fairly-quickly">Help the computer win
fairly quickly</h4>
<p>If you want to see the game ‘win’ try something like:</p>
<div class="sourceCode" id="cb24"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="va">WALLS</span><span class="op">=</span>1 <span class="va">WAIT</span><span class="op">=</span>0 <span class="va">EVADE</span><span class="op">=</span>1 <span class="va">MAXSIZE</span><span class="op">=</span>10 <span class="ex">./prog</span></span></code></pre></div>
<h4 id="negative-growth-shrink-automatic-mode">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>
<div class="sourceCode" id="cb25"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="va">WAIT</span><span class="op">=</span>0 <span class="va">EVADE</span><span class="op">=</span>1 <span class="va">GROW</span><span class="op">=</span>-1 <span class="va">SIZE</span><span class="op">=</span>9 <span class="va">MAXSIZE</span><span class="op">=</span>10 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<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 id="adjusting-the-timespeed">Adjusting the time/speed</h4>
<p>Of course you can also do something like:</p>
<div class="sourceCode" id="cb26"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a><span class="va">WAIT</span><span class="op">=</span>5 <span class="va">WALLS</span><span class="op">=</span>1 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<p>Which although might not seem like it is significantly slower.</p>
<h4 id="moving-the-snake-about-to-create-patterns">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 id="other-ideas">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>
<div class="sourceCode" id="cb27"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="va">WAIT</span><span class="op">=</span>0 <span class="ex">./prog</span></span></code></pre></div>
<p>On my 13” MacBook Pro (replaced later by a 16”) 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
id="gameplay-mode-grow-shrink-mode-positive-and-negative-winning"><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>
<div class="sourceCode" id="cb29"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a><span class="va">SIZE</span><span class="op">=</span>150 <span class="va">SHEDS</span><span class="op">=</span>-5 <span class="va">GROW</span><span class="op">=</span>10 <span class="va">SHED</span><span class="op">=</span>50 <span class="va">MAXSIZE</span><span class="op">=</span>250 <span class="ex">./prog</span></span></code></pre></div>
<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.html">crazy.log.html</a> (<a
href="crazy.log.md">crazy.log.md</a> on GitHub) 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>
<div class="sourceCode" id="cb30"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a><span class="va">SIZE</span><span class="op">=</span>100 <span class="va">SHEDS</span><span class="op">=</span>5 <span class="va">GROW</span><span class="op">=</span>-10 <span class="va">SHED</span><span class="op">=</span>50 <span class="va">MAXSIZE</span><span class="op">=</span>250 <span class="ex">./prog</span></span></code></pre></div>
<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
id="hypnotic-sleepy-mode-photosensitive-epilepsystimulation-overload-trigger"><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>
<div class="sourceCode" id="cb31"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a><span class="va">EVADE</span><span class="op">=</span>1 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<p>And just moving the snake about not trying to catch any bugs - just
let whatever happens happen.</p>
<h2
id="gameplay-mode-stimulation-calming-mode"><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>
<div class="sourceCode" id="cb32"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb32-1"><a href="#cb32-1" aria-hidden="true" tabindex="-1"></a><span class="va">GROW</span><span class="op">=</span>0 <span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./prog</span></span></code></pre></div>
<h2
id="gameplay-mode-expansibility"><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 id="scripts">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
id="colours-selection-snake-colours"><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>
<div class="sourceCode" id="cb33"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb33-1"><a href="#cb33-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./snake-colours</span></span></code></pre></div>
<p>If you want to pass in specific variables you can do that too
e.g.:</p>
<div class="sourceCode" id="cb34"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb34-1"><a href="#cb34-1" aria-hidden="true" tabindex="-1"></a><span class="va">CANNIBAL</span><span class="op">=</span>1 <span class="ex">./snake-colours</span></span></code></pre></div>
<p>The script will prompt you for the colour of the walls, snake head,
body and the bug.</p>
<h2
id="automate-the-above-gameplay-modes"><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>
<div class="sourceCode" id="cb35"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb35-1"><a href="#cb35-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./play.sh</span></span></code></pre></div>
<p>Or to make it so walls are an obstacle:</p>
<div class="sourceCode" id="cb36"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb36-1"><a href="#cb36-1" aria-hidden="true" tabindex="-1"></a><span class="va">WALLS</span><span class="op">=</span>0 <span class="ex">./play.sh</span></span></code></pre></div>
<h1 id="notes-about-some-of-the-game-variables">6.
<a name="variables" href="#toc">Notes about some of the game
variables</a></h1>
<p>The game variables can be used for a variety of things including
different gameplay modes (as shown above) but here are some general
notes about a few of them.</p>
<h2 id="wait-snake-speed"><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 id="evade-bug-evasion-frequency"><a name="evade" href="#toc">EVADE:
Bug evasion frequency</a></h2>
<p>For every <strong><code>EVADE</code></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
id="size-maxsize-initial-max-snake-sizes"><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
id="grow-sheds-growth-shedding-sizes"><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 id="conclusion-and-inspirational-words-for-everyone">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>
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<tbody>
<tr class="odd">
<td>(c) Copyright 1984-2020, [Leo Broukhis, Simon Cooper, Landon Curt
Noll][judges] - All rights reserved This work is licensed under a
[Creative Commons Attribution-ShareAlike 3.0 Unported License][cc].</td>
</tr>
<tr class="even">
<td>[judges]: https://www.ioccc.org/judges.html [cc]:
http://creativecommons.org/licenses/by-sa/3.0/</td>
</tr>
</tbody>
</table>
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<!-- START: this line starts content from: inc/after-content.default.html -->
<!-- END: this line ends content from: inc/after-content.default.html -->
<!-- START: this line starts content from: inc/end-rightcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/end-row.default.html -->
</div>
<!-- END: this line ends content from: inc/end-row.default.html -->
<!-- START: this line starts content from: inc/footer.default.html -->
<div class="footer">
<hr>
<h2>Coda</h2>
<p><a href="https://validator.w3.org/nu/?doc=#">Nu HTML check this web page</a></p>
<p><a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a></p>
</div>
<!-- END: this line ends content from: inc/footer.default.html -->
<!-- START: this line starts content from: inc/bottom.default.html -->
</body>
</html>
<!-- END: this line ends content from: inc/bottom.default.html -->