<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Game | Learn C Games Programming Blog</title>
	<atom:link href="https://learncgames.com/category/game/feed/" rel="self" type="application/rss+xml" />
	<link>https://learncgames.com</link>
	<description>A blog about C, programming games and my ebook(s).</description>
	<lastBuildDate>Wed, 18 Feb 2026 13:48:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://learncgames.com/wp-content/uploads/2020/03/cropped-favicon-32x32.png</url>
	<title>Game | Learn C Games Programming Blog</title>
	<link>https://learncgames.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">181446779</site>	<item>
		<title>The joys of Flutter web</title>
		<link>https://learncgames.com/the-joys-of-flutter-web/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-joys-of-flutter-web</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 16 Feb 2026 20:41:47 +0000</pubDate>
				<category><![CDATA[Dart]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[hexmap]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3513</guid>

					<description><![CDATA[<p>Originally I was going to use Tiled to draw hexagons in a Flutter web game. But it seemed easier to do it manually without having to worry about working with the .tmx format which is an all singing format based on a XML file structure, and seems more suited to static maps. My game includes [&#8230;]</p>
The post <a href="https://learncgames.com/the-joys-of-flutter-web/">The joys of Flutter web</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" class="alignleft size-full wp-image-3514" src="https://learncgames.com/wp-content/uploads/2026/02/hexmap.png" alt="Hexmap running at 10.9 fps" width="934" height="877" srcset="https://learncgames.com/wp-content/uploads/2026/02/hexmap.png 934w, https://learncgames.com/wp-content/uploads/2026/02/hexmap-300x282.png 300w, https://learncgames.com/wp-content/uploads/2026/02/hexmap-768x721.png 768w" sizes="(max-width: 934px) 100vw, 934px" />Originally I was going to use Tiled to draw hexagons in a Flutter web game. But it seemed easier to do it manually without having to worry about working with the .tmx format which is an all singing format based on a XML file structure, and seems more suited to static maps.</p>
<p>My game includes a map generator although that&#8217;s not hooled up yet.</p>
<p>I&#8217;ve been doing experiments and have a Flutter web program displaying a 40 x 40 hexes map, complete with text. It does this at around 6-10 fps.   This is on a 3 1/2 year old PC. I think it should be sufficent frame rate for a web strategy game. It also displays images and there&#8217;s a faint one on the sizth row.</p>
<p>If you look very closely in the middle of the ninth row you might see a hex with the value 2 that&#8217;s been clicked on with a faint circle highighting it.</p>
<p>The hexes aren&#8217;t quite meshing together with a solid border so that needs sorting.</p>The post <a href="https://learncgames.com/the-joys-of-flutter-web/">The joys of Flutter web</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3513</post-id>	</item>
		<item>
		<title>A silly bug in Flutter/Dart</title>
		<link>https://learncgames.com/a-silly-bug-in-flutter-dart/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-silly-bug-in-flutter-dart</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Thu, 30 Oct 2025 20:42:22 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[postal game]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3469</guid>

					<description><![CDATA[<p>So I&#8217;m developing a web postal* game client which is loaded from a Linux server as a Flutter web app. When I run it on the Linux box from Chromium, no problems, it loads a binary file ok. When I try to run it from a networked Windows box, the binary file fails to load. [&#8230;]</p>
The post <a href="https://learncgames.com/a-silly-bug-in-flutter-dart/">A silly bug in Flutter/Dart</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<figure id="attachment_3470" aria-describedby="caption-attachment-3470" style="width: 512px" class="wp-caption alignleft"><img decoding="async" class="wp-image-3470" src="https://learncgames.com/wp-content/uploads/2025/10/robotpostman.jpg" alt="Robot postman" width="512" height="512" srcset="https://learncgames.com/wp-content/uploads/2025/10/robotpostman.jpg 1024w, https://learncgames.com/wp-content/uploads/2025/10/robotpostman-300x300.jpg 300w, https://learncgames.com/wp-content/uploads/2025/10/robotpostman-150x150.jpg 150w, https://learncgames.com/wp-content/uploads/2025/10/robotpostman-768x768.jpg 768w, https://learncgames.com/wp-content/uploads/2025/10/robotpostman-250x250.jpg 250w" sizes="(max-width: 512px) 100vw, 512px" /><figcaption id="caption-attachment-3470" class="wp-caption-text">Generated by Gemini</figcaption></figure>
<p>So I&#8217;m developing a web postal* game client which is loaded from a Linux server as a Flutter web app. When I run it on the Linux box from Chromium, no problems, it loads a binary file ok. When I try to run it from a networked Windows box, the binary file fails to load. It&#8217;s loaded by calling a PHP endpoint, passing the path of the file to a PHP script.</p>
<p>It was my fault. Because the game client is loaded from the Linux server and the path is a Linux path to the binary file, I&#8217;d missed that it runs on the Windows box (where the browser launches from). I&#8217;d used Platform.isLinux and Platform.Windows calls to figure out the path when I initially tested it on a Windows box.  The path to the binary file was being sent as if the file was on the Windows box because the Flutter app runs as JavaScript in the browser there. D&#8217;oh!</p>
<p>*<em>Postal means a game where the game client sends orders to the server. Those are processed once an hour and the results file is picked up when the client next runs. It&#8217;s how games used to be played through the post back 30 or 40 years ago hence the name. </em></p>
<p>&nbsp;</p>The post <a href="https://learncgames.com/a-silly-bug-in-flutter-dart/">A silly bug in Flutter/Dart</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3469</post-id>	</item>
		<item>
		<title>Don&#8217;t get Flutter and Dart mixed up</title>
		<link>https://learncgames.com/dont-get-flutter-and-dart-mixed-up/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dont-get-flutter-and-dart-mixed-up</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 19:23:05 +0000</pubDate>
				<category><![CDATA[Dart]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3445</guid>

					<description><![CDATA[<p>I&#8217;m working on a game with a Flutter web client and two Dart terminal programs hence the visual pun. Annoyingly, you can&#8217;t compile a Dart exe for Linux on a Windows PC. You can do that in C# but I prefer to use Dart. I have all the classes in two files (one is called [&#8230;]</p>
The post <a href="https://learncgames.com/dont-get-flutter-and-dart-mixed-up/">Don’t get Flutter and Dart mixed up</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:7,&quot;href&quot;:&quot;https:\/\/pub.dev\/packages\/build_runner&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260206102527\/https:\/\/pub.dev\/packages\/build_runner&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 12:54:04&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-09 23:16:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-13 08:02:32&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-16 19:00:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-20 07:40:25&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-23 23:30:06&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 08:43:00&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-02 21:09:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 07:02:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-09 12:45:10&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-12 22:45:04&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-16 06:35:10&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-19 14:24:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 20:20:00&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 02:58:10&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-29 13:43:28&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-01 16:50:04&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-05 00:55:40&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-08 08:47:37&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-11 09:31:25&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-15 00:28:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-18 08:19:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-21 16:07:41&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-21 16:07:41&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:8,&quot;href&quot;:&quot;https:\/\/api.flutter.dev\/flutter\/foundation\/kIsWeb-constant.html&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20251129000631\/https:\/\/api.flutter.dev\/flutter\/foundation\/kIsWeb-constant.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 10:24:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-09 20:47:15&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 22:29:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-16 07:02:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-19 23:41:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 07:05:39&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:01:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-02 21:09:29&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-06 07:02:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-09 12:45:10&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 22:44:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 05:29:48&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-19 14:24:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-22 20:20:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 02:58:10&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-29 13:43:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-01 16:50:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-05 00:55:41&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-08 08:47:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-11 09:31:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 00:28:36&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 08:19:51&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-21 16:07:41&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-21 16:07:41&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img decoding="async" class="alignleft size-full wp-image-3446" src="https://learncgames.com/wp-content/uploads/2025/08/flutterandDarts.png" alt="A bird a Flutter and Darts" width="512" height="512" srcset="https://learncgames.com/wp-content/uploads/2025/08/flutterandDarts.png 512w, https://learncgames.com/wp-content/uploads/2025/08/flutterandDarts-300x300.png 300w, https://learncgames.com/wp-content/uploads/2025/08/flutterandDarts-150x150.png 150w, https://learncgames.com/wp-content/uploads/2025/08/flutterandDarts-250x250.png 250w" sizes="(max-width: 512px) 100vw, 512px" /></p>
<p>I&#8217;m working on a game with a Flutter web client and two Dart terminal programs hence the visual pun. Annoyingly, you can&#8217;t compile a Dart exe for Linux on a Windows PC. You can do that in C# but I prefer to use Dart.</p>
<p>I have all the classes in two files (one is called classes.dart) and because I&#8217;m using JSON to persist game data, I use the <a title="Linbk to build_runner on pub.dev" href="https://pub.dev/packages/build_runner" target="_blank" rel="noopener">build_runner</a> package from pub.dev. Just add this before any classes:</p>
<div>
<pre>@JsonSerializable()</pre>
</div>
<div>
<p>Make sure if you have enums that every enum value has</p>
<div>
<pre>@JsonValue('houses')</pre>
</div>
<p>before it and add functions like this for each class you want to persist; in this case a Location class:</p>
<div>
<pre>factory Location.fromJson(Map&lt;String, dynamic&gt; json) =&gt;
    _$LocationFromJson(json);

Map&lt;String, dynamic&gt; toJson() =&gt; _$LocationToJson(this);</pre>
</div>
<p>Then when it&#8217;s all done, do this to generate a file that handles loading and saving the specified classes.</p>
<pre>dart run build_runner build</pre>
</div>
<p>Along the way though I managed to get Flutter into a Dart program. I&#8217;m using SQLite but only in Dart, not in the Flutter app. Unfortunately I used the <a title="Link to Dart API documentation for kIsWeb" href="https://api.flutter.dev/flutter/foundation/kIsWeb-constant.html" target="_blank" rel="noopener"><strong>kIsWeb</strong> constant</a> to exclude some calls (when the classes are used by the Flutter app) in my classes file.  But you can&#8217;t do that in a pure Dart program, it will not compile. Instead I wrote my own function.</p>
<div>
<pre>bool isWeb() {
  return !Platform.isWindows &amp;&amp; !Platform.isLinux;
}</pre>
</div>
<p>Interestingly, the definition of kIsWeb in the API is this below, so it might be worth trying that out.</p>
<p><span class="hljs-keyword">const</span> <span class="hljs-built_in">bool</span> kIsWeb = <span class="hljs-built_in">bool</span>.fromEnvironment(<span class="hljs-string">&#8216;dart.library.js_util&#8217;</span>);</p>The post <a href="https://learncgames.com/dont-get-flutter-and-dart-mixed-up/">Don’t get Flutter and Dart mixed up</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3445</post-id>	</item>
		<item>
		<title>Yet another curious bug</title>
		<link>https://learncgames.com/yet-another-curious-bug/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yet-another-curious-bug</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Sun, 26 Mar 2023 23:00:37 +0000</pubDate>
				<category><![CDATA[bugs]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[game]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3225</guid>

					<description><![CDATA[<p>I&#8217;m aware that C is notorious for unexpected behaviour (UB). Let me describe this bug: My second game in C + SDL for my newest eBook is Match Three and compiled with Clang-11 on my Raspberry Pi 4B. I&#8217;m getting a weird bug that doesn&#8217;t occur when I compile it on Windows under MSVC; the [&#8230;]</p>
The post <a href="https://learncgames.com/yet-another-curious-bug/">Yet another curious bug</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-3227" src="https://learncgames.com/wp-content/uploads/2023/03/matchthree-bug-300x233.png" alt="MatchThree latest version with a bug" width="300" height="233" srcset="https://learncgames.com/wp-content/uploads/2023/03/matchthree-bug-300x233.png 300w, https://learncgames.com/wp-content/uploads/2023/03/matchthree-bug-1024x796.png 1024w, https://learncgames.com/wp-content/uploads/2023/03/matchthree-bug-768x597.png 768w, https://learncgames.com/wp-content/uploads/2023/03/matchthree-bug.png 1036w" sizes="auto, (max-width: 300px) 100vw, 300px" />I&#8217;m aware that C is notorious for unexpected behaviour (UB). Let me describe this bug:</p>
<div data-reddit-rtjson="{&quot;entityMap&quot;:{},&quot;blocks&quot;:[{&quot;key&quot;:&quot;dbbsn&quot;,&quot;text&quot;:&quot;I'm creating a game in C + SDL for an eBook in C and compiled it with Clang-11 on my Raspberry Pi 4B. I'm getting a weird bug that doesn't occur when I compile it on Windows under MSVC; the only differences are the paths to SDL and the sn._s calls but there aren't many of those. Also I compiled it with clang-14 on Ubuntu 22.04 LTS on a Hyper-VM and that behaves properly. &quot;,&quot;type&quot;:&quot;unstyled&quot;,&quot;depth&quot;:0,&quot;inlineStyleRanges&quot;:[],&quot;entityRanges&quot;:[],&quot;data&quot;:{}},{&quot;key&quot;:&quot;34s6i&quot;,&quot;text&quot;:&quot;The weird bug is this. The game is a MatchThree game with 10 x 10 pieces. A 2D array of structs. One field is a field called size. It's 0 normally but if &gt; 0 then it is dec'd and the piece is drawn rotated by 8 degrees. When it reaches 0 the piece is removed. &quot;,&quot;type&quot;:&quot;unstyled&quot;,&quot;depth&quot;:0,&quot;inlineStyleRanges&quot;:[],&quot;entityRanges&quot;:[],&quot;data&quot;:{}}]}">
<div class="" data-block="true" data-editor="35ef0f" data-offset-key="35ef0f_initial-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="35ef0f_initial-0-0"><span data-offset-key="35ef0f_initial-0-0">My second game in C + SDL for my newest eBook is Match Three and compiled with Clang-11 on my Raspberry Pi 4B. I&#8217;m getting a weird bug that doesn&#8217;t occur when I compile it on Windows under MSVC; the only differences between the source code on the PI and Windows are the paths to SDL and the sn._s calls but there aren&#8217;t many of those. Also I compiled it with clang-14 on Ubuntu 22.04 LTS on a Hyper-VM and that behaves properly.</span></div>
</div>
<p>&nbsp;</p>
<div data-offset-key="35ef0f_initial-0-0"></div>
<div class="" data-block="true" data-editor="35ef0f" data-offset-key="4u8u6-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4u8u6-0-0"><span data-offset-key="4u8u6-0-0">Each piece is held a struct in a 10 x 10 array. One field is  called size. It&#8217;s 0 normally but if it is set to a value, typically  64 then it counts down, one per frame and the piece is drawn rotated by 8 degrees each frame. When it reaches 0 the piece is removed. This is my &#8220;down the plughole&#8221; way of removing pieces. It takes exactly 64/60 seconds to vanish. I use the size field to draw it when size is non-zero so it shrinks as it rotates It&#8217;s a nice effect.</span></div>
</div>
</div>
<p>&nbsp;</p>
<div data-offset-key="4u8u6-0-0"></div>
<div data-offset-key="4u8u6-0-0"></div>
<div data-offset-key="4u8u6-0-0">The bug though is that when it starts up, several pieces start rotating and keep rotating. The size field stays at 63. There&#8217;s no code that explains this behaviour and it only happens on the Raspberry Pi, not on Windows or on Ubuntu. Is it a compiler bug or some weird UB on the PI version. It&#8217;s an interesting bug and I&#8217;ve only wasted a week of evenings on it so far!</div>
<p></p>The post <a href="https://learncgames.com/yet-another-curious-bug/">Yet another curious bug</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3225</post-id>	</item>
		<item>
		<title>How to create a Controller Map on Raspberry Pi</title>
		<link>https://learncgames.com/how-to-create-a-controller-map-on-raspberry-pi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-create-a-controller-map-on-raspberry-pi</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 27 Dec 2022 00:00:58 +0000</pubDate>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[utility]]></category>
		<category><![CDATA[gamepqd]]></category>
		<category><![CDATA[mapping]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3159</guid>

					<description><![CDATA[<p>Updated 20/03/2025 I&#8217;ve since discovered since I got a Raspi 5 that the install-tools are no longer built and included when you install SDL2 which means controllermap used in this article isn&#8217;t easily available. However the source code is available (and all the tests) and only needs a bit of tweaking to build it on [&#8230;]</p>
The post <a href="https://learncgames.com/how-to-create-a-controller-map-on-raspberry-pi/">How to create a Controller Map on Raspberry Pi</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<h2><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3168" src="https://learncgames.com/wp-content/uploads/2022/12/gamecontrollermap.png" alt="Game Controller map screenshot" width="618" height="399" srcset="https://learncgames.com/wp-content/uploads/2022/12/gamecontrollermap.png 618w, https://learncgames.com/wp-content/uploads/2022/12/gamecontrollermap-300x194.png 300w" sizes="auto, (max-width: 618px) 100vw, 618px" />Updated 20/03/2025</h2>
<p>I&#8217;ve since discovered since I got a Raspi 5 that the install-tools are no longer built and included when you install SDL2 which means controllermap used in this article isn&#8217;t easily available.</p>
<p>However the source code is available (and all the tests) and only needs a bit of tweaking to build it on a Raspberry Pi.</p>
<p>I will add a tutorial to build it and will link to it once done.</p>
<p>&#8212; Rest of article &#8212;</p>
<p>I&#8217;ve been working on my 2nd eBook and adding a GamePad is a thing I need to explain. You can see them in earlier blog posts:</p>
<ol>
<li><a title="Link to blog post fun with gamepads" href="https://learncgames.com/fun-with-game-pads/" target="_blank" rel="noopener">Fun with gamepads</a>.</li>
<li><a title="Link to More on Raspberry Pi Gamepads" href="https://learncgames.com/more-on-raspberry-pi-gamepad/" target="_blank" rel="noopener">More on Raspberry Pi Gamepads</a>.</li>
</ol>
<p>But I want readers of the book to be able to generate their own controller maps. I cannot assume that everyone has access to Windows.</p>
<p>What I didn&#8217;t know back then is that SDL comes with a game controller map generator application called (subtle this!) <strong>controllermap </strong>that you can run on your Pi or Linux computer.</p>
<p>&nbsp;</p>
<p>I had to use the File Manager <em>Find file</em> facility to locate it. It&#8217;s in the installed-tests folder for SDL2 or more precisely <strong>/usr/lib/aarch64-linux-gnu/installed-tests/SDL2 </strong>on my Raspberry Pi running 64-bit Raspberry Pi OS.</p>
<p>On my VM Ubuntu I found it in <strong>/usr/lib/x86-64-linux-gnu/installed-tests/SDL2</strong></p>
<p>I did a bit of experimenting with a clean Raspberry Pi OS setup and then I installed <strong>libsdl2-dev</strong> and saw the <strong>installed-tests/SDL2</strong> folder installed, so that&#8217;s what you need. So install the dev files as per <a title="Link to Tutorial on installing SDL on Linux" href="https://learncgames.com/new-tutorial-on-installing-sdl-on-linux/" target="_blank" rel="noopener">New tutorial on installing SDL on Linux.</a></p>
<p>Plug in a gamepad and on your Pi, cd into that folder (<em>the Pi one not the Ubuntu one!</em>)  and in a terminal run <strong>./controllermap</strong></p>
<p><img loading="lazy" decoding="async" class="alignleft wp-image-566 size-medium" src="https://learncgames.com/wp-content/uploads/2020/04/usb-joypad-300x131.png" alt="USB Joypad" width="300" height="131" srcset="https://learncgames.com/wp-content/uploads/2020/04/usb-joypad-300x131.png 300w, https://learncgames.com/wp-content/uploads/2020/04/usb-joypad.png 454w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p>It will open with your B button highlighted. Press your B button. In the picture above it&#8217;s the circle on the right hand side that is the lowest of the four or the yellow button in this picture of my controller.</p>
<p>It will then go through every possible button.  Just press the corresponding button or space key if you haven&#8217;t got that. Compared to the main picture, mine lacks the two bottom joysticks, the buttons between the Stop and Start buttons and the two trigger buttons at the top. For each of those just press the space bar.  Eventually it will loop back to the B button. Just press it and it will finish and output the gamepad control map.</p>
<p>It outputs two copies of this. You can send one to a text file in your home folder by doing</p>
<p><strong>./controllermap &gt;~/gamepad.txt </strong></p>
<p>but you will have to press all the buttons etc. again. This is what my Pi gave.</p>
<p>030000001008000001e5000010010000,usb gamepad,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,</p>
<p>And that is what you use in SDL2 code.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://learncgames.com/how-to-create-a-controller-map-on-raspberry-pi/">How to create a Controller Map on Raspberry Pi</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3159</post-id>	</item>
		<item>
		<title>Update to the Windows eBook</title>
		<link>https://learncgames.com/update-to-the-windows-ebook/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=update-to-the-windows-ebook</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Sun, 27 Nov 2022 11:28:17 +0000</pubDate>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Ebook]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[SDL]]></category>
		<category><![CDATA[asteroids]]></category>
		<category><![CDATA[Sounds]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3101</guid>

					<description><![CDATA[<p>A reader asked me how to setup SDL2 for Windows given recent changes in SDL2. Specifically the files and libsdl projects have been moved from the libsdl.org website to GitHub. You can easily find SDL2 Image, Mixer, TTF etc. However it can still be quite daunting setting up Visual Studio for SDL2. You have to [&#8230;]</p>
The post <a href="https://learncgames.com/update-to-the-windows-ebook/">Update to the Windows eBook</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:45,&quot;href&quot;:&quot;https:\/\/github.com\/David-H-Bolton\/LearnC\/blob\/master\/New%20Instructions%20for%20setting%20up%20SDL2%20files%20on%20Windows.pdf&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20221223025630\/https:\/\/github.com\/David-H-Bolton\/LearnC\/blob\/master\/New%20Instructions%20for%20setting%20up%20SDL2%20files%20on%20Windows.pdf&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:15:41&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-02-06 11:15:41&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:46,&quot;href&quot;:&quot;https:\/\/github.com\/libsdl-org\/SDL_mixer&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20251216065846\/https:\/\/github.com\/libsdl-org\/SDL_mixer&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:15:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-09 20:59:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 22:35:49&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-16 07:53:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-19 23:41:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-23 15:31:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 07:19:29&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-02 23:11:24&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-06 15:02:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-10 06:52:11&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-13 14:42:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 22:33:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-20 06:21:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-23 14:10:16&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 22:00:36&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-30 13:45:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 21:39:10&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 05:31:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 13:24:27&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-12 21:15:53&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 05:07:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-19 20:57:01&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 20:57:01&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-3102" src="https://learncgames.com/wp-content/uploads/2022/11/configure-sdl-for-vc-300x116.png" alt="Visual Studio configuration" width="300" height="116" srcset="https://learncgames.com/wp-content/uploads/2022/11/configure-sdl-for-vc-300x116.png 300w, https://learncgames.com/wp-content/uploads/2022/11/configure-sdl-for-vc-768x296.png 768w, https://learncgames.com/wp-content/uploads/2022/11/configure-sdl-for-vc.png 904w" sizes="auto, (max-width: 300px) 100vw, 300px" />A reader asked me how to setup SDL2 for Windows given recent changes in SDL2. Specifically the files and libsdl projects have been moved from the libsdl.org website to GitHub. You can easily find SDL2 Image, Mixer, TTF etc.</p>
<p>However it can still be quite daunting setting up Visual Studio for SDL2. You have to download the specific files, then configure the project properties to specify the include paths for header files and then the lib files, both the path to them and identify the ones you want to use.</p>
<p>As I&#8217;m on my new PC, I bit the bullet and went through the process of setting it up. It took just over an hour to configure it.  I&#8217;ve put it into <a title="Link to Setting up Visual Studio for SDL" href="https://github.com/David-H-Bolton/LearnC/blob/master/New%20Instructions%20for%20setting%20up%20SDL2%20files%20on%20Windows.pdf" target="_blank" rel="nofollow noopener">a PDF</a> that&#8217;s a couple of pages long.</p>
<p>So the game works but only after I disabled the sound code; it was failing in the call to <strong>Mix_OpenAudio()</strong>. I think recent work on the SDL Mixer needs some work on my part. I need to sit down and look at the <a title="Link to SDL Mixer page on GitHub" href="https://github.com/libsdl-org/SDL_mixer" target="_blank" rel="nofollow noopener">SDL Mixer page</a> and figure out what&#8217;s failing. Once that&#8217;s done, I&#8217;ll update the files.</p>
<p>&nbsp;</p>The post <a href="https://learncgames.com/update-to-the-windows-ebook/">Update to the Windows eBook</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3101</post-id>	</item>
		<item>
		<title>Why I hate Assembly language&#8230;</title>
		<link>https://learncgames.com/why-i-hate-assembly-language/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=why-i-hate-assembly-language</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 29 Jun 2022 16:05:16 +0000</pubDate>
				<category><![CDATA[C]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[assembly language]]></category>
		<category><![CDATA[Games]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3060</guid>

					<description><![CDATA[<p>I spent several years in the 1980s programming games. I have a memory of 26 year old me sat hunched over a computer late at night back in 1985. I was working a 60-70 hour week as a partner in a games company. My current game was an American Civil War tactical wargame called Johnny [&#8230;]</p>
The post <a href="https://learncgames.com/why-i-hate-assembly-language/">Why I hate Assembly language…</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:52,&quot;href&quot;:&quot;http:\/\/www.6502.org\/source\/floats\/wozfp1.txt&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250822133323\/http:\/\/6502.org\/source\/floats\/wozfp1.txt&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:26:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 00:11:53&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 16:00:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 15:48:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 23:35:50&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-25 15:24:14&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-01 07:16:27&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-04 23:07:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-08 14:54:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-11 22:46:53&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-15 06:36:54&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-18 14:28:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-21 22:16:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 22:55:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-28 13:54:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 16:40:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-04 05:36:16&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-07 13:27:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-11 13:19:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 02:29:27&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 13:01:13&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-22 01:34:38&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 01:34:38&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:53,&quot;href&quot;:&quot;https:\/\/sites.google.com\/site\/6502asembly\/6502-instruction-set\/lda&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20221026080740\/https:\/\/sites.google.com\/site\/6502asembly\/6502-instruction-set\/lda&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:26:12&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 03:35:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-13 16:00:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 07:50:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-20 23:38:47&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-25 07:25:55&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-28 23:17:14&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-04 15:07:35&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-08 03:11:55&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-11 14:47:27&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 22:37:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 06:28:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-21 14:17:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-24 22:06:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-28 13:54:01&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-31 21:43:08&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-04 05:36:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-07 13:27:29&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-11 18:59:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-15 05:11:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-18 13:01:17&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-22 01:34:44&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 01:34:44&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:54,&quot;href&quot;:&quot;https:\/\/github.com\/wardog1uk\/mikro&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250306135453\/https:\/\/github.com\/wardog1uk\/mikro&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:28:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 03:35:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 16:00:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 07:50:16&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-20 23:38:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 23:26:41&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-28 15:18:16&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-04 07:08:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-07 22:57:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-11 14:47:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-14 22:37:34&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-18 06:28:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-21 14:17:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 22:06:01&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-28 13:54:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 16:40:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-04 05:36:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-07 13:27:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-11 05:21:38&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-14 13:12:39&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-17 21:02:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-21 12:56:57&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-21 12:56:57&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3062" src="https://learncgames.com/wp-content/uploads/2022/06/6502_assembler.png" alt="6502 assembler listing" width="573" height="506" srcset="https://learncgames.com/wp-content/uploads/2022/06/6502_assembler.png 573w, https://learncgames.com/wp-content/uploads/2022/06/6502_assembler-300x265.png 300w" sizes="auto, (max-width: 573px) 100vw, 573px" />I spent several years in the 1980s programming games.</p>
<p>I have a memory of 26 year old me sat hunched over a computer late at night back in 1985. I was working a 60-70 hour week as a partner in a games company. My current game was an American Civil War tactical wargame called <strong>Johnny Reb II</strong>. I was struggling with some &#8216;artificial intelligence&#8217; code for the attackers (Confederate troops) to cross a bridge over a river. On the other side the defenders (Union) were trying to defend the bridge.</p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3065" src="https://learncgames.com/wp-content/uploads/2022/06/johnnyRebII.png" alt="Johnny Reb II" width="284" height="177" /></p>
<p>Artificial Intelligence in games is a completely different thing from ML and Data Science nowadays. Back then it was just a control algorithm for troops reacting to the presence of enemy troops and working out the best routes, targets to attack, whether to retreat and so on.</p>
<p>What made it worse was that the whole thing was written in 6502 assembly language (and later converted to Z80). Back then you had two choices: Basic which was to be honest slow and clunky for writing games or assembly language. If I was doing it now, without a moments hesitation I&#8217;d program it in C. But C compilers for 6502 didn&#8217;t exist back then.</p>
<h3>The Problem with assembly language</h3>
<p>The problem with assembly language is<strong> (a) it&#8217;s slow to write.</strong> You can write 10 lines of C in the same time as ten lines of assembly code. Those ten lines of C will do far more than ten lines of assembly code. In 6502 all you are doing is moving values between registers or register &lt;&gt; memory. Maybe add a number or increment one of the three available registers A, X or Y. These were all 8-bit registers so you couldn&#8217;t even index easily through 64-bit memory. To do 16-bit indexing you stored the 16-bit address in two successive page-0 locations (addresses 0-255) and then used Y as an 8-bit index. You could do the same in page 0- memory with the X register.</p>
<p><strong>(b). It takes a lot of code to do anything in assembly language</strong>. You want floating point arithmetic in 6502? <a title="Link to Steve Wozniak source code for 6502 floating point routines" href="http://www.6502.org/source/floats/wozfp1.txt" target="_blank" rel="noopener">Take a look</a>.  I think Steve Wozniak wrote those for the Apple I/II. What we take for granted in languages like C# or Java or JavaScript is code for high level data structures like dictionaries. I&#8217;m sure it could be done but it takes a fair bit of programming. You don&#8217;t have those in assembly language; all you have to use is simple and not very long arrays.</p>
<p><em> In C# I wrote a program to read a 46 MB text file and produce a sorted count of all words in the file.  It used a Dictionary, took me 30 minutes to write and it ran in 5 seconds.  It would take weeks to do the same in assembler. </em></p>
<p>6502 Page 0 locations were valuable because they made your code both shorter and faster.</p>
<p>I wrote a cross-assembler for 6502 in Z80 as a way to learn Z80. Assemblers use labels (<em>L20, L30, L31 etc. in the screenshot</em>) and I needed a way to hold them efficiently in memory. I ended up with a 26 x 26 index table of 2 byte pointers. If you had a label &#8216;ROUTE&#8217; then there would be a pointer to a chain at the location for [&#8216;R&#8217;][&#8216;O&#8217;]. Each entry in the chain was like this</p>
<ul>
<li>1 byte length of rest of label (i.e. 3 for &#8216;UTE&#8217;) &#8211; 0 marks the end of the chain.</li>
<li>3 bytes to hold &#8216;UTE&#8217;.</li>
<li>2 byte address value</li>
</ul>
<p>No need to hold the whole word as you know the first two letters. It also makes comparing a label against one in the table was faster because it only needed to match against <em>len(label)-2</em> characters.</p>
<p>So the next value in the chain would start after that or be a 0 for the end of the chain. Yes most of the index table might be empty (all 26x26x2= 1352 bytes) but every label in a chain used 2 bytes less than the full label text. So with more than 676 labels you saved memory. Searching for a label was just a matter of walking a chain. Labels were just addresses; so a location could hold a value like a count. You&#8217;d identify it with a label and use that label in 6502 instructions. No variables in assembler; it&#8217;s all addresses&#8230;</p>
<p>With 6502 you need to do two passes to generate code. If you have a label in the first page of memory (0-255) then instructions are only two bytes long and are faster to execute than the three byte instructions. So on the first pass you don&#8217;t know if a <a title="Link to 6502 LDA instruction" href="https://sites.google.com/site/6502asembly/6502-instruction-set/lda" target="_blank" rel="noopener">LDA label</a> will be 2 or 3 bytes long. After the first pass through though you do know now, so on the 2nd pass it can output the correct size instructions.</p>
<p>Programming in assembler means you have to write a lot of code and in the early days before I had a development machine that meant I had to save the source code to tape and compile it using a cartridge assembler. The CBM-64 could take cartridges and one of them stored assembly language in RAM just like Basic. If the game did something wrong then the CBM-64 would reset and you&#8217;d lose your source and have to reload it from the slow tape. Let&#8217;s hope you didn&#8217;t forget to save changes before you ran it. I spent a few hours gnashing my teeth over a persistent crash. I was calling a CLR routine when it should have been CLS! d&#8217;oh&#8230;</p>
<p>Note, from memory it was <a href="https://github.com/wardog1uk/mikro" target="_blank" rel="noopener">the Mikro cartridge assembler</a>. See screenshot below.</p>
<figure id="attachment_3063" aria-describedby="caption-attachment-3063" style="width: 384px" class="wp-caption alignleft"><img loading="lazy" decoding="async" class="size-full wp-image-3063" src="https://learncgames.com/wp-content/uploads/2022/06/mikro-assemblert.png" alt="Miro assembler start up screen. " width="384" height="272" srcset="https://learncgames.com/wp-content/uploads/2022/06/mikro-assemblert.png 384w, https://learncgames.com/wp-content/uploads/2022/06/mikro-assemblert-300x213.png 300w" sizes="auto, (max-width: 384px) 100vw, 384px" /><figcaption id="caption-attachment-3063" class="wp-caption-text">Mikro Assembler Startup From <a href="https://github.com/wardog1uk/mikro" target="_blank" rel="noopener">Github</a></figcaption></figure>
<h3>Jump Tables</h3>
<p>So a game back then might be 5,000 lines of code or longer. That&#8217;s quite a bit to hold in memory, given that you need space for the game machine code, sprites, graphics etc. as well. Plus it&#8217;s wasteful having to recompile the same code over and over again. My cross-assembler did 250 lines per second but divide that by two for the two passes.</p>
<p>So I split up long files into smaller ones and created a jump table at the start. There was no linker so the code was loaded into RAM at fixed addresses. If you had five subroutines in one file then there&#8217;d be five jumps at the start to the actual function. And the files that called those functions just had a block of five calls at the start.</p>
<p>That way you didn&#8217;t have to worry exactly where the function was located in RAM so long as that file was always loaded at the same address.</p>
<p>&nbsp;</p>
<h3>Switching to Development Machines</h3>
<p>It got easier when we switched to development machines. The CBM-64 had a parallel port as did the development machine (<em>Tatung Einstein-a CP/M computer</em>) so a little bit of handler code in the CBM-64 set up the CIA chip to wait for data sent down the parallel cable and put the code directly in RAM. It took no time to load the handler from tape after a crash and then send down the whole file.</p>
<p>Modern CPUs do all sort of optimizing tricks and that&#8217;s even before you use vectorization. Compiler writers know how to generate code that uses these tricks but it would take quite a while to learn them so you could use them in hand-written assembly.</p>
<h2>Conclusion</h2>
<p>Writing in assembler in the 80s was easy to learn. Nowadays I wouldn&#8217;t know where to start- the Intel and AMD CPUs have a lot of different chips in their families so there are variations in what instructions are available. Oh and don&#8217;t forget there&#8217;s ARM CPUs as well.</p>
<p>Writing in C (or even C++) is a lot easier to get into and I very much doubt if you&#8217;d get any better performance in writing things in assembly. Also, it would take a lot longer.</p>The post <a href="https://learncgames.com/why-i-hate-assembly-language/">Why I hate Assembly language…</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3060</post-id>	</item>
		<item>
		<title>Playdate gets nearer to release</title>
		<link>https://learncgames.com/playdate-gets-nearer-to-release/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=playdate-gets-nearer-to-release</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Fri, 04 Mar 2022 00:00:36 +0000</pubDate>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[playdate]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3019</guid>

					<description><![CDATA[<p>Back in May 2020 (nearly two years ago) it was originally announced and the updated release date now looks to be late 2022. Also it&#8217;s $179 not $149. But they have given a lot more details; you can for instance see the hardware spec. Also more relevant is the way of creating games. Either in [&#8230;]</p>
The post <a href="https://learncgames.com/playdate-gets-nearer-to-release/">Playdate gets nearer to release</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:67,&quot;href&quot;:&quot;https:\/\/help.play.date\/hardware\/the-specs&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260131120854\/https:\/\/help.play.date\/hardware\/the-specs\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:36:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 08:10:40&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 23:58:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 22:02:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 07:38:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 23:26:41&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-28 13:10:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 23:09:18&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-07 14:58:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-11 14:47:37&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-14 22:37:34&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-18 06:28:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-21 14:17:01&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 22:06:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-28 13:54:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 21:43:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-04 05:36:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-07 12:00:39&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-11 21:19:36&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 05:11:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 13:01:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-22 01:34:42&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 01:34:42&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:68,&quot;href&quot;:&quot;https:\/\/twitter.com\/playdate\/status\/1498427655175159822&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250625152741\/https:\/\/twitter.com\/playdate\/status\/1498427655175159822&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:36:40&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 08:10:42&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-13 23:58:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 15:48:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-21 15:37:21&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-25 07:26:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-28 13:10:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-03 23:09:16&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-07 19:08:55&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-11 06:48:35&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 14:38:21&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 22:29:04&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-21 06:18:14&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-24 14:07:59&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-28 05:55:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-31 13:43:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-03 21:36:40&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-07 05:28:10&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-10 21:22:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-14 07:07:19&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-17 21:02:12&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-20 23:17:52&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 23:17:52&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:69,&quot;href&quot;:&quot;https:\/\/play.date\/dev&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260204132555\/https:\/\/play.date\/dev\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:36:41&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 08:10:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-13 23:59:11&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 15:48:24&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-21 15:37:29&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-25 15:24:20&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-01 07:16:29&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-04 23:07:27&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-08 14:55:00&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-11 22:46:53&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-15 06:36:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 14:28:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-21 22:16:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-25 06:11:31&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-28 21:53:03&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-01 05:41:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-04 13:35:53&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-07 21:27:20&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-11 13:19:57&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-15 05:11:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-18 13:01:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-22 01:34:47&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 01:34:47&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-537" src="https://learncgames.com/wp-content/uploads/2020/04/playdate-1.png" alt="playdate" width="350" height="296" srcset="https://learncgames.com/wp-content/uploads/2020/04/playdate-1.png 350w, https://learncgames.com/wp-content/uploads/2020/04/playdate-1-300x254.png 300w" sizes="auto, (max-width: 350px) 100vw, 350px" /><a title="Link to Blog entry about Playdate" href="https://learncgames.com/a-new-mini-game-console/" target="_blank" rel="noopener">Back in May 2020</a> (nearly two years ago) it was originally announced and the updated release date now looks to be late 2022. Also it&#8217;s $179 not $149. But they have given a lot more details; you can for instance see the <a title="Link to Play.date spec" href="https://help.play.date/hardware/the-specs/" target="_blank" rel="noopener">hardware spec</a>.</p>
<p>Also more relevant is the way of creating games. Either in Lua + C or just C. The dev tools illustrated are running on a Mac but according to <a title="Twitter thread about playdate" href="https://twitter.com/playdate/status/1498427655175159822" target="_blank" rel="nofollow noopener">this Twitter thread</a> (worth a read), they&#8217;re available for Windows, Mac and Linux.  The SDK looks impressive enough- &#8220;It includes helpful functions for things like font handling, drawing, animation, sprites, tilemaps, collision detection, A* pathfinding, audio synthesis, crank handling and more. You can download the SDK which includes a simulator now from the <a title="Link to Playdate dev page." href="https://play.date/dev/" target="_blank" rel="nofollow noopener">dev page.</a>.</p>
<p>Would I get one? I&#8217;m toying with the idea. A mono display of 400 x 200 is a bit retroish and my days of creating those types of games are probably long behind me, but it&#8217;s tempting.</p>The post <a href="https://learncgames.com/playdate-gets-nearer-to-release/">Playdate gets nearer to release</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3019</post-id>	</item>
		<item>
		<title>Dealing with artists for game graphics</title>
		<link>https://learncgames.com/dealing-with-artists-for-game-graphics/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dealing-with-artists-for-game-graphics</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 02 Mar 2022 00:00:38 +0000</pubDate>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[artists]]></category>
		<category><![CDATA[artwork]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3012</guid>

					<description><![CDATA[<p>I&#8217;m working on three game projects (my side projects), One is Flutter front end plus C# back end, another is the same but a different type of back end and the third is a mobile game with C# backend but its put to one side until the others are done. These are all side projects. [&#8230;]</p>
The post <a href="https://learncgames.com/dealing-with-artists-for-game-graphics/">Dealing with artists for game graphics</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-3014" src="https://learncgames.com/wp-content/uploads/2022/03/factories-300x112.jpg" alt="Factory graphics" width="300" height="112" srcset="https://learncgames.com/wp-content/uploads/2022/03/factories-300x112.jpg 300w, https://learncgames.com/wp-content/uploads/2022/03/factories-1024x383.jpg 1024w, https://learncgames.com/wp-content/uploads/2022/03/factories-768x287.jpg 768w, https://learncgames.com/wp-content/uploads/2022/03/factories-1536x574.jpg 1536w, https://learncgames.com/wp-content/uploads/2022/03/factories-2048x765.jpg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" />I&#8217;m working on three game projects (my side projects), One is Flutter front end plus C# back end, another is the same but a different type of back end and the third is a mobile game with C# backend but its put to one side until the others are done. These are all side projects.</p>
<p>I&#8217;ve bought graphics and they do up to a point- e.g. kenney.nl is very good. But sometimes you need something a bit better or that&#8217;s not covered by that library.</p>
<p>Now one of the things I&#8217;ve done is use low costs artists from sites like Fivesquid.com and fiverr.com. Many of these artists are very good but live in countries where things are a lot cheaper than here in the West. Exploitation? Maybe, but they are happy to do the work and it saves me a fortune. What might cost me a couple of hundred pounds here in the UK can be done for say £20.</p>
<p>But I&#8217;ve found when dealing with them that you can&#8217;t take anything for granted. You have to have a bit of patience and explain everything including your expectations. And make sure you nail the price down exactly. I had arranged everything with one to do 35 small graphics and he wanted £35 for each graphic. Despite his advert saying 5 graphics for £10!</p>
<p>So I&#8217;ve found, you need to specify file format (.png or .jpg), layout- single files or in a sheet in a grid. Also fivesquid have a thing where when the order is delivered, you have three days to mark it complete or asks for changes. One artist said it was complete but hadn&#8217;t quite got it ready and the three day period expired before I&#8217;d received anything. So I could hardly accept nothing. It was though a genuine mistake on the part of the artist and I did get the graphics eventually.</p>The post <a href="https://learncgames.com/dealing-with-artists-for-game-graphics/">Dealing with artists for game graphics</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3012</post-id>	</item>
		<item>
		<title>It&#8217;s that book again</title>
		<link>https://learncgames.com/its-that-book-again/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=its-that-book-again</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 01 Mar 2022 09:18:03 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[book]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3010</guid>

					<description><![CDATA[<p>One of my favourites and one that I actually bought twice in my life and of course I have mentioned before. Originally I bought it back in 1982 and more recently in 2015 along with the sister &#8220;More Computer Games&#8221; book. The reason  I mention it because there&#8217;s an ongoing project to do the games [&#8230;]</p>
The post <a href="https://learncgames.com/its-that-book-again/">It’s that book again</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:70,&quot;href&quot;:&quot;https:\/\/github.com\/coding-horror\/basic-computer-games?utm_campaign=explore-email&amp;utm_medium=email&amp;utm_source=newsletter&amp;utm_term=weekly&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-884" src="https://learncgames.com/wp-content/uploads/2020/06/basiccomputergames.jpg" alt="Basic Computer games book" width="355" height="436" srcset="https://learncgames.com/wp-content/uploads/2020/06/basiccomputergames.jpg 355w, https://learncgames.com/wp-content/uploads/2020/06/basiccomputergames-244x300.jpg 244w" sizes="auto, (max-width: 355px) 100vw, 355px" />One of my favourites and one that I actually bought twice in my life and of course I have mentioned before. Originally I bought it back in 1982 and more recently in 2015 along with the sister &#8220;More Computer Games&#8221; book. The reason  I mention it because there&#8217;s an <a title="Link to Project on GitHub" href="https://github.com/coding-horror/basic-computer-games?utm_campaign=explore-email&amp;utm_medium=email&amp;utm_source=newsletter&amp;utm_term=weekly" target="_blank" rel="noopener">ongoing project</a> to do the games in it in languages other than BASIC.</p>
<p>The languages they&#8217;ve chosen are:</p>
<ul dir="auto">
<li>Java</li>
<li>Python</li>
<li>C#</li>
<li>VB.NET</li>
<li>JavaScript</li>
<li>Ruby</li>
<li>Delphi / Object Pascal</li>
<li>Perl</li>
</ul>
<p>I no, it&#8217;s sad. No C&#8230; But given that it includes C#, I&#8217;ll let them off.</p>The post <a href="https://learncgames.com/its-that-book-again/">It’s that book again</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3010</post-id>	</item>
	</channel>
</rss>
