static void Main() { // Подключаем E3 App = e3App.ToE3(); App?.PutInfo(0, "Starting The Snake!"); Prj = App?.CreateJobObject(); Sheet = Prj.CreateSheetObject(); Graph = Prj.CreateGraphObject(); Sym = Prj.CreateSymbolObject(); // Выберем лист while (sheetid == 0) { sheetid = Prj.GetActiveSheetId(); Sheet.SetId(sheetid); if (sheetid == 0) { MessageBox.Show("Выберите лист для игры!"); } } //находим середину листа object xmin = 0; object ymin = 0; object xmax = 0; object ymax = 0; Sheet.GetDrawingArea(ref xmin, ref ymin, ref xmax, ref ymax); double centerX = Math.Round(((double)xmin + (double)xmax) / 2); double centerY = Math.Round(((double)ymin + (double)ymax) / 2); // Переменные мира int score = 5; Pixel head = new Pixel(centerX, centerY, 13); List <Pixel> body = new List <Pixel>(); for (int i = 0; i < score; i++) { if (i == 0) { body.Add(new Pixel(head.XPos - 2, head.YPos, 35)); } else { body.Add(new Pixel(body[i - 1].XPos - 2, body[i - 1].YPos, 35)); } } body.Reverse(); Direction currentMovement = Direction.Right; //Собираем коллекцию символов object symIds = 0; object xSmin = 0; object ySmin = 0; object xSmax = 0; object ySmax = 0; object xS = 0; object yS = 0; object gridS = 0; List <Symbol> symbols = new List <Symbol>(); int symCnt = Sheet.GetSymbolIds(ref symIds); var symIdsArray = (Array)symIds; foreach (var symId in symIdsArray) { if (symId != null) { Sym.SetId((int)symId); Sym.GetArea(ref xSmin, ref ySmin, ref xSmax, ref ySmax); Sym.GetSchemaLocation(ref xS, ref yS, gridS); string rotS = Sym.GetRotation(); if (rotS.Contains("x")) { symbols.Add(new Symbol((double)xS + (double)xSmin, (double)yS - (double)ySmax, (double)xS + (double)xSmax, (double)yS - (double)ySmin, (int)symId)); } else if (rotS.Contains("y")) { symbols.Add(new Symbol((double)xS - (double)xSmax, (double)yS + (double)ySmin, (double)xS - (double)xSmin, (double)yS + (double)ySmax, (int)symId)); } else { symbols.Add(new Symbol((double)xS + (double)xSmin, (double)yS + (double)ySmin, (double)xS + (double)xSmax, (double)yS + (double)ySmax, (int)symId)); } } } //////////////////////////////////////////////////////////////////////////////////////// while (true) { // Выход за границы листа gameover |= (head.XPos >= (double)xmax - 1 || head.XPos <= 1 || head.YPos >= (double)ymax - 1 || head.YPos <= 1); // Съесть символ foreach (var symbol in symbols) { if (symbol.Collide(head.XPos, head.YPos)) { score++; frameTime *= 0.9; Sym.SetId(symbol.Id); Sym.Delete(); symbols.Remove(symbol); break; } } Console.Clear(); Console.WriteLine($"Счет: {score - 5}"); //Рисуем тело for (int i = 0; i < body.Count; i++) { Pixel tmpbody = body[i]; DrawPixel(ref tmpbody); body[i] = tmpbody; gameover |= (body[i].XPos == head.XPos && body[i].YPos == head.YPos); } if (gameover) { break; } //Рисуем голову DrawPixel(ref head); //Ждем кадр var sw = Stopwatch.StartNew(); while (sw.ElapsedMilliseconds <= frameTime) { currentMovement = ReadMovement(currentMovement); } //Добавляем пиксель тела чтобы подвинуться body.Add(new Pixel(head.XPos, head.YPos, 35)); // Изменяем положение головы switch (currentMovement) { case Direction.Up: head.YPos += 2; break; case Direction.Down: head.YPos -= 2; break; case Direction.Left: head.XPos -= 2; break; case Direction.Right: head.XPos += 2; break; } //Удаляем змейку, чтобы перерисовать в новом кадре Clear(head, body); // Удаляем последнее звено из коллекции тела чтобы змея двигалась if (body.Count > score) { body.RemoveAt(0); } } // Сообщение с результатом MessageBox.Show($"Game over, Score: {score - 5}"); Clear(head, body); App = null; }