var gamestate	= -1;	 // 0 - проигрыш / 1 - игра / -1 - начало игры
	
	var canvasSize	= 600;
	var floorSize	= 25;
	var tileSize	= canvasSize / floorSize;
	var chessboard	= true;
	
	var score		= 0;
	var maxScore	= 0;
	
	var snake		= [getRandomInt(floorSize*floorSize)]
	var food		= getRandomInt(floorSize*floorSize)
	
	var canvas
	var ctx
	var previousDir

	function main() {	 
		canvas			= document.getElementById("mainCamera");
		canvas.width	= canvasSize;
		canvas.height	= canvasSize;
		ctx = canvas.getContext("2d");

		window.addEventListener("keydown", handleKeyDown); // Слушатель события клавиатуры

		setInterval(render,		100);
		setInterval(physics,	100);
	}
	
	function handleKeyDown(event) {
		if (event.key === ' ') {
			if (gamestate === -1 || gamestate === 0) {
				gamestate = 1;
				score = 0;
				snake = [getRandomInt(floorSize * floorSize)];
				food = getRandomInt(floorSize * floorSize);
				previousDir = null; // Сбрасываем предыдущее направление при старте игры
			}
		}

		const directions = {
			'ArrowUp': 'up',
			'ArrowRight': 'right',
			'ArrowLeft': 'left',
			'ArrowDown': 'down'
		};

		const opposites = {
			'up': 'down',
			'down': 'up',
			'left': 'right',
			'right': 'left'
		};

		if (gamestate === 1 && directions[event.key] && directions[event.key] !== opposites[previousDir]) {
			snakeDir = directions[event.key];
			previousDir = snakeDir; // Обновляем предыдущее направление
		}
	}

	// Функция для получения индекса тайла из направления
	function getMovedTile(index, direction) {
		const moves = {
			up: -floorSize,
			down: floorSize,
			left: -1,
			right: 1
		};

		if (!moves.hasOwnProperty(direction)) return false;
		const newIndex = index + moves[direction];

		if (newIndex < 0 || newIndex >= floorSize * floorSize) return false; // ню индекс аут оф баундс

		if (direction === 'left' && index % floorSize === 0 ||
			direction === 'right' && (index + 1) % floorSize === 0) return false; //ню индекс аут оф горизонтальных баундс

		return newIndex;
	}
	
	function getRandomInt(max) {
	  return Math.floor(Math.random() * max);
	}
	
	// функция для проверки "шахматности" тайла по индексу
	function isChessTile(index) {
		return (Math.floor(index / floorSize) + (index % floorSize)) % 2 == 0;
	}
	
	// функция для рендера тайла по индексу
	function renderTile(index, color) {
		let fillStyle = ctx.fillStyle;
		
		if (color) ctx.fillStyle = color;				 
		let x = (index % floorSize) * tileSize;
		let y = Math.floor(index / floorSize) * tileSize;
		ctx.fillRect(x, y, tileSize, tileSize);
		ctx.fillStyle = fillStyle
	}
	
	function render() {	   
		ctx.clearRect(0, 0, canvas.width, canvas.height);
		ctx.fillStyle	 = "#ff70ff";  // светлый оттенок пурпурного
		ctx.fillRect(0, 0, canvas.width, canvas.height); // отрисовка фона
		
		// игра еще ни разу не начиналась
		if (gamestate == -1) {
			ctx.fillStyle = "#FFFF";
			ctx.font = "bold 30pt Arial";
			ctx.textAlign = "center"
			ctx.fillText("добро пожаловать! :3", 300, 295);
			ctx.font = "15pt Arial";
			ctx.fillText("нажмите пробел чтобы начать игру", 300, 295+25);
		}
		
		// игра проиграна
		if (gamestate == 0) {
			ctx.fillStyle = "#FFFF";
			ctx.font = "bold 30pt Arial";
			ctx.textAlign = "center"
			ctx.fillText("ви проебалі :(", 300, 275);
			ctx.font = "15pt Arial";
			ctx.fillText("счет: " + score + "	  рекорд: " + maxScore, 300, 275+30);
			ctx.fillText("нажмите пробел чтобы начать заново!", 300, 275+75);
		}
		
		// игра идет
		if (gamestate == 1) {
			// отрисовка шахматного поля
			if (chessboard) {
				for (let i = 0; i < floorSize * floorSize; i++) {
					if (isChessTile(i)) {renderTile(i, "#ff78ff");
					}
				}
			}
			
			// отрисовка еды
			renderTile(food, "#ffee00");
			
			// отрисовка змеи
			for (let i = 0; i < snake.length; i++) {
				renderTile(snake[i], "#800080");
			}
		}			 
	}
	
	function physics(){
		if(snakeDir){
			let snakeHead	= snake[0]
			let snakeTail	= snake.pop();
			snakeHead = getMovedTile(snakeHead, snakeDir)
			if(!snakeHead || snake.includes(snakeHead)) gamestate = 0;
			console.log(snake.includes(snakeHead))
			snake.unshift(snakeHead);
				if(snake[0] == food){
				snake.unshift(getMovedTile(snake[0], snakeDir));
				score = score + 1
				if (score > maxScore) {maxScore = score}
				food = getRandomInt(floorSize*floorSize)
			}
		}

	}


отрефактори код, почисть, поменяй объявление переменных в начале в более красивое и структурированное(порядок, комментарии, табуляции и пробелы) поменяй порядок функций в более читабельный и логичный и тд