Flatlogic Bot d0003a5a53 final
2025-09-17 16:23:37 +00:00

277 lines
30 KiB
JavaScript

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const scoreEl = document.getElementById('score');
const livesEl = document.getElementById('lives');
const gameOverScreen = document.getElementById('gameOverScreen');
const finalScoreEl = document.getElementById('finalScore');
const restartButton = document.getElementById('restartButton');
let score = 0;
let lives = 3;
let gameObjects = [];
let particles = [];
let blade = [];
let lastSpawnTime = 0;
let spawnInterval = 1000;
let gameOver = false;
// Placeholder for image data
const logoImages = {};
const bugImage = {};
// Set canvas dimensions
canvas.width = Math.min(window.innerWidth * 0.9, 1200);
canvas.height = Math.min(window.innerHeight * 0.9, 800);
// --- Base64 Image Data ---
logoImages['python'] = new Image();
logoImages['python'].src = 'data:image/png;base64,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';
logoImages['javascript'] = new Image();
logoImages['javascript'].src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0xMS41IC0xMC4yMzE3NCAyMyAyMC40NjM0OCI+CiAgPHRpdGxlPkphdmFTY3JpcHQgbG9nbzwvdGl0bGU+CiAgPHBhdGggZmlsbD0iI2Y3ZGYwMCIgZD0iTTAgMGgxMXYxMUgwem0uNzUgOC41aDEuNXYxLjVoLTEuNXYtMS41em0zIDBoMS41djEuNWgtMS41di0xLjV6bTMgMGgxLjV2MS41aC0xLjV2LTEuNXoiLz4KICA8cGF0aCBmaWxsPSIjMDAwIiBkPSJNNy4xNjggOS43MDdoMS4zOTZMMTAuMjYgMS40OWgtMS40NDJMNy45NjggNS43NTRoLS4wNDJMNi45NTQgMS40OWgtMS40NDJMNy4xNjggOS43MDd6bS00LjYyLS4wNDJoMS4zOTZMMi42MyAxLjQ5SC45ODdsMS41NjggOC4xNzV6Ii8+Cjwvc3ZnPgo=';
logoImages['java'] = new Image();
logoImages['java'].src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmlld0JveD0iMCAwIDMyIDMyIj48cGF0aCBkPSJNMTEuNjIyIDI0Ljc0cy0xLjIzLjc0OC44NTUuOTYyYzIuNTEuMzIgMy44NDcuMjY3IDYuNjI1LS4yNjdhMTAuMDIgMTAuMDIgMCAwIDAgMS43NjMuODU1Yy02LjI1IDIuNjcyLTE0LjE2LS4xNi05LjI0NC0xLjU1em0tLjgtMy40NzNzLTEuMzM2IDEuMDE1Ljc0OCAxLjIzYzIuNzI1LjI2NyA0Ljg2Mi4zMiA4LjU1LS40MjdhMy4yNiAzLjI2IDAgMCAwIDEuMjgyLjgwMWMtNy41MzQgMi4yNDQtMTUuOTc2LjIxNC0xMC41OC0xLjYwM3ptMTQuNzQ3IDYuMDlzLjkwOC43NDgtMS4wMTUgMS4zMzZjLTMuNTggMS4wNy0xNS4wMTQgMS4zOS0xOC4yMiAwLTEuMTIyLS40OCAxLjAxNS0xLjE3NSAxLjctMS4yODIuNjk1LS4xNiAxLjA3LS4xNiAxLjA3LS4xNi0xLjIzLS44NTUtOC4xNzUgMS43NjMtMy41MjYgMi41MSAxMi43NyAyLjA4NCAyMy4yOTYtLjkwOCAxOS45ODMtMi40MDR6TTEyLjIgMTcuNjMzcy01LjgyNCAxLjM5LTIuMDg0IDEuODdjMS42MDMuMjE0IDQuNzU1LjE2IDcuNjk0LS4wNTMgMi40MDQtLjIxNCA0LjgxLS42NCA0LjgxLS42NHMtLjg1NS4zNzQtMS40NDMuNzQ4Yy01LjkzIDEuNTUtMTcuMzEyLjg1NS0xNC4wNTItLjc0OCAyLjc3OC0xLjMzNiA1LjA3Ni0xLjE3NSA1LjA3Ni0xLjE3NXptMTAuNDIgNS44MjRjNS45ODQtMy4xIDMuMjA2LTYuMDkgMS4yODItNS43MTctLjQ4LjEwNy0uNjk1LjIxNC0uNjk1LjIxNHMuMTYtLjMyLjUzNC0uNDI3YzMuNzk0LTEuMzM2IDYuNzg2IDQuMDA3LTEuMjMgNi4wOSAwIDAgLjA1My0uMDUzLjEwNy0uMTZ6bS05LjgzIDguNDQyYzUuNzcuMzc0IDE0LjU4Ny0uMjE0IDE0LjgtMi45NCAwIDAtLjQyNyAxLjA3LTQuNzU1IDEuODctNC45MTYuOTA4LTExLjAwNy44LTE0LjU4Ny4yMTQgMCAwIC43NDguNjQgNC41NDIuODU1eiIgZmlsbD0iIzRlNzg5NiIvPjxwYXRoIGQ9Ik0xOC45OTYuMDAxczMuMzEzIDMuMzY2LTMuMTUyIDguNDQyYy01LjE4MyA0LjExNC0xLjE3NSA2LjQ2NSAwIDkuMTM3LTMuMDQ2LTIuNzI1LTUuMjM2LTUuMTMtMy43NC03LjM3M0MxNC4yOTQgNi44OTMgMjAuMzMyIDUuMyAxOC45OTYuMDAxem0tMS43IDE1LjMzNWMxLjU1IDEuNzYzLS40MjcgMy4zNjYtLjQyNyAzLjM2NnMzLjk1NC0yLjAzIDIuMTM3LTQuNTQyYy0xLjY1Ni0yLjQwNC0yLjk0LTMuNTggNC4wMDctNy41ODcgMCAwLTEwLjk1MyAyLjcyNS01LjcxNyA4Ljc2M3oiIGZpbGw9IiNmNTgyMTkiLz48L3N2Zz4=';
logoImages['cplusplus'] = new Image();
logoImages['cplusplus'].src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZmlsbD0iIzAwNTk5YyIgZD0iTTU5Ljc0OSA0OGMuNDQ2LS43NzMuNzI0LTEuNjQ0LjcyNC0yLjQyNlYxOC40MjZjMC0uNzgyLS4yNzctMS42NTMtLjcyNC0yLjQyNkwzMi4wMzYgMzJaIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi4xODU4NTgiLz48cGF0aCBmaWxsPSIjMDA0NDgyIiBkPSJtMzQuNDk5IDYzLjQxMyAyMy41MS0xMy41NzRjLjY3OC0uMzkgMS4yOTQtMS4wNjYgMS43NC0xLjgzOUwzMi4wMzYgMzIgNC4zMjQgNDhjLjQ0Ni43NzMgMS4wNjIgMS40NDkgMS43MzkgMS44NGwyMy41MSAxMy41NzNjMS4zNTUuNzgzIDMuNTcyLjc4MyA0LjkyNiAwIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi4xODU4NTgiLz48cGF0aCBmaWxsPSIjNjU5YWQyIiBkPSJNNTkuNzUgMTZjLS40NDctLjc3My0xLjA2My0xLjQ0OC0xLjc0LTEuODRMMzQuNDk5LjU4OGMtMS4zNTQtLjc4My0zLjU3MS0uNzgzLTQuOTI1IDBMNi4wNjMgMTQuMTZjLTEuMzU1Ljc4MS0yLjQ2MyAyLjcwMS0yLjQ2MyA0LjI2NXYyNy4xNDhjMCAuNzgyLjI3NyAxLjY1My43MjQgMi40MjZsMjcuNzEyLTE2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouMTg1ODU4Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMyLjAzNiA1MC45NThDMjEuNTgzIDUwLjk1OCAxMy4wOCA0Mi40NTMgMTMuMDggMzJzOC41MDQtMTguOTU3IDE4Ljk1Ny0xOC45NTdjNi43NDUgMCAxMy4wMzYgMy42MyAxNi40MTcgOS40NzJsLTguMjA0IDQuNzQ4YTkuNTIgOS41MiAwIDAgMC04LjIxMy00Ljc0MmMtNS4yMjYgMC05LjQ3OCA0LjI1Mi05LjQ3OCA5LjQ4IDAgNS4yMjYgNC4yNTIgOS40NzggOS40NzggOS40NzhhOS41MiA5LjUyIDAgMCAwIDguMjE0LTQuNzQybDguMjA0IDQuNzQ3Yy0zLjM4MSA1Ljg0NC05LjY3MiA5LjQ3NC0xNi40MTggOS40NzQiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNDYuNzgxIDM1LjE2aDIuMTA2di0yLjEwN2gyLjEwN3YtMi4xMDZoLTIuMTA3VjI4Ljg0aC0yLjEwNnYyLjEwNmgtMi4xMDZ2Mi4xMDZoMi4xMDZ6TTU0LjY4IDM1LjE2aDIuMTA2di0yLjEwN2gyLjEwN3YtMi4xMDZoLTIuMTA3VjI4Ljg0SDU0LjY4djIuMTA2aC0yLjEwNnYyLjEwNmgyLjEwNnoiLz48L3N2Zz4=';
logoImages['rust'] = new Image();
logoImages['rust'].src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmlld0JveD0iMCAwIDMyIDMyIj4KICAgIDxwYXRoIGQ9Ik0xNSAzLjc3YS45NTEuOTUxIDAgMSAxIDEuOTAyIDAgLjk1MS45NTEgMCAwIDEtMS45MDIgME0zLjY1NCAxMi4zOGEuOTUxLjk1MSAwIDEgMSAxLjkwMiAwIC45NTEuOTUxIDAgMCAxLTEuOTAyIDBtMjIuNjkyLjA0NGEuOTUxLjk1MSAwIDAgMSAxLjkwMiAwIC45NTEuOTUxIDAgMCAxLTEuOTAyIDBNNi40MDYgMTMuNzNhLjg3Ljg3IDAgMCAwIC40NDEtMS4xNDZsLS40MjItLjk1NGgxLjY2djcuNDhINC43MzZhMTEuNyAxMS43IDAgMCAxLS4zNzktNC40N3ptNi45NDIuMTg0di0yLjIwNUgxNy4zYy4yMDQgMCAxLjQ0LjIzNiAxLjQ0IDEuMTYgMCAuNzY4LS45NSAxLjA0NC0xLjczIDEuMDQ0ek03Ljk1MiAyNS43ODVhLjk1MS45NTEgMCAxIDEgMS45MDIgMCAuOTUxLjk1MSAwIDAgMS0xLjkwMiAwbTE0LjA5My4wNDRhLjk1MS45NTEgMCAwIDEgMS45MDIgMCAuOTUxLjk1MSAwIDAgMS0xLjkwMiAwbS4yOTQtMi4xNTdhLjg2Ny44NjcgMCAwIDAtMS4wMy42NjdsLS40NzcgMi4yMjhhMTEuNzEgMTEuNzEgMCAwIDEtOS43NjUtLjA0N2wtLjQ3Ny0yLjIyOGEuODY1Ljg2NSAwIDAgMC0xLjAzLS42NjdsLTEuOTY3LjQyMmExMiAxMiAwIDAgMS0xLjAxNy0xLjE5OWg5LjU3Yy4xMDggMCAuMTgtLjAyLjE4LS4xMTh2LTMuMzg1YzAtLjEtLjA3Mi0uMTE4LS4xOC0uMTE4aC0yLjh2LTIuMTQ2aDMuMDI3Yy4yNzYgMCAxLjQ3Ny4wOCAxLjg2MiAxLjYxNGwuNTY1IDIuNWMuMTguNTUuOTEzIDEuNjUzIDEuNjkzIDEuNjUzaDQuOTRhMTIgMTIgMCAwIDEtMS4wODUgMS4yNTV6bTUuMzE0LTguOTM4YTExLjcgMTEuNyAwIDAgMSAuMDI1IDIuMDMzaC0xLjJjLS4xMiAwLS4xNy4wOC0uMTcuMTk3di41NTJjMCAxLjMtLjczMiAxLjU4LTEuMzc0IDEuNjUzLS42MS4wNy0xLjI5LS4yNTYtMS4zNzItLjYzLS4zNi0yLjAyOC0uOTYtMi40Ni0xLjktMy4yMSAxLjE3Ny0uNzQ4IDIuNDAyLTEuODUgMi40MDItMy4zMjcgMC0xLjU5NC0xLjA5My0yLjU5OC0xLjgzOC0zLjA5LTEuMDQ1LS42OS0yLjIwMi0uODI3LTIuNTE0LS44MjdINy4yNzdhMTEuNyAxMS43IDAgMCAxIDYuNTUxLTMuNjk3bDEuNDY1IDEuNTM3Yy4zMy4zNDcuODguMzYgMS4yMjYuMDI4bDEuNjQtMS41NjdhMTEuNzEgMTEuNzEgMCAwIDEgOC4wMTcgNS43MDlsLTEuMTIyIDIuNTM0YS44Ny44NyAwIDAgMCAuNDQxIDEuMTQ2em0yLjc5OC4wNC0uMDM4LS4zOTIgMS4xNTYtMS4wNzhjLjIzNS0uMjIuMTQ3LS42Ni0uMTUzLS43NzJsLTEuNDc3LS41NTItLjExNi0uMzguOTItMS4yOGMuMTg4LS4yNi4wMTUtLjY3NS0uMy0uNzI3bC0xLjU1OC0uMjUzLS4xODctLjM1LjY1NS0xLjQzN2MuMTM0LS4yOTMtLjExNS0uNjY3LS40MzctLjY1NWwtMS41OC4wNTUtLjI1LS4zMDMuMzYzLTEuNTRjLjA3My0uMzEzLS4yNDQtLjYzLS41NTctLjU1N2wtMS41NC4zNjMtLjMwNC0uMjUuMDU1LTEuNThjLjAxMi0uMzItLjM2Mi0uNTctLjY1NC0uNDM3bC0xLjQzNi42NTUtLjM1LS4xODgtLjI1NC0xLjU1OGMtLjA1LS4zMTYtLjQ2Ny0uNDg4LS43MjctLjNsLTEuMjguOTItLjM4LS4xMTVMMTkuNDcuNTg2Yy0uMTEyLS4zLS41NTMtLjM4OC0uNzcyLS4xNTRMMTcuNjIgMS41ODhsLS4zOTItLjAzOC0uODMyLTEuMzQ1Yy0uMTY4LS4yNzItLjYyLS4yNzItLjc4NyAwbC0uODMyIDEuMzQ1LS4zOTIuMDM4TDEzLjMwNS40M2MtLjIyLS4yMzQtLjY2LS4xNDctLjc3Mi4xNTRsLS41NTIgMS40NzctLjM4LjExNS0xLjI4LS45MmMtLjI2LS4xODgtLjY3Ni0uMDE1LS43MjcuM0w5LjM0IDMuMTE0bC0uMzUuMTg4LTEuNDM2LS42NTVjLS4yOTItLjEzMy0uNjY3LjExNy0uNjU0LjQzN2wuMDU1IDEuNTgtLjMwNC4yNS0xLjU0LS4zNjNjLS4zMTMtLjA3My0uNjMuMjQ0LS41NTcuNTU3bC4zNjMgMS41NC0uMjUuMzAzLTEuNTgtLjA1NWMtLjMyLS4wMS0uNTcuMzYyLS40MzcuNjU1bC42NTUgMS40MzctLjE4OC4zNS0xLjU1OC4yNTNjLS4zMTYuMDUtLjQ4OC40NjctLjMuNzI3bC45MiAxLjI4LS4xMTYuMzgtMS40NzcuNTUyYy0uMy4xMTItLjM4OC41NTMtLjE1My43NzJsMS4xNTYgMS4wNzgtLjAzOC4zOTItMS4zNDUuODMyYy0uMjcyLjE2OC0uMjcyLjYyIDAgLjc4N2wxLjM0NS44MzIuMDM4LjM5MkwuNDMgMTguNjk3Yy0uMjM0LjIyLS4xNDcuNjYuMTUzLjc3MmwxLjQ3Ny41NTIuMTE2LjM4LS45MiAxLjI4Yy0uMTg3LjI2LS4wMTUuNjc2LjMuNzI3bDEuNTU3LjI1My4xODguMzUtLjY1NSAxLjQzNmMtLjEzMy4yOTIuMTE4LjY2Ny40MzcuNjU1bDEuNTgtLjA1NS4yNS4zMDQtLjM2MyAxLjU0Yy0uMDczLjMxMi4yNDQuNjMuNTU3LjU1NmwxLjU0LS4zNjMuMzA0LjI1LS4wNTUgMS41OGMtLjAxMi4zMi4zNjIuNTcuNjU0LjQzN2wxLjQzNi0uNjU1LjM1LjE4OC4yNTQgMS41NTdjLjA1LjMxNy40NjcuNDg4LjcyNy4zMDJsMS4yOC0uOTIyLjM4LjExNi41NTIgMS40NzdjLjExMi4zLjU1My4zODguNzcyLjE1M2wxLjA3OC0xLjE1Ni4zOTIuMDQuODMyIDEuMzQ1Yy4xNjguMjcuNjE4LjI3Mi43ODcgMGwuODMyLTEuMzQ1LjM5Mi0uMDQgMS4wNzggMS4xNTZjLjIyLjIzNS42Ni4xNDcuNzcyLS4xNTNsLjU1Mi0xLjQ3Ny4zOC0uMTE2IDEuMjguOTIyYy4yNi4xODcuNjc2LjAxNS43MjctLjMwMmwuMjU0LTEuNTU3LjM1LS4xODggMS40MzYuNjU1Yy4yOTIuMTMzLjY2Ni0uMTE2LjY1NC0uNDM3bC0uMDU1LTEuNTguMzAzLS4yNSAxLjU0LjM2M2MuMzEzLjA3My42My0uMjQ0LjU1Ny0uNTU2bC0uMzYzLTEuNTQuMjUtLjMwNCAxLjU4LjA1NWMuMzIuMDEzLjU3LS4zNjMuNDM3LS42NTVsLS42NTUtMS40MzYuMTg3LS4zNSAxLjU1OC0uMjUzYy4zMTctLjA1LjQ5LS40NjYuMy0uNzI3bC0uOTItMS4yOC4xMTYtLjM4IDEuNDc3LS41NTJjLjMtLjExMy4zODgtLjU1My4xNTMtLjc3MmwtMS4xNTYtMS4wNzguMDM4LS4zOTIgMS4zNDUtLjgzMmMuMjcyLS4xNjguMjczLS42MTggMC0uNzg3eiIvPgo8L3N2Zz4K';
logoImages['go'] = new Image();
logoImages['go'].src = 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjAiIHk9IjAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlPi5zdDB7ZmlsbDojMDBhY2Q3fTwvc3R5bGU+PHN3aXRjaD48Zz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNC44IDI3LjNjLS4xIDAtLjItLjEtLjEtLjJsLjctLjhjLjEtLjEuMi0uMi4zLS4yaDExLjFjLjEgMCAuMi4xLjEuMmwtLjUuOGMtLjEuMS0uMi4yLS4zLjJINC44ek0uMSAzMC4yYy0uMSAwLS4xLS4xLS4xLS4ybC43LS44YzAtLjEuMi0uMi4zLS4yaDE0LjJjLjEgMCAuMi4xLjIuMmwtLjIuN2MwIC4xLS4yLjItLjMuMmwtMTQuOC4xek03LjcgMzNjLS4xIDAtLjItLjEtLjEtLjJsLjQtLjdjLjEtLjEuMi0uMi4zLS4yaDYuMmMuMSAwIC4yLjEuMi4ybC0uMS43YzAgLjEtLjEuMi0uMi4ySDcuN3pNNDAgMjYuN2wtNS4yIDEuNGMtLjUuMS0uNS4yLS45LS4zLS41LS41LS44LS45LTEuNS0xLjItMi0xLTMuOS0uNy01LjYuNS0yLjEgMS40LTMuMiAzLjQtMy4yIDUuOSAwIDIuNSAxLjcgNC41IDQuMiA0LjkgMi4xLjMgMy45LS41IDUuMy0yLjEuMy0uMy41LS43LjgtMS4yaC02Yy0uNyAwLS44LS40LS42LS45LjQtMSAxLjItMi42IDEuNi0zLjQuMS0uMi4zLS41LjgtLjVINDFjLS4xLjgtLjEgMS43LS4yIDIuNS0uMyAyLjItMS4yIDQuMy0yLjYgNi4xLTIuMiAzLTUuMiA0LjgtOC45IDUuMy0zLjEuNC01LjktLjItOC40LTIuMS0yLjMtMS43LTMuNi00LjEtNC02LjktLjQtMy40LjYtNi40IDIuNi05LjEgMi4yLTIuOSA1LjEtNC43IDguNy01LjQgMi45LS41IDUuNy0uMiA4LjMgMS41IDEuNyAxLjEgMi44IDIuNiAzLjYgNC40LjQuNC4zLjUtLjEuNnoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNTAuMyA0NGMtMi44LS4xLTUuNC0uOS03LjYtMi43LTEuOC0xLjYtMy0zLjYtMy40LTYtLjYtMy41LjQtNi42IDIuNS05LjQgMi4zLTMgNS00LjUgOC43LTUuMiAzLjItLjYgNi4yLS4yIDguOSAxLjYgMi41IDEuNyA0IDQgNC40IDYuOS41IDQuMi0uNyA3LjYtMy42IDEwLjYtMi4xIDIuMS00LjYgMy40LTcuNSA0LS43IDAtMS42LjEtMi40LjJ6bTcuNC0xMi42YzAtLjQgMC0uNy0uMS0xLS42LTMuMS0zLjQtNC44LTYuNC00LjEtMi45LjctNC44IDIuNS01LjUgNS40LS42IDIuNC42IDQuOSAyLjkgNS45IDEuNy43IDMuNC43IDUuMS0uMiAyLjUtMS40IDMuOS0zLjQgNC02eiIvPjwvZz48L3N3aXRjaD48L3N2Zz4=';
bugImage.img = new Image();
bugImage.img.src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IHkyPSIxMC44MzgiIHgyPSIyNi45NDQiIHkxPSI1OC44NTMiIHgxPSIzNS40MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJBIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MjhmYmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM2ODlhY2UiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNNDYuMjkyIDUzLjgySDMyLjA3YzAtMTIuODI4LTUuNzE3LTI0LjI2LTE0Ljc4LTMxLjkzbDkuMjAzLTExLjAxNWMxMi4xMyAxMC4zMTggMTkuOCAyNS43OTUgMTkuOCA0Mi45NDZ6bS04LjA4Ny0zNS4yNzdjNy4yNSA5LjkgMTEuNTczIDIyLjAzIDExLjU3MyAzNS4yNzdINjRjMC0xNi4zMTQtNS4yOTgtMzEuMzczLTE0LjIyMi00My42NDN6TTAgMzEuNTEyYzguNTA1IDMuNzY1IDE0LjUgMTIuMjcgMTQuNSAyMi4zaDE0LjIyMkEzOC40OCAzOC40OCAwIDAgMCA1Ljg1NiAxOC41NDV6IiBmaWxsPSJ1cmwoI0EpIi8+PC9zdmc+';
// --- Game Object Classes ---
class GameObject {
constructor(x, y, radius, image) {
this.x = x;
this.y = y;
this.radius = radius;
this.image = image;
this.vx = (Math.random() - 0.5) * 4; // Reduced horizontal speed
this.vy = -Math.random() * 10 - 10; // Reduced initial upward velocity
this.gravity = 0.2; // Reduced gravity
this.rotation = 0;
this.rotationSpeed = (Math.random() - 0.5) * 0.1; // Reduced rotation speed
this.isSliced = false;
}
update() {
this.vy += this.gravity;
this.x += this.vx;
this.y += this.vy;
this.rotation += this.rotationSpeed;
// Bounce off left and right walls
if ((this.x - this.radius < 0 && this.vx < 0) || (this.x + this.radius > canvas.width && this.vx > 0)) {
this.vx *= -1;
}
}
draw() {
ctx.save();
ctx.translate(this.x, this.y);
ctx.rotate(this.rotation);
ctx.drawImage(this.image, -this.radius, -this.radius, this.radius * 2, this.radius * 2);
ctx.restore();
}
}
class Particle {
constructor(x, y) {
this.x = x;
this.y = y;
this.vx = (Math.random() - 0.5) * 5;
this.vy = (Math.random() - 0.5) * 5;
this.alpha = 1;
this.size = Math.random() * 5 + 2;
}
update() {
this.x += this.vx;
this.y += this.vy;
this.alpha -= 0.03;
}
draw() {
ctx.fillStyle = `rgba(255, 255, 0, ${this.alpha})`;
ctx.fillRect(this.x, this.y, this.size, this.size);
}
}
// --- Game Logic ---
function spawnObject() {
const radius = Math.random() * 20 + 40; // Random size
const x = Math.random() * canvas.width;
const y = canvas.height + radius;
let obj;
if (Math.random() < 0.2) { // 20% chance of being a bug
obj = new GameObject(x, y, radius, bugImage.img);
obj.isBug = true;
} else {
const logoNames = Object.keys(logoImages);
const randomLogo = logoNames[Math.floor(Math.random() * logoNames.length)];
obj = new GameObject(x, y, radius, logoImages[randomLogo]);
obj.isBug = false;
}
gameObjects.push(obj);
}
function sliceObject(obj, angle) {
obj.isSliced = true;
score += obj.isBug ? 0 : 10;
if (obj.isBug) {
lives--;
if(lives <= 0) {
gameOver = true;
}
}
// Create two halves
const createHalf = (rotationOffset) => {
const half = new GameObject(obj.x, obj.y, obj.radius, obj.image);
half.vy = obj.vy;
half.vx = obj.vx + (Math.random() - 0.5) * 5;
half.rotation = obj.rotation + rotationOffset;
half.isSliced = true; // Prevent re-slicing
return half;
};
const half1 = createHalf(-0.5);
const half2 = createHalf(0.5);
gameObjects.push(half1, half2);
// Create particles
for (let i = 0; i < 20; i++) {
particles.push(new Particle(obj.x, obj.y));
}
}
function updateUI() {
scoreEl.textContent = `Score: ${score}`;
livesEl.textContent = `Lives: ${lives}`;
}
function handleGameOver() {
finalScoreEl.textContent = `Your Score: ${score}`;
gameOverScreen.style.display = 'flex';
}
function restartGame() {
score = 0;
lives = 3;
gameObjects = [];
particles = [];
gameOver = false;
gameOverScreen.style.display = 'none';
updateUI();
gameLoop(0);
}
// --- Main Game Loop ---
function gameLoop(timestamp) {
if (gameOver) {
handleGameOver();
return;
}
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Spawn new objects
if (timestamp - lastSpawnTime > spawnInterval) {
spawnObject();
lastSpawnTime = timestamp;
spawnInterval = Math.random() * 1000 + 500;
}
// Update and draw game objects
for (let i = gameObjects.length - 1; i >= 0; i--) {
const obj = gameObjects[i];
obj.update();
obj.draw();
// Remove unsliced fruits if they fall off the bottom
if (obj.y > canvas.height + obj.radius * 2 && !obj.isSliced && !obj.isBug) {
lives--;
if(lives <= 0) {
gameOver = true;
}
gameObjects.splice(i, 1);
}
}
// Update and draw particles
for (let i = particles.length - 1; i >= 0; i--) {
const p = particles[i];
p.update();
p.draw();
if (p.alpha <= 0) {
particles.splice(i, 1);
}
}
// Draw blade trail
if (blade.length > 1) {
ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)';
ctx.lineWidth = 5;
ctx.beginPath();
ctx.moveTo(blade[0].x, blade[0].y);
for (let i = 1; i < blade.length; i++) {
ctx.lineTo(blade[i].x, blade[i].y);
}
ctx.stroke();
}
// Collision detection for slicing
if (blade.length > 1) {
const lastPoint = blade[blade.length - 1];
const prevPoint = blade[blade.length - 2];
for (let i = gameObjects.length - 1; i >= 0; i--) {
const obj = gameObjects[i];
if (obj.isSliced) continue;
const dist = Math.hypot(obj.x - lastPoint.x, obj.y - lastPoint.y);
if (dist < obj.radius) {
const angle = Math.atan2(lastPoint.y - prevPoint.y, lastPoint.x - prevPoint.x);
sliceObject(obj, angle);
gameObjects.splice(i, 1);
}
}
}
updateUI();
requestAnimationFrame(gameLoop);
}
// --- Event Listeners ---
function getMousePos(evt) {
const rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
canvas.addEventListener('mousemove', (e) => {
const pos = getMousePos(e);
blade.push(pos);
if (blade.length > 20) {
blade.shift();
}
});
canvas.addEventListener('mouseleave', () => {
blade = [];
});
restartButton.addEventListener('click', restartGame);
// Start the game
gameLoop(0);