c# движение двух игроков одновременно

Пишу игру пинг-понг на c# в консоли, дошел до движения игроков(ракеток) и столкнулся с тем, что не могу сделать так чтобы два игрока могли двигаться одновременно, только один мог. Вот код где вызывается движение. Подозреваю в своей проблеме ReadKey, но даже так не знаю что делать, надеюсь на любую помощь! В комментариях уже сказали ReadKey, но к сожалению я не пришел к идеи как заменить этот метод :(

Весь код:

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;

namespace tennis
{
    class Program
    {
        // игра
        public static int widthsize = 45;
        public static int heightsize = 25;
        public static int multipliersize = 2;
        public static ConsoleColor textcolor = ConsoleColor.White;
        public static int FrameMS = 100;
        // барьер 
        public static char barrierchar = '█';
        public static ConsoleColor barriercolor = ConsoleColor.DarkGray;
        // бот
        public static bool activatebot = false;
        public static string botname = "bot";
        // игрок
        public static string[] playersname = new string[2] { "player1", botname };
        public static int playeronescore = 0;
        public static int playertwoscore = 0;
        public static char playerchar = '#';
        public static ConsoleColor playeronecolor = ConsoleColor.Red;
        public static ConsoleColor playertwocolor = ConsoleColor.Blue;
        static void Main(string[] args)
        {
            // устанавливаем размер консоли
            Console.SetWindowSize(widthsize* multipliersize, heightsize* multipliersize);
            // устанавливаем размер буфера
            Console.SetBufferSize(widthsize* multipliersize, heightsize* multipliersize);
            // запускаем игру
            startgame();
            Console.ReadKey();
        }
        public static void barrier()
        {
            // ширина 
            for (int i = 0; i < widthsize*multipliersize; i++)
            {
                new Pixel(i, 1, barrierchar, barriercolor);
                new Pixel(i, heightsize*multipliersize-2, barrierchar, barriercolor);
            }
            // по длине не вижу делать смысла ведь так будет понятно что сзади вас "ворота"
            // которые вы должны защищать
        }
        // настройки при старте игры
        public static async Task startgame()
        {
            //Спрашиваем количество игроков(1/2)
            Console.WriteLine("Количество игроков?(1/2)");
            // получаем клавишу
            ConsoleKey key = Console.ReadKey(true).Key;
            // ожидаем пока игок не нажмет на клавишу 1 или 2
            while (key != ConsoleKey.D1 && key != ConsoleKey.D2)
            {
                key = Console.ReadKey(true).Key;
            }
            // если игрок выбрал соло(против бота)
            if (key == ConsoleKey.D1)
            {
                Console.Write("Имя игрока: ");
                playersname[0] = Console.ReadLine();
                activatebot = true;
            }
            // если игрок выбрал дуэль(2 игрока)
            else  
            {
                Console.Write("Имя первого игрока: ");
                playersname[0] = Console.ReadLine();
                Console.Write("Имя второго игрока: ");
                playersname[1] = Console.ReadLine();
            }
            // очищаем консоль
            Console.Clear();
            // создаем барьер
            barrier();
            //убираем видимость курсора
            Console.CursorVisible = false;
            // ставим цвет текста перед его выводом
            Console.ForegroundColor = textcolor;
            // устанавливаем курсор для вывода информации игрока и бота
            // имя игрока
            Console.SetCursorPosition(1, 0);
            Console.Write(playersname[0]);
            // счет игрока
            // 2(пробел от левой стенки + пробел от имени)+длина ника
            Console.SetCursorPosition(2 + playersname[0].Length, 0);
            Console.Write(playeronescore);
            // имя бота
            // так как имя справа то и отчет с крайней правой точки(ширина*множитель-1(пробел от стенки)-длина имени
            Console.SetCursorPosition(widthsize * multipliersize - 1 - playersname[1].Length, 0);
            Console.Write(playersname[1]);
            // счет бота
            // так как счет справа то и отчет с крайней правой точки
            // (ширина*множитель-2(пробел от стенки+пробел от имени)-длина счета чтобы он всегда был в одном пробеле от имени
            Console.SetCursorPosition(widthsize * multipliersize - 2 - playersname[1].Length - playertwoscore.ToString().Length, 0);
            Console.Write(playertwoscore);
            // создаем игрока 1
            Player player1 = new Player(1, heightsize / 2 - 8, playerchar, playeronecolor);
            // создаем игрока 2
            Player player2 = new Player(widthsize * multipliersize - 2, heightsize / 2 - 8, playerchar, playertwocolor);
            // запускаем нашу игру
            // создаем таймер
            Stopwatch watcher = new Stopwatch();
            if (activatebot == true)
            {

            }   
            else
            {
                while (true)
                {
                    Task player1Task = Task.Run(() => player1.Move());
                    Task player2Task = Task.Run(() => player2.Move());
                    // запускаем таймер
                    /*
                    watcher.Restart();
                    while (watcher.ElapsedMilliseconds < FrameMS)
                    {

                    }
                    */
                }

            }
        }
    }
}

