Files
nibbles/docs/cnibbles.html
T

694 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>