<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aaron J Spetner</title>
    <description>The latest articles on DEV Community by Aaron J Spetner (@ajspetner).</description>
    <link>https://dev.to/ajspetner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F754608%2F5f05c7f6-7d0e-4b49-864f-0472bc551800.jpg</url>
      <title>DEV Community: Aaron J Spetner</title>
      <link>https://dev.to/ajspetner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajspetner"/>
    <language>en</language>
    <item>
      <title>"Connect Four" Game in Pure CSS (no JavaScript!)</title>
      <dc:creator>Aaron J Spetner</dc:creator>
      <pubDate>Mon, 31 Jan 2022 09:38:50 +0000</pubDate>
      <link>https://dev.to/ajspetner/connect-four-game-in-pure-css-no-javascript-2ib</link>
      <guid>https://dev.to/ajspetner/connect-four-game-in-pure-css-no-javascript-2ib</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;After writing a &lt;a href="https://dev.to/ajspetner/pure-htmlcss-tic-tac-toe-no-js-4l2k"&gt;Tic-Tac-Toe game without any JavaScript&lt;/a&gt;, I challenged myself to do something even more involved. I decided that a nice animated "Connect Four" would be a fun experiment.&lt;/p&gt;

&lt;p&gt;You can see the final version here: &lt;a href="https://codepen.io/AJSpetner/pen/NWveNMw"&gt;https://codepen.io/AJSpetner/pen/NWveNMw&lt;/a&gt;&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/AJSpetner/embed/NWveNMw?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Obviously, this is possibly the worst way to code a "Connect Four" game, but doing challenges like this forces me to think out of the box and sharpens my mind for developing (or managing developers, which is most of what I do these days).&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;Working within the confines of CSS means that there is no real ability to apply logic or maintain memory states other than the state of toggled elements, such as checkboxes and radio buttons. You can create selectors based on combinations of selections, but you are also limited by the narrow scopes of CSS selectors. For example, you can only style based on parent elements or preceding siblings and there is no easy way to style based on the count of toggled elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;As such, I designed this game with 84 (42 for red, 42 for yellow) hidden checkbox &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; elements, each linked to a &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;, both with classes to indicate color, column, and row.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"board-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c1"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c2"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c3"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c4"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c5"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c6"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"r-r1c7"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"move red r1 c7"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The checkboxes are at a level above and/or preceding all other elements within the game. The labels for each column are stacked on top of each other such that the label for the lower cells are on top of the higher cells. When a label's checkbox is checked, the label is hidden, thus allowing the label below it to be clicked.&lt;/p&gt;

&lt;p&gt;The default is to show all red labels and hide all yellow labels, because Red's turn is first. A series of ridiculously long rules checks for every possible odd-number count of checked inputs. If the number of checked inputs is odd, that means we need to hide all red labels and show the yellow ones, because it is Yellow's turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Determining a winner
&lt;/h2&gt;

&lt;p&gt;The rules to check for a winner were actually easier to write, since we just need to check for three match patterns for both red and yellow. A horizontal win is the easiest, as we are just looking for a &lt;strong&gt;checked&lt;/strong&gt; box immediately followed by three &lt;strong&gt;checked&lt;/strong&gt; boxes of the same color which are not in the first column (because if any the subsequent &lt;strong&gt;checked&lt;/strong&gt; boxes were in the first column, it would mean the row wraps, which is not a winning situation).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.c1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.c1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.c1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A vertical win is a bit more complicated since we need to find a &lt;strong&gt;checked&lt;/strong&gt; box immediately followed by six checkboxes (state irrelevant), immediately followed by another &lt;strong&gt;checked&lt;/strong&gt; box, immediately followed by six more checkboxes, immediately followed by yet another &lt;strong&gt;checked&lt;/strong&gt; box, immediately followed by six checkboxes, immediately followed by one last &lt;strong&gt;checked&lt;/strong&gt; box.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then there are the diagonal wins. There are two types of diagonal wins, forward and reverse. Both are detected similarly to a vertical win, with the following exceptions:&lt;br&gt;
For a forward diagonal win, we need seven check boxes between the &lt;strong&gt;checked&lt;/strong&gt; boxes, and we also need to ensure that the first &lt;strong&gt;checked&lt;/strong&gt; box is only in the first four columns (because if it were in columns 5, 6, or 7 that would mean that we don't have a straight diagonal line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.c1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.c2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.c3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.c4&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for the reverse diagonal win, we want only five checkboxes between the &lt;strong&gt;checked&lt;/strong&gt; boxes, and we want to make sure that the first &lt;strong&gt;checked&lt;/strong&gt; box is only one of the &lt;strong&gt;last&lt;/strong&gt; four columns (same reason as above).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.c4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.c5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.c6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.c7&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.move.red&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.red&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tie game
&lt;/h2&gt;

&lt;p&gt;Perhaps the most annoying rule to write was the tie game rule. Here we just need to check if there are 42 &lt;strong&gt;checked&lt;/strong&gt; boxes, regardless of their color. If there have been 42 moves played and we didn't trigger a winner rule, that means the game is over with no winner. Since, as we mentioned above, there is no way to select based on the number of elements that match a particular selection, we just had to check for a &lt;strong&gt;checked&lt;/strong&gt; box followed (not necessarily immediately) by 41 additional &lt;strong&gt;checked&lt;/strong&gt; boxes (it's long - check the CodePen for the rule, I'm not posting it here).&lt;/p&gt;

&lt;h2&gt;
  
  
  In conclusion
&lt;/h2&gt;

&lt;p&gt;Once I worked out the logic of the game, I added some crude color and animation styles to make it all work smoothly and look (somewhat) nice. The game works - once there's a winner, the "New Game" &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; just has &lt;code&gt;type="reset"&lt;/code&gt; on it, so clicking it clears all of the checkboxes, which causes the game to reset to its initial state.&lt;/p&gt;

&lt;p&gt;It's actually pretty simple once you think about it (hey, it's CSS - of course it's simple once you've thought it through). While not really worth anything, coding things like this is good for mental stimulation and helps you code better in the long term.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed it! I encourage you to dig through the code yourself and let me know what you think. 🙂&lt;/p&gt;

</description>
      <category>purecss</category>
      <category>gamedev</category>
      <category>codepen</category>
      <category>cssonly</category>
    </item>
    <item>
      <title>Pure HTML+CSS Tic-Tac-Toe (no JS)</title>
      <dc:creator>Aaron J Spetner</dc:creator>
      <pubDate>Tue, 16 Nov 2021 13:18:03 +0000</pubDate>
      <link>https://dev.to/ajspetner/pure-htmlcss-tic-tac-toe-no-js-4l2k</link>
      <guid>https://dev.to/ajspetner/pure-htmlcss-tic-tac-toe-no-js-4l2k</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxt8mw4cjad1041d0tdgo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxt8mw4cjad1041d0tdgo.png" alt="Pure CSS Tic-Tac-Toe Game"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From time-to-time, it's a good idea to give yourself a mental challenge, especially if you don't find yourself writing actual code on a regular basis.&lt;/p&gt;

&lt;p&gt;This is a tic-tac-toe game created purely with HTML and CSS, without any JavaScript (or preprocessors, etc). It takes out-of-the-box thinking to create a working multiplayer game without writing any logical code. It is obviously &lt;b&gt;not okay&lt;/b&gt; to create an application like this, but it's a cool mental exercise.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/AJSpetner/embed/zYdmJRL?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>codepen</category>
      <category>purecss</category>
      <category>cssonly</category>
      <category>game</category>
    </item>
  </channel>
</rss>