Pixel.cs(отрисовка в консоли)

using System;

public class Pixel
{
    public int x;
    public int y;
    public char pixel;
    public ConsoleColor color;
    public Pixel(int X, int Y, char Pixel, ConsoleColor Color)
    {
        x = X;
        y = Y;
        pixel = Pixel;
        color = Color;
        Draw();
    }
    public void Draw()
    {
        Console.ForegroundColor = color;
        Console.SetCursorPosition(x, y);
        Console.Write(pixel);
    }
    public void Clear()
    {
        Console.SetCursorPosition(x, y);
        Console.Write(' ');
    }
}

Direction.cs (перечисление с движением)

namespace tennis
{
    enum Direction
    {
        Up,
        Down
    }
}

Player.cs(класс с созданием игрока и его движением)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class Player
{
    public int playernumber;
    public Pixel[] racket = new Pixel[8];
    public Player(int X, int Y, char Pixel, ConsoleColor Color)
    {
        if (Color == tennis.Program.playeronecolor)
        {
            playernumber = 1;
        }
        else
        {
            playernumber = 2;
        }
        for (int i = 0; i < racket.Length; i++)
        {
            // заполняем массив из частей нашей ракетки
            racket[i] = new Pixel(X, Y + i, Pixel, Color);
            // отрисовываем ее
            racket[i].Draw();
        }
    }
    public void Clear()
    {
        foreach (var i in racket)
        {
            i.Clear();
        }
    }
    public async Task Move()
    {
        if (playernumber == 1)
        {
            ConsoleKey key = Console.ReadKey(true).Key;
            switch (key)
            {
                case ConsoleKey.W:
                    if (racket[0].y > 2)
                    {
                        Clear();
                        for (int i = 0; i < racket.Length; i++)
                        {
                            racket[i].y -= 1;
                            racket[i].Draw();
                        }
                    }
                    break;
                case ConsoleKey.S:
                    if (racket[racket.Length - 1].y < tennis.Program.heightsize * tennis.Program.multipliersize - 3)
                    {
                        Clear();
                        for (int i = 0; i < racket.Length; i++)
                        {
                            racket[i].y += 1;
                            racket[i].Draw();
                        }
                    }
                    break;
            }
        }
        else
        {
            ConsoleKey key = Console.ReadKey(true).Key;
            switch (key)
            {
                case ConsoleKey.UpArrow:
                    if (racket[0].y > 2)
                    {
                        Clear();
                        for (int i = 0; i < racket.Length; i++)
                        {
                            racket[i].y -= 1;
                            racket[i].Draw();
                        }
                    }
                    break;
                case ConsoleKey.DownArrow:
                    if (racket[racket.Length - 1].y < tennis.Program.heightsize * tennis.Program.multipliersize - 3)
                    {
                        Clear();
                        for (int i = 0; i < racket.Length; i++)
                        {
                            racket[i].y += 1;
                            racket[i].Draw();
                        }
                    }
                    break;
            }
        }
    }
}

Ответы (1 шт):

Автор решения: ikikaidesu

Решил свою проблему!

к сожалению не смог сделать так чтобы два игрока смогли зажимать, но зато сделал так чтобы они могли вообще двигаться через проверку Console.KeyAvailable.

→ Ссылка