mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-03-03 11:37:01 +00:00
191 lines
5.6 KiB
C#
191 lines
5.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading;
|
|
|
|
namespace CMLeonOS.Commands.Utility
|
|
{
|
|
public static class SnakeCommand
|
|
{
|
|
private static readonly int width = 40;
|
|
private static readonly int height = 20;
|
|
private static readonly int snakeStartLength = 3;
|
|
private static List<(int x, int y)> snake;
|
|
private static (int x, int y) food;
|
|
private static (int dx, int dy) direction;
|
|
private static bool running;
|
|
private static Random random;
|
|
private static int score;
|
|
private static bool gameOver;
|
|
|
|
public static void PlaySnake()
|
|
{
|
|
Console.Clear();
|
|
|
|
InitializeGame();
|
|
|
|
while (running)
|
|
{
|
|
if (Console.KeyAvailable)
|
|
{
|
|
var key = Console.ReadKey(true);
|
|
HandleInput(key);
|
|
}
|
|
|
|
Update();
|
|
Render();
|
|
|
|
if (gameOver)
|
|
{
|
|
ShowGameOver();
|
|
break;
|
|
}
|
|
|
|
Thread.Sleep(100);
|
|
}
|
|
|
|
Console.Clear();
|
|
Console.ResetColor();
|
|
}
|
|
|
|
private static void InitializeGame()
|
|
{
|
|
snake = new List<(int, int y)>();
|
|
direction = (1, 0);
|
|
random = new Random();
|
|
score = 0;
|
|
gameOver = false;
|
|
running = true;
|
|
|
|
int startX = width / 2;
|
|
int startY = height / 2;
|
|
|
|
for (int i = 0; i < snakeStartLength; i++)
|
|
{
|
|
snake.Add((startX - i, startY));
|
|
}
|
|
|
|
SpawnFood();
|
|
}
|
|
|
|
private static void HandleInput(ConsoleKeyInfo key)
|
|
{
|
|
switch (key.Key)
|
|
{
|
|
case ConsoleKey.UpArrow:
|
|
if (direction.dy == 0)
|
|
direction = (0, -1);
|
|
break;
|
|
case ConsoleKey.DownArrow:
|
|
if (direction.dy == 0)
|
|
direction = (0, 1);
|
|
break;
|
|
case ConsoleKey.LeftArrow:
|
|
if (direction.dx == 0)
|
|
direction = (-1, 0);
|
|
break;
|
|
case ConsoleKey.RightArrow:
|
|
if (direction.dx == 0)
|
|
direction = (1, 0);
|
|
break;
|
|
case ConsoleKey.Escape:
|
|
case ConsoleKey.Q:
|
|
running = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void Update()
|
|
{
|
|
if (!running || gameOver)
|
|
return;
|
|
|
|
int headX = snake[0].x + direction.dx;
|
|
int headY = snake[0].y + direction.dy;
|
|
|
|
if (headX < 0 || headX >= width || headY < 0 || headY >= height)
|
|
{
|
|
gameOver = true;
|
|
return;
|
|
}
|
|
|
|
for (int i = 1; i < snake.Count; i++)
|
|
{
|
|
if (headX == snake[i].x && headY == snake[i].y)
|
|
{
|
|
gameOver = true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
snake.Insert(0, (headX, headY));
|
|
|
|
if (headX == food.x && headY == food.y)
|
|
{
|
|
score += 10;
|
|
SpawnFood();
|
|
}
|
|
else
|
|
{
|
|
snake.RemoveAt(snake.Count - 1);
|
|
}
|
|
}
|
|
|
|
private static void Render()
|
|
{
|
|
Console.SetCursorPosition(0, 0);
|
|
Console.ForegroundColor = ConsoleColor.DarkBlue;
|
|
Console.BackgroundColor = ConsoleColor.Black;
|
|
Console.Clear();
|
|
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
foreach (var segment in snake)
|
|
{
|
|
Console.SetCursorPosition(segment.x, segment.y);
|
|
Console.Write("#");
|
|
}
|
|
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.SetCursorPosition(food.x, food.y);
|
|
Console.Write("O");
|
|
|
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
Console.SetCursorPosition(0, height);
|
|
Console.Write($"Score: {score} | Arrow keys to move | ESC or Q to quit");
|
|
|
|
Console.ResetColor();
|
|
}
|
|
|
|
private static void SpawnFood()
|
|
{
|
|
bool validPosition = false;
|
|
while (!validPosition)
|
|
{
|
|
food.x = random.Next(0, width);
|
|
food.y = random.Next(0, height);
|
|
|
|
validPosition = true;
|
|
foreach (var segment in snake)
|
|
{
|
|
if (food.x == segment.x && food.y == segment.y)
|
|
{
|
|
validPosition = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void ShowGameOver()
|
|
{
|
|
Console.Clear();
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.SetCursorPosition(width / 2 - 5, height / 2);
|
|
Console.WriteLine("GAME OVER!");
|
|
Console.SetCursorPosition(width / 2 - 8, height / 2 + 1);
|
|
Console.WriteLine($"Final Score: {score}");
|
|
Console.SetCursorPosition(width / 2 - 10, height / 2 + 3);
|
|
Console.WriteLine("Press any key to exit...");
|
|
Console.ReadKey(true);
|
|
}
|
|
}
|
|
} |