{"id":629,"date":"2026-10-02T10:12:43","date_gmt":"2026-10-02T10:12:43","guid":{"rendered":"https:\/\/mrcottle.co.uk\/WP\/?page_id=629"},"modified":"2026-10-02T10:12:43","modified_gmt":"2026-10-02T10:12:43","slug":"binaryspaceinvader1","status":"publish","type":"page","link":"https:\/\/mrcottle.co.uk\/WP\/binaryspaceinvader1\/","title":{"rendered":"BinarySpaceInvader1"},"content":{"rendered":"<p><!DOCTYPE html><br \/>\n<html lang=\"en\"><br \/>\n<head><br \/>\n<meta charset=\"UTF-8\"><br \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><\/p>\n<p><title>12 \u00d7 12 Two Colour BMP Grid<\/title><\/p>\n<style>\n<p>* {\n    box-sizing: border-box;\n}<\/p>\n<p>body {\n    margin: 0;\n    padding: 30px;\n    font-family: Arial, sans-serif;\n    background: #f2f2f2;\n    color: #222;\n}<\/p>\n<p>h1 {\n    text-align: center;\n    margin: 0 0 10px 0;\n}<\/p>\n<p>.instructions {\n    text-align: center;\n    margin-bottom: 25px;\n}<\/p>\n<p>\/* =========================================\n   MAIN WORKSPACE\n   ========================================= *\/<\/p>\n<p>.workspace {\n    display: flex;\n    justify-content: center;\n    align-items: flex-start;\n    gap: 20px;<\/p>\n<p>    width: 100%;\n    max-width: 900px;<\/p>\n<p>    margin: 0 auto;\n}<\/p>\n<p>\/* =========================================\n   BINARY PANEL - LEFT\n   ========================================= *\/<\/p>\n<p>.binary-panel {\n    flex: 0 0 260px;<\/p>\n<p>    background: white;\n    border: 1px solid #ccc;\n    border-radius: 8px;<\/p>\n<p>    padding: 15px;<\/p>\n<p>    height: 570px;\n}<\/p>\n<p>.binary-panel h2 {\n    margin: 0 0 15px 0;\n    text-align: center;\n    font-size: 20px;\n}<\/p>\n<p>\/* Binary data *\/<\/p>\n<p>#output {\n    width: 100%;<\/p>\n<p>    padding: 10px;<\/p>\n<p>    background: #fafafa;\n    border: 1px solid #ddd;<\/p>\n<p>    font-family: monospace;\n    font-size: 14px;\n    line-height: 1.75;<\/p>\n<p>    white-space: pre;<\/p>\n<p>    overflow: auto;\n}<\/p>\n<p>\/* =========================================\n   DRAWING GRID - CENTRE\n   ========================================= *\/<\/p>\n<p>.drawing-area {\n    flex: 0 0 auto;\n}<\/p>\n<p>\/* 12 \u00d7 12 grid *\/<\/p>\n<p>.grid {\n    display: grid;<\/p>\n<p>    grid-template-columns: repeat(12, 42px);\n    grid-template-rows: repeat(12, 42px);<\/p>\n<p>    gap: 2px;<\/p>\n<p>    padding: 2px;<\/p>\n<p>    background: #555;<\/p>\n<p>    width: max-content;\n    height: max-content;\n}<\/p>\n<p>\/* Individual pixel *\/<\/p>\n<p>.cell {\n    width: 42px;\n    height: 42px;<\/p>\n<p>    background: white;\n    color: black;<\/p>\n<p>    border: 1px solid #aaa;<\/p>\n<p>    display: flex;\n    align-items: center;\n    justify-content: center;<\/p>\n<p>    font-family: monospace;\n    font-size: 15px;\n    font-weight: bold;<\/p>\n<p>    cursor: pointer;\n    user-select: none;\n}<\/p>\n<p>\/* Black pixel *\/<\/p>\n<p>.cell.black {\n    background: black;\n    color: white;\n    border-color: #333;\n}<\/p>\n<p>\/* =========================================\n   COLOUR SELECTOR - RIGHT\n   ========================================= *\/<\/p>\n<p>.colour-selector {\n    flex: 0 0 180px;<\/p>\n<p>    background: white;<\/p>\n<p>    border: 1px solid #ccc;\n    border-radius: 8px;<\/p>\n<p>    padding: 15px;\n}<\/p>\n<p>.colour-selector h2 {\n    margin: 0 0 15px 0;\n    text-align: center;\n    font-size: 20px;\n}<\/p>\n<p>\/* Colour buttons *\/<\/p>\n<p>.colour-button {\n    width: 100%;<\/p>\n<p>    display: flex;\n    align-items: center;<\/p>\n<p>    padding: 10px;<\/p>\n<p>    margin-bottom: 10px;<\/p>\n<p>    background: white;<\/p>\n<p>    border: 2px solid #ccc;\n    border-radius: 5px;<\/p>\n<p>    cursor: pointer;<\/p>\n<p>    font-size: 14px;\n    font-weight: bold;<\/p>\n<p>    text-align: left;\n}<\/p>\n<p>.colour-button:hover {\n    background: #eee;\n}<\/p>\n<p>\/* Selected colour *\/<\/p>\n<p>.colour-button.selected {\n    border: 3px solid #222;\n    background: #e8e8e8;\n}<\/p>\n<p>\/* Colour preview *\/<\/p>\n<p>.colour-preview {\n    width: 30px;\n    height: 30px;<\/p>\n<p>    margin-right: 10px;<\/p>\n<p>    border: 1px solid #777;<\/p>\n<p>    flex-shrink: 0;\n}<\/p>\n<p>.white-preview {\n    background: white;\n}<\/p>\n<p>.black-preview {\n    background: black;\n}<\/p>\n<p>\/* Selected colour display *\/<\/p>\n<p>#selectedColour {\n    margin-top: 15px;<\/p>\n<p>    padding: 10px;<\/p>\n<p>    background: #eee;<\/p>\n<p>    border-radius: 5px;<\/p>\n<p>    text-align: center;<\/p>\n<p>    font-size: 14px;\n}<\/p>\n<p>\/* =========================================\n   CLEAR BUTTON\n   ========================================= *\/<\/p>\n<p>.controls {\n    text-align: center;\n    margin-top: 20px;\n}<\/p>\n<p>.reset {\n    padding: 10px 25px;<\/p>\n<p>    border: none;\n    border-radius: 5px;<\/p>\n<p>    background: #333;\n    color: white;<\/p>\n<p>    font-size: 16px;<\/p>\n<p>    cursor: pointer;\n}<\/p>\n<p>.reset:hover {\n    background: #555;\n}<\/p>\n<p>\/* =========================================\n   RESPONSIVE LAYOUT\n   ========================================= *\/<\/p>\n<p>\/*\n   Stack sections if the screen\n   becomes too narrow.\n*\/<\/p>\n<p>@media (max-width: 800px) {<\/p>\n<p>    .workspace {\n        flex-wrap: wrap;\n        justify-content: center;\n    }<\/p>\n<p>}<\/p>\n<p>\/*\n   Small screens\n*\/<\/p>\n<p>@media (max-width: 600px) {<\/p>\n<p>    body {\n        padding: 15px;\n    }<\/p>\n<p>    .workspace {\n        flex-direction: column;\n        align-items: center;\n    }<\/p>\n<p>    .binary-panel {\n        width: 100%;\n        max-width: 400px;\n        height: auto;\n    }<\/p>\n<p>    .drawing-area {\n        width: 100%;\n        overflow-x: auto;<\/p>\n<p>        display: flex;\n        justify-content: center;\n    }<\/p>\n<p>    .colour-selector {\n        width: 100%;\n        max-width: 300px;\n    }<\/p>\n<p>}<\/p>\n<\/style>\n<p><\/head><\/p>\n<p><body><\/p>\n<h1>12 \u00d7 12 Two-Colour BMP Image<\/h1>\n<div class=\"instructions\">\n<p>    <strong>1.<\/strong> Select a colour.<br \/>\n    &nbsp;&nbsp;<\/p>\n<p>    <strong>2.<\/strong> Click the squares to draw your image.<\/p>\n<\/div>\n<p><!-- =========================================\n     MAIN WORKSPACE\n     ========================================= --><\/p>\n<div class=\"workspace\">\n<p>    <!-- =====================================\n         BINARY IMAGE\n         ===================================== --><\/p>\n<div class=\"binary-panel\">\n<h2>Binary Image<\/h2>\n<div id=\"output\"><\/div>\n<\/p><\/div>\n<p>    <!-- =====================================\n         DRAWING GRID\n         ===================================== --><\/p>\n<div class=\"drawing-area\">\n<div class=\"grid\" id=\"grid\"><\/div>\n<\/p><\/div>\n<p>    <!-- =====================================\n         COLOUR SELECTOR\n         ===================================== --><\/p>\n<div class=\"colour-selector\">\n<h2>Select Colour<\/h2>\n<p>        <!-- WHITE --><\/p>\n<p>        <button\n            class=\"colour-button selected\"\n            data-state=\"0\"\n            onclick=\"selectColour(0)\"\n        ><\/p>\n<div class=\"colour-preview white-preview\"><\/div>\n<p>            <span><br \/>\n                White<br \/>\n                <small>0<\/small><br \/>\n            <\/span><\/p>\n<p>        <\/button><\/p>\n<p>        <!-- BLACK --><\/p>\n<p>        <button\n            class=\"colour-button\"\n            data-state=\"1\"\n            onclick=\"selectColour(1)\"\n        ><\/p>\n<div class=\"colour-preview black-preview\"><\/div>\n<p>            <span><br \/>\n                Black<br \/>\n                <small>1<\/small><br \/>\n            <\/span><\/p>\n<p>        <\/button><\/p>\n<div id=\"selectedColour\">\n<p>            Selected:<\/p>\n<p>            <strong>White (0)<\/strong><\/p><\/div>\n<\/p><\/div>\n<\/div>\n<p><!-- =========================================\n     CLEAR BUTTON\n     ========================================= --><\/p>\n<div class=\"controls\">\n<p>    <button\n        class=\"reset\"\n        onclick=\"clearGrid()\"\n    ><br \/>\n        Clear Grid<br \/>\n    <\/button><\/p>\n<\/div>\n<p><script><\/p>\n<p>\/*\n    TWO COLOUR VALUES<\/p>\n<p>    0 = White\n    1 = Black\n*\/<\/p>\n<p>const colours = [<\/p>\n<p>    {\n        name: \"White\",\n        binary: \"0\",\n        className: \"\"\n    },<\/p>\n<p>    {\n        name: \"Black\",\n        binary: \"1\",\n        className: \"black\"\n    }<\/p>\n<p>];<\/p>\n<p>let selectedColour = 0;<\/p>\n<p>const grid =\n    document.getElementById(\"grid\");<\/p>\n<p>const output =\n    document.getElementById(\"output\");<\/p>\n<p>const selectedColourDisplay =\n    document.getElementById(\"selectedColour\");<\/p>\n<p>\/*\n    CREATE 12 \u00d7 12 GRID\n*\/<\/p>\n<p>for (let row = 0; row < 12; row++) {\n\n    for (let col = 0; col < 12; col++) {\n\n        const cell =\n            document.createElement(\"div\");\n\n        cell.classList.add(\"cell\");\n\n\n        \/\/ Start as White (0)\n\n        cell.dataset.state = \"0\";\n\n        cell.textContent = \"0\";\n\n\n        \/*\n            Paint the cell using\n            the currently selected colour.\n        *\/\n\n        cell.addEventListener(\"click\", function() {\n\n            cell.dataset.state =\n                selectedColour;\n\n            updateCell(cell);\n\n            updateOutput();\n\n        });\n\n\n        grid.appendChild(cell);\n\n    }\n\n}\n\n\n\/*\n    SELECT COLOUR\n*\/\n\nfunction selectColour(colourNumber) {\n\n    selectedColour = colourNumber;\n\n\n    \/*\n        Remove selected state\n        from all buttons.\n    *\/\n\n    const buttons =\n        document.querySelectorAll(\n            \".colour-button\"\n        );\n\n\n    buttons.forEach(button => {<\/p>\n<p>        button.classList.remove(\"selected\");<\/p>\n<p>    });<\/p>\n<p>    \/*\n        Highlight selected button.\n    *\/<\/p>\n<p>    const selectedButton =\n        document.querySelector(\n            `.colour-button[data-state=\"${colourNumber}\"]`\n        );<\/p>\n<p>    selectedButton.classList.add(\"selected\");<\/p>\n<p>    \/*\n        Update selected colour message.\n    *\/<\/p>\n<p>    selectedColourDisplay.innerHTML =\n        \"Selected:<br \/><strong>\" +\n        colours[colourNumber].name +\n        \" (\" +\n        colours[colourNumber].binary +\n        \")<\/strong>\";<\/p>\n<p>}<\/p>\n<p>\/*\n    UPDATE CELL\n*\/<\/p>\n<p>function updateCell(cell) {<\/p>\n<p>    const state =\n        parseInt(cell.dataset.state);<\/p>\n<p>    \/*\n        Remove old colour.\n    *\/<\/p>\n<p>    cell.classList.remove(\"black\");<\/p>\n<p>    \/*\n        Apply new colour.\n    *\/<\/p>\n<p>    if (colours[state].className !== \"\") {<\/p>\n<p>        cell.classList.add(\n            colours[state].className\n        );<\/p>\n<p>    }<\/p>\n<p>    \/*\n        Display 0 or 1.\n    *\/<\/p>\n<p>    cell.textContent =\n        colours[state].binary;<\/p>\n<p>}<\/p>\n<p>\/*\n    UPDATE BINARY IMAGE\n*\/<\/p>\n<p>function updateOutput() {<\/p>\n<p>    const cells =\n        document.querySelectorAll(\".cell\");<\/p>\n<p>    let binaryImage = \"\";<\/p>\n<p>    cells.forEach((cell, index) => {<\/p>\n<p>        binaryImage +=\n            cell.textContent + \" \";<\/p>\n<p>        \/*\n            Start a new line\n            after every 12 pixels.\n        *\/<\/p>\n<p>        if ((index + 1) % 12 === 0) {<\/p>\n<p>            binaryImage += \"\\n\";<\/p>\n<p>        }<\/p>\n<p>    });<\/p>\n<p>    output.textContent =\n        binaryImage;<\/p>\n<p>}<\/p>\n<p>\/*\n    CLEAR GRID\n*\/<\/p>\n<p>function clearGrid() {<\/p>\n<p>    const cells =\n        document.querySelectorAll(\".cell\");<\/p>\n<p>    cells.forEach(cell => {<\/p>\n<p>        cell.dataset.state = \"0\";<\/p>\n<p>        updateCell(cell);<\/p>\n<p>    });<\/p>\n<p>    updateOutput();<\/p>\n<p>}<\/p>\n<p>\/*\n    INITIAL DISPLAY\n*\/<\/p>\n<p>updateOutput();<\/p>\n<p><\/script><\/p>\n<p><\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"<p>12 \u00d7 12 Two Colour BMP Grid 12 \u00d7 12 Two-Colour BMP Image 1. Select a colour. &nbsp;&nbsp; 2. Click the squares to draw your image. Binary Image Select Colour White 0 Black 1 Selected: White (0) Clear Grid<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-629","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/pages\/629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/comments?post=629"}],"version-history":[{"count":1,"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/pages\/629\/revisions"}],"predecessor-version":[{"id":631,"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/pages\/629\/revisions\/631"}],"wp:attachment":[{"href":"https:\/\/mrcottle.co.uk\/WP\/wp-json\/wp\/v2\/media?parent=629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}