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 шт):
Решил свою проблему!
к сожалению не смог сделать так чтобы два игрока смогли зажимать, но зато сделал так чтобы они могли вообще двигаться через проверку Console.KeyAvailable.