Заявление блокировки C# - Console.SetCursorPositon

Я хочу создать программу, которая одновременно перемещает двух игроков. Проблема в том, что я не знаю, как помешать каждому игроку показывать свой символ в другом месте.

Код:

class Player
{
    public int X { get; set; }
    public int Y { get; set; }

    private char symbol;
    private object Object = new object();
    public Player(char symbol)
    {
        this.symbol = symbol;            
    }

    public void Move(object obj)
    {
        if (!(obj is Random))
            throw new Exception("Object isnt Random instance");
        Random rnd = obj as Random;

        X = rnd.Next(50);
        Y = rnd.Next(50);

        while (true)
        {
            int xChange = 0, yChange = 0;

            if (rnd.Next(100) < 50)
                xChange = rnd.Next(-1, 2);
            else
                yChange = rnd.Next(-1, 2);

            if (X + xChange < 0 || X + xChange > Console.BufferWidth || Y + 
            yChange < 0 || Y + yChange > Console.BufferHeight)
                continue;

            lock (Object)//critical section
            {
                Console.SetCursorPosition(X, Y);
                Console.Write(" ");
                Console.SetCursorPosition(X + xChange, Y + yChange);
                Console.Write(symbol);
            }

            X = X + xChange;
            Y = Y + yChange;

            Thread.Sleep(1000);
        }
    }
}

class GameManager
{
    private List<Player> players = new List<Player>();
    private Dictionary<Player, Thread> threads = new Dictionary<Player, 
    Thread>();
    public static bool simulationStop = false;
    private static Random rnd = new Random();

    public GameManager()
    {
        players.Add(new Player('O'));
        players.Add(new Player('X'));
    }

    public void Go()
    {
        Console.CursorVisible = false;
        CreateThreads();

        while(simulationStop == false)
        {
            Thread.Sleep(1000);
        }

        //close all Threads at the end of the simulation
        foreach (KeyValuePair<Player, Thread> pair in threads)
        {
            threads[pair.Key].Abort();
        }
    }

    private void CreateThreads()
    {
        foreach(Player p in players)
        {
            threads.Add(p, new Thread(new 
            ParameterizedThreadStart(p.Move)));

            threads[p].Start(rnd);
        }
    }
}

Я использую оператор блокировки, чтобы предотвратить одновременное попадание потоков в критическую секцию, но по какой-то причине он не работает ...

Заранее спасибо!

Каждый игрок блокирует свою собственную блокировку, поэтому, если у вас есть один поток для каждого игрока, они оба смогут войти в этот раздел одновременно. Не то чтобы я уверен, что потоки - лучший подход здесь, особенно когда вы прерываете потоки ...

Jon Skeet 05.05.2018 23:14

Многопоточность и консоли несовместимы. Если бы у вас была какая-либо технология графического интерфейса, я бы также отметил, что они и игры тоже плохо сочетаются. Вы используете консоль, которая еще хуже микшируется. Честно говоря, это звучит так, как будто вы используете многопоточность и блокировку для чего-то вроде пошаговой многопользовательской игры с горячим местом, что тоже может быть самым обратным путем.

Christopher 05.05.2018 23:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
66
0

Другие вопросы по теме