using System; using System.Collections.Generic; using System.Threading.Tasks; namespace App { public class World { public List Actors { get; } = new List(); private readonly int fieldH; private readonly int fieldW; private readonly Point _drawingPoint; public World(int h, int w, Point drawingPoint) { fieldH = h; fieldW = w; _drawingPoint = drawingPoint; } public void DrawField() { char[] c = new char[fieldW]; Array.Fill(c, '.'); for (int i = 0; i < fieldH; i++) { Console.SetCursorPosition(_drawingPoint.X, _drawingPoint.Y + i); Console.WriteLine(c); } foreach (var actor in Actors) { DrawActor(actor); } Console.ResetColor(); Console.SetCursorPosition(0, _drawingPoint.Y + fieldH + 1); } public void Tick() { foreach (var actor in Actors) { actor.TickAction(); } } private void DrawActor(IActor actor)//Чтобы наш эктор в рамках поля рисовался { Console.SetCursorPosition((actor.PositionInsideField.X + _drawingPoint.X), (actor.PositionInsideField.Y + _drawingPoint.Y)); Console.ForegroundColor = actor.Color; Console.Write(actor.Icon); } } public struct Point { public int X, Y; public Point(int x, int y) { X = x; Y = y; } } public interface IActor { ConsoleColor Color { get; } char Icon { get; } Point PositionInsideField { get; } void TickAction(); } public class ActorA : IActor { public ConsoleColor Color => ConsoleColor.Red; public char Icon => '@'; private Point pos = new Point(2, 2); public Point PositionInsideField => pos; private bool moveRight = false; public void TickAction() { if (moveRight) pos.X++; else pos.X--; if (pos.X > 10 || pos.X < 1) moveRight = !moveRight; } } public class ActorB : IActor { public ConsoleColor Color => ConsoleColor.Blue; public char Icon => '*'; private Point pos = new Point(9, 9); public Point PositionInsideField => pos; private bool moveUp = false; public void TickAction() { if (moveUp) pos.Y++; else pos.Y--; if (pos.Y > 10 || pos.Y < 1) moveUp = !moveUp; } } class Program { public static int ReadInt => int.Parse(Console.ReadLine()); public static async Task Main() { World f = new World(20, 20, new Point(5, 5)); f.Actors.Add(new ActorA()); f.Actors.Add(new ActorB()); while (true) { f.Tick(); f.DrawField(); await Task.Delay(50); } } } }