你需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
你需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
你需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已安装用户样式管理器,立即安装用户样式!)
换行
// ==UserScript== // @name Snake Game! // @version 3.6 // @description плохое настроение? сыграйте в меня! // @autor Minish // @namespace drawaria.snake.game // @match drawaria.online // @grant none // ==/UserScript== ( function () { 'use strict' ; // Create the game canvas const canvas = document . createElement ( 'canvas' ); canvas . width = 800 ; // Increased width canvas . height = 600 ; // Increased height document . body . appendChild ( canvas ); const ctx = canvas . getContext ( '2d' ); // Load images const appleImage = new Image (); appleImage . src = 'https://w7.pngwing.com/pngs/381/179/png-transparent-apple-green-apple-green-apple-food-granny-smith-asian-pear-thumbnail.png' ; // Transparent background apple const goldenAppleImage = new Image (); goldenAppleImage . src = 'https://w7.pngwing.com/pngs/534/248/png-transparent-minecraft-computer-icons-golden-apple-golden-orange-fruit-apple-thumbnail.png' ; // Transparent background golden apple const backgroundImage = new Image (); backgroundImage . src = 'https://avatars.mds.yandex.net/i?id=d7ddea51bc660760175ae06837721008ec22c13e3c0bd198-10786048-images-thumbs&n=13' ; // Указанная текстура фона // Game variables const box = 40 ; // Increased size of apples const initialPosition = { x : 9 * box , y : 9 * box }; // Initial spawn position let snake = [ initialPosition ]; // Start with initial snake position let direction = null ; let apple = spawnApple (); let goldenApple = null ; // Variable for golden apple let score = 0 ; let skins = [ 'green' , 'blue' , 'red' , 'yellow' , 'purple' ]; let currentSkin = 0 ; // Index for the current skin let isPaused = false ; // Game pause state let appleCount = 0 ; // Count of regular apples collected // Load sound const soundEffect = new Audio ( 'https://www.myinstants.com/en/instant/snake-game-food-65186/?utm_source=copy&utm_medium=share' ); // URL to sound effect // Create skin selection section const shopContainer = document . createElement ( 'div' ); shopContainer . style . margin = '20px' ; shopContainer . style . textAlign = 'center' ; shopContainer . style . backgroundColor = 'lightgray' ; shopContainer . style . padding = '10px' ; shopContainer . style . borderRadius = '5px' ; const title = document . createElement ( 'h2' ); title . innerHTML = 'Shop - Choose Your Skin' ; shopContainer . appendChild ( title ); skins . forEach (( color , index ) => { const button = document . createElement ( 'button' ); button . innerHTML = ` Buy $ { color } Skin `; button . style . margin = '5px' ; button . onclick = () => { currentSkin = index ; // Change skin index }; shopContainer . appendChild ( button ); }); document . body . appendChild ( shopContainer ); // Control the snake with arrow keys document . addEventListener ( 'keydown' , ( event ) => { if ( event . key === 'ArrowUp' && direction !== 'DOWN' ) { direction = 'UP' ; soundEffect . play (); // Play sound on key press } else if ( event . key === 'ArrowDown' && direction !== 'UP' ) { direction = 'DOWN' ; soundEffect . play (); // Play sound on key press } else if ( event . key === 'ArrowLeft' && direction !== 'RIGHT' ) { direction = 'LEFT' ; soundEffect . play (); // Play sound on key press } else if ( event . key === 'ArrowRight' && direction !== 'LEFT' ) { direction = 'RIGHT' ; soundEffect . play (); // Play sound on key press } else if ( event . key === ' ' ) { isPaused = ! isPaused ; // Toggle pause on space soundEffect . play (); // Play sound on key press } }); // Game loop function game () { if (! isPaused ) { ctx . clearRect ( 0 , 0 , canvas . width , canvas . height ); // Clear the canvas for redrawing // Draw the background texture ctx . drawImage ( backgroundImage , 0 , 0 , canvas . width , canvas . height ); // Draw the snake for ( let i = 0 ; i < snake . length ; i ++) { ctx . fillStyle = ( i === 0 ) ? skins [ currentSkin ] : 'lightgreen' ; // Change head color based on current skin ctx . fillRect ( snake [ i ]. x , snake [ i ]. y , box , box ); ctx . strokeStyle = 'darkgreen' ; ctx . strokeRect ( snake [ i ]. x , snake [ i ]. y , box , box ); } // Draw the apple ctx . drawImage ( appleImage , apple . x , apple . y , box , box ); // Draw the golden apple if it exists if ( goldenApple ) { ctx . drawImage ( goldenAppleImage , goldenApple . x , goldenApple . y , box , box ); } // Move the snake let snakeX = snake [ 0 ]. x ; let snakeY = snake [ 0 ]. y ; if ( direction === 'LEFT' ) snakeX -= box ; if ( direction === 'UP' ) snakeY -= box ; if ( direction === 'RIGHT' ) snakeX += box ; if ( direction === 'DOWN' ) snakeY += box ; // Check if the snake eats the apple if ( snakeX === apple . x && snakeY === apple . y ) { score ++; appleCount ++; // Increment apple count apple = spawnApple (); // Spawn a new apple // Check if the apple count reached 100 if ( appleCount === 100 ) { goldenApple = spawnGoldenApple (); // Spawn golden apple } } else { snake . pop (); } // Check if the snake eats the golden apple if ( goldenApple && snakeX === goldenApple . x && snakeY === goldenApple . y ) { score += 500 ; // Add 500 points for golden apple goldenApple = null ; // Remove golden apple after eaten appleCount = 0 ; // Reset apple count after golden apple } // Add the new head const newHead = { x : snakeX , y : snakeY }; // Check for collisions with walls or itself if ( collision ( newHead , snake ) || snakeX < 0 || snakeX >= canvas . width || snakeY < 0 || snakeY >= canvas . height ) { alert ( 'Game Over! Your score: ' + score + '. Click OK to respawn.' ); teleportToSpawn (); // Teleport to spawn } else { snake . unshift ( newHead ); } ctx . fillStyle = 'black' ; ctx . font = '20px Arial' ; ctx . fillText ( 'Score: ' + score , box , box ); ctx . fillText ( 'Apples Collected: ' + appleCount , box , box + 20 ); // Display collected apples } else { ctx . fillStyle = 'black' ; ctx . font = '30px Arial' ; ctx . fillText ( 'Game Paused' , canvas . width / 2 - 70 , canvas . height / 2 ); } } // Check for collision with the snake itself function collision ( head , array ) { for ( let i = 0 ; i < array . length ; i ++) { if ( head . x === array [ i ]. x && head . y === array [ i ]. y ) { return true ; } } return false ; } // Teleport to spawn position function teleportToSpawn () { snake = [ initialPosition ]; // Reset snake to spawn position direction = null ; // Reset direction apple = spawnApple (); // Spawn a new apple goldenApple = null ; // Remove golden apple if it exists appleCount = 0 ; // Reset apple count } // Function to spawn apple in a valid location function spawnApple () { let newApple ; let isValidPosition = false ; while (! isValidPosition ) { newApple = { x : Math . floor ( Math . random () * ( canvas . width / box )) * box , y : Math . floor ( Math . random () * ( canvas . height / box )) * box }; // Check if the apple spawns on the snake isValidPosition = ! collision ( newApple , snake ); } return newApple ; } // Function to spawn golden apple in a valid location function spawnGoldenApple () { let newGoldenApple ; let isValidPosition = false ; while (! isValidPosition ) { newGoldenApple = { x : Math . floor ( Math . random () * ( canvas . width / box )) * box , y : Math . floor ( Math . random () * ( canvas . height / box )) * box }; // Check if the golden apple spawns on the snake or regular apple isValidPosition = ! collision ( newGoldenApple , snake ) && !( newGoldenApple . x === apple . x && newGoldenApple . y === apple . y ); } return newGoldenApple ; } // Start the game loop setInterval ( game , 100 ); })();