Fixed errors and documented everything

This commit is contained in:
2014-12-05 03:04:46 +01:00
parent 340aa29d4a
commit a659c072da
22 changed files with 3958 additions and 153 deletions
+693
View File
@@ -0,0 +1,693 @@
<!DOCTYPE html>
<html>
<head>
<title>cnibbles.c</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To &hellip;</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page">
<a class="source" href="cnibbles.html">
cnibbles.c
</a>
<a class="source" href="nibbles.html">
nibbles.S
</a>
<a class="source" href="start.html">
start.S
</a>
</div>
</li>
</ul>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>cnibbles.c</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> &lt;stdio.h&gt;</span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> &lt;stdbool.h&gt;</span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> "helpers.c"</span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> WIDTH 60</span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> HEIGHT 40</span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> DEBUG false</span>
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> startLength = <span class="hljs-number">0</span>;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> startApples = <span class="hljs-number">0</span>;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> currentTick;
<span class="hljs-keyword">int</span> snake[WIDTH*HEIGHT];
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> snakeLength;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> snakeX;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> snakeY;
<span class="hljs-keyword">int</span> snakeDirX;
<span class="hljs-keyword">int</span> snakeDirY;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> numApples;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">spawnApple</span><span class="hljs-params">()</span></span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">tick</span><span class="hljs-params">()</span></span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">draw</span><span class="hljs-params">()</span></span>;</pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">&#182;</a>
</div>
<h1 id="start_game">start_game</h1>
</div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">start_game</span><span class="hljs-params">(<span class="hljs-keyword">int</span> len, <span class="hljs-keyword">int</span> n_apples)</span>
</span>{
<span class="hljs-keyword">if</span> (startLength == <span class="hljs-number">0</span>)
startLength = len;
<span class="hljs-keyword">if</span> (startApples == <span class="hljs-number">0</span>)
startApples = n_apples;</pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">&#182;</a>
</div>
<p>Initialize variables</p>
</div>
<div class="content"><div class='highlight'><pre> currentTick = <span class="hljs-number">0</span>;
snakeLength = len;
numApples = n_apples;
nib_init();</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">&#182;</a>
</div>
<p>Initialize the snake array
Set every cell to a time value greater than the snake length</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; WIDTH*HEIGHT; ++i) {
snake[i] = snakeLength;
}</pre></div></div>
</li>
<li id="section-6">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-6">&#182;</a>
</div>
<p>Place the snake head in the middle</p>
</div>
<div class="content"><div class='highlight'><pre> snakeX = WIDTH / <span class="hljs-number">2</span>;
snakeY = HEIGHT / <span class="hljs-number">2</span>;
snakeDirX = <span class="hljs-number">0</span>;
snakeDirY = -<span class="hljs-number">1</span>;</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">&#182;</a>
</div>
<p>Place the initial snake segments, downwards or something</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; snakeLength; ++i) {
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> x = snakeX % WIDTH;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> y = (snakeY + i) % HEIGHT;
snake[x + y*WIDTH] = i;
}</pre></div></div>
</li>
<li id="section-8">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-8">&#182;</a>
</div>
<p>Place apples</p>
</div>
<div class="content"><div class='highlight'><pre> srand(time(<span class="hljs-number">0</span>));
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; numApples; ++i) {
spawnApple();
}
<span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>) {
tick();
draw();
}
}</pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-9">&#182;</a>
</div>
<h1 id="spawnapple">spawnApple</h1>
</div>
</li>
<li id="section-10">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-10">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">spawnApple</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> x = rand() % WIDTH;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> y = rand() % HEIGHT;
<span class="hljs-keyword">while</span> (snake[x + y*WIDTH] &lt; snakeLength) {
x = rand() % WIDTH;
y = rand() % HEIGHT;
}
snake[x + y*WIDTH] = -<span class="hljs-number">1</span>;
}</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-11">&#182;</a>
</div>
<h1 id="tick">tick</h1>
</div>
</li>
<li id="section-12">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-12">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">tick</span><span class="hljs-params">()</span>
</span>{
currentTick++;</pre></div></div>
</li>
<li id="section-13">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-13">&#182;</a>
</div>
<h2 id="increment-cell-times">Increment cell times</h2>
</div>
</li>
<li id="section-14">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-14">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; WIDTH*HEIGHT; ++i) {
<span class="hljs-keyword">int</span> val = snake[i];
<span class="hljs-keyword">if</span> (val &lt; <span class="hljs-number">0</span>) {</pre></div></div>
</li>
<li id="section-15">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-15">&#182;</a>
</div>
<p>Apple lifetime</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-comment">/* snake[i]--; */</span>
} <span class="hljs-function"><span class="hljs-keyword">else</span> <span class="hljs-title">if</span> <span class="hljs-params">(val &gt;= 0 &amp;&amp; val &lt;= snakeLength)</span> </span>{</pre></div></div>
</li>
<li id="section-16">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-16">&#182;</a>
</div>
<p>Other cells</p>
</div>
<div class="content"><div class='highlight'><pre> snake[i]++;
}
}</pre></div></div>
</li>
<li id="section-17">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-17">&#182;</a>
</div>
<h2 id="input">Input</h2>
</div>
</li>
<li id="section-18">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-18">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">int</span> key = nib_poll_kbd();
<span class="hljs-keyword">if</span> (key == <span class="hljs-string">'w'</span> &amp;&amp; snakeDirY != <span class="hljs-number">1</span>) {
snakeDirX = <span class="hljs-number">0</span>;
snakeDirY = -<span class="hljs-number">1</span>;
}
<span class="hljs-keyword">if</span> (key == <span class="hljs-string">'s'</span> &amp;&amp; snakeDirY != -<span class="hljs-number">1</span>) {
snakeDirX = <span class="hljs-number">0</span>;
snakeDirY = <span class="hljs-number">1</span>;
}
<span class="hljs-keyword">if</span> (key == <span class="hljs-string">'a'</span> &amp;&amp; snakeDirX != <span class="hljs-number">1</span>) {
snakeDirX = -<span class="hljs-number">1</span>;
snakeDirY = <span class="hljs-number">0</span>;
}
<span class="hljs-keyword">if</span> (key == <span class="hljs-string">'d'</span> &amp;&amp; snakeDirX != -<span class="hljs-number">1</span>) {
snakeDirX = <span class="hljs-number">1</span>;
snakeDirY = <span class="hljs-number">0</span>;
}</pre></div></div>
</li>
<li id="section-19">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-19">&#182;</a>
</div>
<h2 id="move-snake">Move snake</h2>
</div>
</li>
<li id="section-20">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-20">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> snakeX = (snakeX + snakeDirX + WIDTH) % WIDTH;
snakeY = (snakeY + snakeDirY + HEIGHT) % HEIGHT;</pre></div></div>
</li>
<li id="section-21">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-21">&#182;</a>
</div>
<h2 id="collision">Collision</h2>
</div>
</li>
<li id="section-22">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-22">&#182;</a>
</div>
<p>On collision with self</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">int</span> val = snake[snakeX + snakeY*WIDTH];
<span class="hljs-keyword">if</span> (val &lt; snakeLength &amp;&amp; val &gt;= <span class="hljs-number">0</span>) {</pre></div></div>
</li>
<li id="section-23">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-23">&#182;</a>
</div>
<p>nib_end();</p>
</div>
<div class="content"><div class='highlight'><pre> start_game(startLength, startApples);
}</pre></div></div>
</li>
<li id="section-24">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-24">&#182;</a>
</div>
<p>ON collision with apple</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (val &lt; <span class="hljs-number">0</span>) {</pre></div></div>
</li>
<li id="section-25">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-25">&#182;</a>
</div>
<p>Spawn a new apple somewhere</p>
</div>
<div class="content"><div class='highlight'><pre> spawnApple();</pre></div></div>
</li>
<li id="section-26">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-26">&#182;</a>
</div>
<p>Increase our length!</p>
</div>
<div class="content"><div class='highlight'><pre> snakeLength++;
}</pre></div></div>
</li>
<li id="section-27">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-27">&#182;</a>
</div>
<h2 id="update-world">Update world</h2>
</div>
</li>
<li id="section-28">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-28">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> snake[snakeX + snakeY*WIDTH] = <span class="hljs-number">0</span>;
}</pre></div></div>
</li>
<li id="section-29">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-29">&#182;</a>
</div>
<h1 id="draw">draw</h1>
</div>
</li>
<li id="section-30">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-30">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">draw</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">char</span> body[] = <span class="hljs-string">"NIBBLES"</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> y = -<span class="hljs-number">1</span>; y &lt;= HEIGHT; ++y) {
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> x = -<span class="hljs-number">1</span>; x &lt;= WIDTH; ++x) {</pre></div></div>
</li>
<li id="section-31">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-31">&#182;</a>
</div>
<p>Draw a border outside the playing field</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (x == -<span class="hljs-number">1</span> || y == -<span class="hljs-number">1</span> || x == WIDTH || y == HEIGHT) {
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> screenX = x + <span class="hljs-number">1</span>;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> screenY = y + <span class="hljs-number">1</span>;
nib_put_scr(screenX, screenY, <span class="hljs-string">'#'</span>);
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">int</span> snakeVal = snake[x + y*WIDTH];
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> screenX = x + <span class="hljs-number">1</span>;
<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> screenY = y + <span class="hljs-number">1</span>;</pre></div></div>
</li>
<li id="section-32">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-32">&#182;</a>
</div>
<p>If the <code>DEBUG</code> flag is set, draw the raw ASCII-value for debugging purposes</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (DEBUG) {
nib_put_scr(screenX, screenY, <span class="hljs-string">'0'</span> + snakeVal);
<span class="hljs-keyword">continue</span>;
}</pre></div></div>
</li>
<li id="section-33">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-33">&#182;</a>
</div>
<p>If the value is greater than <code>0</code> and less than <code>snakeLength</code>, its part of the snake</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (snakeVal &gt;= <span class="hljs-number">0</span> &amp;&amp; snakeVal &lt; snakeLength) {
<span class="hljs-keyword">if</span> (x == snakeX &amp;&amp; y == snakeY) {</pre></div></div>
</li>
<li id="section-34">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-34">&#182;</a>
</div>
<p>Draw the head</p>
</div>
<div class="content"><div class='highlight'><pre> nib_put_scr(screenX, screenY, <span class="hljs-string">'@'</span>);
} <span class="hljs-keyword">else</span> {</pre></div></div>
</li>
<li id="section-35">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-35">&#182;</a>
</div>
<p>Draw the body</p>
</div>
<div class="content"><div class='highlight'><pre> nib_put_scr(screenX, screenY, body[(snakeVal - <span class="hljs-number">1</span>) % <span class="hljs-number">7</span>]);
}
} <span class="hljs-function"><span class="hljs-keyword">else</span> <span class="hljs-title">if</span> <span class="hljs-params">(snakeVal &lt; 0)</span> </span>{</pre></div></div>
</li>
<li id="section-36">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-36">&#182;</a>
</div>
<p>If the value is less than <code>0</code>, its an apple</p>
</div>
<div class="content"><div class='highlight'><pre> nib_put_scr(screenX, screenY, <span class="hljs-string">'o'</span>);
} <span class="hljs-keyword">else</span> {</pre></div></div>
</li>
<li id="section-37">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-37">&#182;</a>
</div>
<p>Otherwise its empty.</p>
</div>
<div class="content"><div class='highlight'><pre> nib_put_scr(screenX, screenY, <span class="hljs-string">' '</span>);
}
}
}
}
}</pre></div></div>
</li>
</ul>
</div>
</body>
</html>