Renamed `ioccc.ico` to `favicon.ico`. Correctly added use of `favicon.ico` to all constructed HTML headers. Fixed the smart quote in HTML elements problem. Moved HTML "DO NOT EDIT" comments down below at the bottom of the HTML phase 1 section. According to to the Nu Html Checker, a charset attribute on a meta element found after the first 1024 bytes. Changed `bin/md2html.sh` VERSION from "1.1.3 2024-03-28" to "1.2 2024-03-30". Improved `bin/gen-status.sh` to adjust the "status_update" value only when the "contest_status" is changed. Performed a `make www` to perform and test the above under macOS.
502 lines
29 KiB
HTML
502 lines
29 KiB
HTML
<!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 -->
|
||
|
||
<!-- END: this line ends content from: inc/top.default.html -->
|
||
<!-- 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>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="troubleshooting.md for 2020/ferguson1">
|
||
<meta name="keywords" content="IOCCC, 2020/ferguson1, troubleshooting.md">
|
||
</head>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! 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/head.default.html -->
|
||
|
||
<!-- -->
|
||
<!-- This web page was formed via the tool: bin/gen-other-html.sh -->
|
||
<!-- The content of main section of this web page came from: 2020/ferguson1/troubleshooting.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson1/troubleshooting.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson1/troubleshooting.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson1/troubleshooting.md !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
|
||
|
||
<!-- 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>troubleshooting.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">↑ jump to index.html ↑</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>
|
||
<a href="../../location.html">Location of authors</a>
|
||
</div>
|
||
<hr>
|
||
<div class="sidenav">
|
||
<a href="../../news.html">IOCCC News</a>
|
||
<a href="../../status.html">Contest status</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 & (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 -->
|
||
|
||
<h1 id="troubleshooting-snake">Troubleshooting Snake</h1>
|
||
<p>In this file I have a list of a number of possible problems that could show up
|
||
under some situations as well as some things that might appear to be happening
|
||
or be a problem but actually are not. For each one I have included a summary, a
|
||
more thorough description and any resolutions (from easiest to hardest). For
|
||
anything that can cause more than one issue I will list those separately to keep
|
||
it as structured as possible/easiest to find.</p>
|
||
<p><a name="toc"></a>
|
||
- <a href="#topwall">The top wall isn’t (all/some of the time) visible!</a>
|
||
- <a href="#notmoving">The snake isn’t moving!</a>
|
||
- <a href="#invisiblehead">I can’t see the snake head (or other part of the snake)!</a>
|
||
- <a href="#invisiblebug">I can’t see the bug!</a>
|
||
- <a href="#froze">The game froze!</a>
|
||
- <a href="#bigsnake">The game gets slower as the snake gets bigger!</a>
|
||
- <a href="#headonly">I set SIZE=0 GROW=1, ate a bug but still only the head was visible! Why?</a>
|
||
- <a href="#monochrome">I like black text on a white background but even with a white background terminal it ends up black!</a>
|
||
- <a href="#toodark">The text is hard to see (not bright enough)!</a>
|
||
- <a href="#movefaster">Can I move the snake faster temporarily without having to modify the wait time?</a>
|
||
- <a href="#envvars">On environmental variables more generally and string to int conversions</a>
|
||
- <a href="#errors">Errors and error reporting</a></p>
|
||
<h2 id="the-top-wall-isnt-allsome-of-the-time-visible"><a name="topwall" href="#toc">The top wall isn’t (all/some of the time) visible!</a></h2>
|
||
<p>Because the score line is dynamic in length depending on the terminal size it
|
||
can happen that the score/status wraps to the next line(s). This can be fixed by
|
||
modifying the status line (see <a href="HACKING.html">HACKING.html</a> or on GitHub <a href="HACKING.md">HACKING.md</a>) but
|
||
you shouldn’t need it to be very wide.</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: Use a bigger screen (it doesn’t take that many columns)</p>
|
||
<p><strong>Tip:</strong> try running <code>make test</code> to get an estimate of the minimum number of columns
|
||
needed. This won’t work right if you change the score line!</p>
|
||
<p>Note that this utility is not perfect; I describe this elsewhere. Either way a
|
||
small screen will make it harder to play esp without the cheat modes enabled
|
||
(but they can still be fun with large screens).</p></li>
|
||
<li><p>RESOLUTION #1: Open the <a href="prog.c">prog.c</a> and change the line</p>
|
||
<pre><code> #define J Z(X:%d/%d Y:%d/%d S:%zu/%zu B:%zu\n),Y,y[-2],X, *y, A, g, c );</code></pre>
|
||
<p>To be something like:</p>
|
||
<pre><code> #define J Z(B:%zu\n), c);</code></pre>
|
||
<p>Recompile and try again. That will then show only the number of bugs eaten.
|
||
See the <a href="HACKING.html">HACKING.html</a> (<a href="HACKING.md">HACKING.md</a> on GitHub) file for other data you
|
||
can include (though there are some discrepancies here and there as you’ll
|
||
see).</p></li>
|
||
</ul>
|
||
<h2 id="the-snake-isnt-moving"><a name="notmoving" href="#toc">The snake isn’t moving!</a></h2>
|
||
<p>Unless the game is paused this should not be happening. It can appear sometimes
|
||
that there isn’t movement and sometimes it might have to take a moment to
|
||
‘unwind’ but as long as the head is moving then everything is fine.</p>
|
||
<p>The tail might not always be moving which could make it seem like the snake
|
||
isn’t moving but as long as the head is moving then the snake can be assumed to
|
||
be moving.</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: Unless the game is paused as long as the snake head is moving
|
||
everything is fine even if it seems sometimes that the snake tail is still: this
|
||
is normal and there are a few conditions that this might especially show itself
|
||
e.g. when the snake is growing.</p>
|
||
<p>If you want to see this in action try:</p>
|
||
<pre><code> SIZE=150 SHEDS=10 SHED=1 ./prog</code></pre>
|
||
<p>Once you start moving you’ll see that the tail stays still for a while and
|
||
when it does move you’ll see it doesn’t move for long.</p>
|
||
<p>Sometimes also it might appear that the movement is delayed but there are
|
||
numerous causes for this some of which are a busy computer but ultimately
|
||
it’ll catch up; just give it the time it needs.</p></li>
|
||
<li><p>BOTTOM LINE: If you want more information then see the <a href="bugs.html">bugs.html</a>
|
||
(<a href="bugs.md">bugs.md</a> on GitHub) file.</p></li>
|
||
</ul>
|
||
<h2 id="i-cant-see-the-snake-head-or-other-part-of-the-snake"><a name="invisiblehead" href="#toc">I can’t see the snake head (or other part of the snake)!</a></h2>
|
||
<p>Possibly this could happen with too long a score line which I already discussed.
|
||
It also used to be possible during cannibal mode whilst cannibalising: you would
|
||
just have to continue moving on and you’d eventually find your head (assuming
|
||
the rest of the screen isn’t covered with your body!). And what else could you
|
||
expect if you decided to shove your head up your …. ? :))</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: Actually I thought it would look better that you could see the
|
||
head even when cannibalising so you should be able to lose your head and at the
|
||
same time see it!</p></li>
|
||
<li><p>RESOLUTION #1: If the terminal width is too small then it could be that the
|
||
score line is covering the wall, snake and even bug; I gave two resolutions to
|
||
that earlier in this file. To get a recommended number of columns use <code>make test</code>.</p></li>
|
||
</ul>
|
||
<h2 id="i-cant-see-the-bug"><a name="invisiblebug" href="#toc">I can’t see the bug!</a></h2>
|
||
<p>This has happened to me a number of times and early in development there were
|
||
times that I could swear I even saw it beyond the walls but this should not be a
|
||
problem now if it ever was.</p>
|
||
<p>However I have made a lot of effort to think of situations that might make the
|
||
bug location calculation and placement be a problem and even did some debug
|
||
output and wrote another test program to calculate the maximum number of places
|
||
the bug could be put etc.</p>
|
||
<p>One of the reasons I have the terminal dimensions have a minimum and also a
|
||
maximum has to do with the way the bug placement and max size of the snake (and
|
||
so arrays) are calculated: it could happen that because of it being unsigned
|
||
without there being restrictions it could end up being a bad value that causes
|
||
the bug placement loop to never end (in this case the snake would also stop
|
||
moving).</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: If evasion mode is enabled (default after 300 moves) just wait
|
||
it out and the bug will move to a new place and it might be easier to see in the
|
||
new place.</p></li>
|
||
<li><p>RESOLUTION #1: The terminal size is too small for the score line. See the
|
||
earlier problem for how to resolve this if that’s the case.</p></li>
|
||
<li><p>RESOLUTION #2: Sometimes you have to look closely for it can be easy to miss.
|
||
If it’s against the wall and the screen is <a href="https://www.hp-lexicon.org/character/gaunt-family/morfin-gaunt/">Snakey</a> or you’re tired or the colour
|
||
contrast isn’t right for you or something like that it might be harder to see.
|
||
Try pausing the game (space) and scan the screen for it. If you really are
|
||
desperate copy and paste the entire file into a document and search for the bug
|
||
char (if it’s an editor like vi/vim you will have to be sure to escape the char
|
||
since <code>*</code> is a regexp metacharacter). This has happened to me numerous times.</p></li>
|
||
<li><p>RESOLUTION #3: If the colour contrast is not good for your eyes use the
|
||
<a href="snake-colours">snake-colours</a> script to select a different colour scheme.</p></li>
|
||
</ul>
|
||
<h2 id="the-game-froze"><a name="froze" href="#toc">The game froze!</a></h2>
|
||
<p>This should not be possible either but without certain safety checks in place I
|
||
have caused this (and I did this deliberately in development to find all the
|
||
conditions I could to resolve them).</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: If this does happen it likely is to do with placement of the
|
||
bug; that is why I have the max size of the snake capped a fair bit below the
|
||
maximum number of coordinates in the game field: because the bug isn’t to be at
|
||
a place the snake already occupies.</p></li>
|
||
<li><p>RESOLUTION #1: If the system <code>rand()</code> implementation is really bad maybe it’s
|
||
having a problem finding a location to place the bug. The best I can think of is
|
||
to try increasing the screen size or decrease the max size of the snake.</p></li>
|
||
<li><p>BOTTOM LINE: If the bug cannot find a place to be this will likely cause the
|
||
game to freeze because the game loops until it finds an available place for the
|
||
bug to be; if the pRNG is so bad wrt where the snake occupies it could
|
||
theoretically happen. If this happens you will have to kill the game by e.g.
|
||
ctrl-c. Try increasing the screen size and/or decreasing the max size of the
|
||
snake. See below for some tests.</p>
|
||
<p>I removed caps in a test and then:</p>
|
||
<pre><code> GROW=1 COLUMNS=30 LINES=10 CANNIBAL=1 MAXSIZE=10000 ./prog</code></pre>
|
||
<p>It froze at this point:</p>
|
||
<pre><code> X:14/29 Y:5/9 S:323/10000 B:318</code></pre>
|
||
<p>This is because there was only one place for the bug - where the snake head
|
||
was to be. With these parameters the limit is actually 189! This could
|
||
perhaps be increased but the calculation I have used is easy and although I
|
||
certainly could make it so it’s one less than the max that takes more bytes
|
||
and I don’t see it actually mattering.</p>
|
||
<p>Another time I tried:</p>
|
||
<pre><code> LINES=6 COLUMNS=6</code></pre>
|
||
<p>And it also froze (as noted I impose a minimum of >= 10 for both LINES and
|
||
COLUMNS).</p>
|
||
<p>Ultimately I had to kill the program due to the game being stuck in the bug
|
||
placement routine. I could have put in a maximum number of loops but what
|
||
good would that do? It would use more bytes and what would it do anyway,
|
||
win? Well that’s what the max size is for.</p></li>
|
||
<li><p>TERMINAL SIZE TO MAX SNAKE SIZE CALCULATION ETC.</p>
|
||
<p>For this information and more use the termcaps utility:</p>
|
||
<pre><code> make test</code></pre>
|
||
<p>An example:</p>
|
||
<pre><code> terminal supports cursor movement
|
||
terminal supports making cursor invisible
|
||
terminal supports bold
|
||
terminal supports colours
|
||
|
||
terminal rows 41 (38 playable)
|
||
terminal cols 154 (152 playable)
|
||
|
||
snake size: 997 (max size: 5738)
|
||
bugs: 199 (max size: 1147)
|
||
|
||
at least 34 columns (currently 154) recommended for snake size 997
|
||
at least 37 columns (currently 154) recommended for capped snake size 5738
|
||
|
||
No problems detected.</code></pre>
|
||
<p>Why are there only 38 playable lines for 41 rows? The first row is the score
|
||
line, the second is the top wall, the last is the bottom wall. For columns
|
||
you have the left and rightmost columns for the walls.</p>
|
||
<p>The calculation for max size takes place after decrementing the max y/x;
|
||
then it’s <code>(maxy - 2) * (maxx - 2)</code>; above that would be:</p>
|
||
<pre><code> (41 - 2) * (156 - 2) == 6006</code></pre>
|
||
<p>If for some reason the game were to stall for this purpose you would have to
|
||
kill the game by e.g. ctrl-c since the bug placement is stuck in a loop.
|
||
This shouldn’t happen though.</p></li>
|
||
</ul>
|
||
<h2 id="the-game-gets-slower-as-the-snake-gets-bigger"><a name="bigsnake" href="#toc">The game gets slower as the snake gets bigger!</a></h2>
|
||
<p>Realistically the game shouldn’t take that much memory but maybe in some very
|
||
busy systems it would have a problem.</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: If the rand() implementation is particularly poor then it might
|
||
be that the bug placement is taking more time.</p></li>
|
||
<li><p>RESOLUTION #1: It could also be the arrays being updated as the snake gets
|
||
bigger.</p></li>
|
||
<li><p>BOTTOM LINE: I find it unlikely that either of these happen and I don’t know
|
||
what to say; you can try decreasing the max size to see if it doesn’t reach this
|
||
problem. Otherwise it would be good to see if you can find a pattern: is it when
|
||
the snake is bigger i.e. the screen is rather fuller than when you first begin?
|
||
Or is the system rather busy?</p></li>
|
||
</ul>
|
||
<h2 id="i-set-size0-grow1-ate-a-bug-but-still-only-the-head-was-visible-why"><a name="headonly" href="#toc">I set <code>SIZE=0 GROW=1</code>, ate a bug but still only the head was visible! Why?</a></h2>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: The size includes the head but what should it show if the size
|
||
is 0? The head is the obvious choice so once you do get to size 1 you will still
|
||
only have the head. When you get to size 2 you’ll have part of the body too.
|
||
Try:</p>
|
||
<pre><code> SIZE=1 GROW=1</code></pre>
|
||
<p>And you will see that at one bug you’ll have size two and just as if you had
|
||
two bugs with the previous invocation.</p>
|
||
<p>BTW: When you are size 1 you can go back on yourself even if cannibalism is
|
||
disabled because there really isn’t anything to go back through: it’s just
|
||
you moving the head until you find a body to use! Once you have size >= 2
|
||
then cannibalism mode counts.</p></li>
|
||
<li><p>BOTTOM LINE: In some senses SIZE=0 and SIZE=1 are the same thing.</p></li>
|
||
</ul>
|
||
<h2 id="i-like-black-text-on-a-white-background-but-even-with-a-white-background-terminal-it-ends-up-black"><a name="monochrome" href="#toc">I like black text on a white background but even with a white background terminal it ends up black!</a></h2>
|
||
<p>This is a curses thing but fortunately it should be easy enough to solve.</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: Try setting the terminal to monochrome for the invocation of
|
||
the game. Depending on what is installed on your system you might not have a
|
||
monochrome terminal but you can certainly get them. In Red Hat systems these can
|
||
be found in the package ncurses-term but maybe that will vary on others. I don’t
|
||
recall having to install it under macOS nor Fedora but those systems have GUIs
|
||
so that’s probably why; in CentOS I did have to install it specially.</p>
|
||
<p>The <code>-m</code> suffix to terminal names means monochrome. Under Linux this
|
||
terminal is under <code>/usr/share/terminfo/l/linux-m</code> and under macOS (Catalina
|
||
at least) it’s at <code>/usr/share/terminfo/6c/linux-m</code> (for macOS Ventura it’s
|
||
<code>/usr/share/terminfo/6c/linux-m</code>).</p></li>
|
||
<li><p>BOTTOM LINE: Try using a monochrome terminal for the game by e.g.:</p>
|
||
<pre><code> TERM=linux-m ./prog</code></pre>
|
||
<p>And then on your white background terminal the game should keep the
|
||
background white and the foreground black. This will of course mean you have
|
||
no colour but unfortunately changing the background colour of curses would
|
||
eat too many bytes in the entry (I cite the functions in the
|
||
<a href="HACKING.html">HACKING.html</a> (<a href="HACKING.md">HACKING.md</a> on GitHub) file).</p>
|
||
<p>I discuss colours and terminals in much more detail in
|
||
<a href="terminals.html">terminals.html</a> (<a href="terminals.md">terminals.md</a> on GitHub).</p></li>
|
||
</ul>
|
||
<h2 id="the-text-is-hard-to-see-not-bright-enough"><a name="toodark" href="#toc">The text is hard to see (not bright enough)!</a></h2>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: Make sure that your terminal settings have for bold text a
|
||
brighter font. The way I have my terminal profiles set up is to use bright
|
||
colours for bold text. I specifically enable bold in the program so try and find
|
||
out if enabling brighter colours is possible.</p>
|
||
<p>If it’s already set at brighter colours I do not know what to say. Try
|
||
playing with the colours in your terminal, maybe the font size or various
|
||
other settings. Probably better to make a new profile for this first in case
|
||
you mess up your old one. FWIW I haven’t had this problem on consoles only
|
||
and in my systems I have the option to enable brighter colours for bold - it
|
||
was only in testing that I came across this problem.</p></li>
|
||
</ul>
|
||
<h2 id="can-i-move-the-snake-faster-temporarily-without-having-to-modify-the-wait-time"><a name="movefaster" href="#toc">Can I move the snake faster temporarily without having to modify the wait time?</a></h2>
|
||
<p>Yes. The <code>getch()</code> call is non-blocking when the timeout value is positive so
|
||
it’s up to that number of milliseconds.</p>
|
||
<ul>
|
||
<li><p>RESOLUTION #0: All you need to do then is hold down the direction key (or for
|
||
that matter any other key that <code>getch()</code> will pick up on). You can also rapidly
|
||
push the key instead of holding it down.</p></li>
|
||
<li><p>BOTTOM LINE: Depending on the key repeat rate and/or how fast you repeatedly
|
||
hit the key you can have more control over the speed - as long as it is quicker
|
||
than the regular wait time. For negative wait time (drawing mode) you have to
|
||
hit a key every time to move because it is blocking.</p></li>
|
||
</ul>
|
||
<h2 id="on-environmental-variables-more-generally-and-string-to-int-conversions"><a name="envvars" href="#toc">On environmental variables more generally and string to int conversions</a></h2>
|
||
<p>What happens if you do:</p>
|
||
<div class="sourceCode" id="cb12"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="va">WALLS</span><span class="op">=</span> <span class="ex">./prog</span></span></code></pre></div>
|
||
<p>Can you run into the wall since you didn’t specify a value and the default is 1?
|
||
No. That’s not the way it works. By saying WALLS= you have told the system that
|
||
there is that environmental variable. However the way the <code>strtoul()</code> functions
|
||
work is that if there’s no valid input it returns 0. This can be detected but
|
||
it’s wasteful (iocccsize wise) and I have never felt that having invalid input
|
||
for a number could have a better value than 0.</p>
|
||
<p>If however you were to give valid input followed by invalid input the valid
|
||
input would be parsed. For example:</p>
|
||
<div class="sourceCode" id="cb13"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="va">WALLS</span><span class="op">=</span>1test <span class="ex">./prog</span></span></code></pre></div>
|
||
<p>would let you go through the walls. On the other hand</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">WALLS</span><span class="op">=</span>test1 <span class="ex">./prog</span></span></code></pre></div>
|
||
<p>would not. Furthermore if you specify the same variable more than once it’s the
|
||
last one that counts. For example:</p>
|
||
<div class="sourceCode" id="cb15"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="va">WALLS</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="va">CANNIBAL</span><span class="op">=</span>0 <span class="ex">./prog</span></span></code></pre></div>
|
||
<p>would allow you to go through walls but you could not cannibalise.</p>
|
||
<p>Also note that I specify base 0 which means that you can also have it in hex and
|
||
octal. These are all the same:</p>
|
||
<pre><code>SIZE=0x3
|
||
SIZE=3
|
||
SIZE=03</code></pre>
|
||
<p>The way the functions work is if 0x (or 0X) it’s considered hex; if prefixed
|
||
with a 0 it’s octal and otherwise it’s decimal. If you specify invalid data
|
||
(even if only at the beginning of the string) the functions return 0. For
|
||
example:</p>
|
||
<pre><code>SIZE=0
|
||
SIZE=f
|
||
SIZE=-
|
||
SIZE=f1</code></pre>
|
||
<p>are all equivalent.</p>
|
||
<p>Observe that:</p>
|
||
<pre><code>SIZE=08</code></pre>
|
||
<p>is invalid input because octal only has digits 0 - 7: the resulting size will be
|
||
0.</p>
|
||
<p>I discuss the signed/unsigned issue to do with curses and sizes in C being
|
||
unsigned in <a href="bugs.html">bugs.html</a> (<a href="bugs.md">bugs.md</a> on GitHub) but probably there isn’t
|
||
anything more to say here.</p>
|
||
<h2 id="errors-and-error-reporting"><a name="errors" href="#toc">Errors and error reporting</a></h2>
|
||
<p>If curses fails to initialise you should get an error that says ‘curses error’
|
||
and you have every right to curse it to hell if that’s what you so wish.
|
||
Apparently curses will report an error itself if that function fails but that
|
||
escaped my notice until later on so you might get two errors in that case.</p>
|
||
<p>Assuming it succeeds the game obtains the maximum y/x of the terminal. The
|
||
screen size must be at least 10 lines/columns (though in code the number will
|
||
not be 10); if either is smaller you will get ‘screen too small’ and the game
|
||
will end (yes things that haven’t begun can be ended).</p>
|
||
<p>If <code>calloc()</code> fails to obtain the needed memory you’ll see something like (here it
|
||
was before I added proper - to make the perfect and obvious pun - capsizing
|
||
so that by setting the size to -1 it went to the max unsigned value):</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="ex">$</span> MAXSIZE=-1 ./prog</span>
|
||
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a><span class="ex">memory</span> error</span>
|
||
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a><span class="ex">X:0/157</span> Y:0/42 S:3/18446744073709551614 B:0</span></code></pre></div>
|
||
<p>BTW: There are two arrays that have to be <strong>MAXSIZE</strong> (technically + 1).</p>
|
||
<p>Is it possible that some value specified by the user could mess this up? I do
|
||
not know but what I do know is that because it’s unsigned it can’t be negative;
|
||
if the max size is 0 then the array size will be 1 but it won’t matter because
|
||
the snake size will be >= that max anyway. But here’s a curious output:</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">SIZE</span><span class="op">=</span>1 <span class="va">MAXSIZE</span><span class="op">=</span>0 <span class="ex">./prog</span></span>
|
||
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a><span class="ex">YOU</span> WIN!</span>
|
||
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a><span class="ex">X:78/156</span> Y:20/41 S:0/0 B:0</span></code></pre></div>
|
||
<p>Why does it show snake size as 0 when I specified 1? It’s because the max size
|
||
is 0 and I limit the size to be no bigger than the max size.</p>
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<!-- 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 -->
|
||
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<div class="footer">
|
||
<h2>Copyright and CC BY-SA 4.0 License</h2>
|
||
<p>This file and web page is:</p>
|
||
<blockquote><b>Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.</b></p></blockquote>
|
||
<p>You are free to share and adapt this file under the terms of this license:</p>
|
||
<blockquote><b>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</b></blockquote>
|
||
<p>For more information, see:</p>
|
||
<blockquote><a
|
||
href="https://creativecommons.org/licenses/by-sa/4.0/">https://creativecommons.org/licenses/by-sa/4.0/</a></blockquote>
|
||
<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 -->
|