Advertisement
SvetoslavUzunov

SnakeGame

Apr 26th, 2020
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.48 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections;
  6. using System.Threading;
  7.  
  8. namespace SnakeGame
  9. {
  10.     struct Position
  11.     {
  12.         public int row;
  13.         public int col;
  14.         public Position(int row, int col)
  15.         {
  16.             this.row = row;
  17.             this.col = col;
  18.         }
  19.     }
  20.     class program
  21.     {
  22.         static void Main(string[]args)
  23.         {
  24.             byte right = 0;
  25.             byte left = 1;
  26.             byte down = 2;
  27.             byte up = 3;
  28.             int lastFoodTime = 0;
  29.             int foodDissapearTime = 8000; // 8000 милисекунди = 8 секунди
  30.             Position[] directions = new Position[]
  31.             {
  32.                 new Position(0,1), //Дясно
  33.                 new Position(0,-1), //Ляво
  34.                 new Position(1,0), //Долу
  35.                 new Position(-1,0), //Горе
  36.             };
  37.             double sleepTime = 100;
  38.             int direction = right;
  39.             Random randomNumberGenerator = new Random(); //Генериране на случайни числа, за да увеличаваме размерът на змията
  40.             Console.BufferHeight = Console.WindowHeight; //Премахваме скрол бар-а
  41.             Position food = new Position(randomNumberGenerator.Next(0, Console.WindowHeight), randomNumberGenerator.Next(0, Console.WindowWidth)); // Създаваме ябълка
  42.             lastFoodTime = Environment.TickCount; //Записваме броят милисекунди от началото на системата
  43.             Console.SetCursorPosition(food.col, food.row); //Показваме храната
  44.             Console.Write("@");
  45.             Queue<Position> snakeElements = new Queue<Position>();
  46.             for (int i = 0; i <= 5; i++)
  47.             {
  48.                 snakeElements.Enqueue(new Position(0, i));
  49.             }
  50.             foreach (Position position in snakeElements)
  51.             {
  52.                 Console.SetCursorPosition(position.col, position.row);
  53.                 Console.Write("*");
  54.             }
  55.             while (true)
  56.             {
  57.                 if (Console.KeyAvailable) //Проверка, дали сме натиснали дадено копче(Не блокираме конзолата)
  58.                 {
  59.                     ConsoleKeyInfo userInput = Console.ReadKey();
  60.                     if (userInput.Key == ConsoleKey.LeftArrow)
  61.                     {
  62.                         if (direction !=right )  direction = left;
  63.                     }
  64.                     if (userInput.Key == ConsoleKey.RightArrow)
  65.                     {
  66.                         if (direction != left) direction = right;
  67.                     }
  68.                     if (userInput.Key == ConsoleKey.UpArrow)
  69.                     {
  70.                         if (direction != down) direction = up;
  71.                     }
  72.                     if (userInput.Key == ConsoleKey.DownArrow)
  73.                     {
  74.                         if (direction != up) direction = down;
  75.                     }
  76.                 }
  77.                 Position snakeHead = snakeElements.Last();
  78.                 Position nextDirection = directions[direction];
  79.                 Position snakeNewHead = new Position(snakeHead.row + nextDirection.row, snakeHead.col + nextDirection.col); //Нова позиция на змията
  80.  
  81.                 if (snakeNewHead.row < 0 || snakeNewHead.col < 0 || snakeNewHead.row >= Console.WindowHeight
  82.                     || snakeNewHead.col >= Console.WindowWidth || snakeElements.Contains(snakeNewHead)) //Проверяваме дали змията ни излиза извън конзолата и дали минава през себе си
  83.                 {
  84.                     Console.SetCursorPosition(0, 0);
  85.                     Console.WriteLine("Game over!");
  86.                     Console.WriteLine("Your points are: {0}", (snakeElements.Count - 6) * 100); //Вземаме броят елементи в змията и го превръщаме в точки, използваме плейсхоудър
  87.                     return; //Спираме програмата ни
  88.                 }
  89.                 snakeElements.Enqueue(snakeNewHead); //Вмъкваме новата глава
  90.                 Console.SetCursorPosition(snakeNewHead.col, snakeHead.row);
  91.                 Console.Write("*");
  92.                 if (snakeNewHead.col == food.col && snakeNewHead.row == food.row) //Проверяваме дали е стъпала на ябълката ни
  93.                 {
  94.                     do
  95.                     {
  96.                         food = new Position(randomNumberGenerator.Next(0, Console.WindowHeight), randomNumberGenerator.Next(0, Console.WindowWidth)); //Нова храна
  97.                     } while (snakeElements.Contains(food)); //Блокираме появяването на нова ябълка, върху змията ни
  98.                     lastFoodTime = Environment.TickCount;
  99.                     Console.SetCursorPosition(food.col, food.row); //Рисуваме храната
  100.                     Console.Write("@");
  101.                     sleepTime--; //С всяка изядена ябълка, увеличаваме скоростта на змията ни
  102.                 }
  103.                 else
  104.                 {
  105.                     Position last= snakeElements.Dequeue(); //Премахваме последният елемент от опашката на змията
  106.                     Console.SetCursorPosition(last.col, last.row);
  107.                     Console.Write(" "); //Вземаме последният елемет и на негово място рисуваме празен символ
  108.                 }
  109.                 //Проверка, дали ябълакта ни е с изтекъл срок, ако е добавяме нова храна
  110.                 if (Environment.TickCount - lastFoodTime >= foodDissapearTime)
  111.                 {
  112.                     //Преамахваме ябълката с изтекъл срок на годност
  113.                     Console.SetCursorPosition(food.col, food.row);
  114.                     Console.Write(" ");
  115.                     //Създадваме новата храна
  116.                     do
  117.                     {
  118.                         food = new Position(randomNumberGenerator.Next(0, Console.WindowHeight), randomNumberGenerator.Next(0, Console.WindowWidth));
  119.                     } while (snakeElements.Contains(food)); //Блокираме появяването на нова ябълка, върху змията ни
  120.                     lastFoodTime = Environment.TickCount; //Запазваме последното време в което сме я създали
  121.                 }
  122.                 Console.SetCursorPosition(food.col, food.row); //Рисуваме храната
  123.                 Console.Write("@");
  124.  
  125.                 sleepTime -= 0.01;
  126.                 Thread.Sleep((int)sleepTime); //Забавяме изпълнението на програмата в милисекунди
  127.  
  128.                 //Когато имаме нов елемент на змията, рисуваме
  129.                 //Когато местим змията, премахваме старият елемент от опашката
  130.                 //Когато хапваме от ябълката, създаваме нова
  131.             }
  132.         }
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement