Использование потоков двух частей программы по-разному


На самом деле я пишу pacman (консоль C#), я хотел бы знать, как перемещать мой призрак каждую секунду, но я также хотел бы иметь возможность перемещать свой pacman, когда захочу.

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

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


person Anthony Raymond    schedule 08.05.2013    source источник
comment
Console Pacman : Рассматривали ли вы возможность использования XNA?   -  person phadaphunk    schedule 08.05.2013
comment
Я сделал ^^, но мне нужно использовать консольное приложение для школы   -  person Anthony Raymond    schedule 08.05.2013
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 08.05.2013
comment
@JohnSaunders Мне нравится, как все, кто ссылается на этот вопрос, формулируют его точно так же.   -  person phadaphunk    schedule 08.05.2013
comment
я думаю, что это нормально без резьбы. например: move_pac(); move_ghost(); Распечатать();   -  person dandice    schedule 08.05.2013
comment
это то, чего я хочу избежать, я не хочу, чтобы призрак дожидался действия пакмана, чтобы двигаться   -  person Anthony Raymond    schedule 08.05.2013
comment
@PhaDaPhunk: Я сочту это за искреннюю лесть.   -  person John Saunders    schedule 08.05.2013


Ответы (3)


Вы, вероятно, запутались, потому что Console.ReadKey() блокирует... так что ваш игровой цикл застрял бы в ожидании нажатия пользователем клавиши, верно? Что вы делаете, так это захватываете нажатие клавиши с помощью ReadKey() только в том случае, если оно уже есть в очереди. Это можно проверить с помощью Console.KeyAvailable, которая возвращает true, если ключ уже существует. Таким образом, игровой цикл просто продолжает зацикливаться, если ни одна клавиша не была нажата ... но вы все равно можете поймать его и что-то с ним сделать. Попробуйте этот быстрый пример и посмотрите, что произойдет:

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            System.Threading.Thread.Sleep(250);
            Console.Write(".");
            if (Console.KeyAvailable)
            {
                ConsoleKeyInfo key = Console.ReadKey(true); // read key without displaying it
                Console.WriteLine("");
                Console.WriteLine("Key Pressed: " + key.KeyChar.ToString());
            }
        }
    }
}
person Idle_Mind    schedule 08.05.2013

Вам не нужно использовать разные потоки для каждого призрака. Все это можно сделать в одном потоке, используя игровой цикл.

Центральным компонентом любой игры с точки зрения программирования является игровой цикл. Игровой цикл позволяет игре работать плавно независимо от действий пользователя или их отсутствия.

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

Игры, с другой стороны, должны продолжать работать независимо от действий пользователя. Игровой цикл позволяет это. Сильно упрощенный игровой цикл в псевдокоде может выглядеть примерно так:

   while( user doesn't exit )
     check for user input
     run AI
     move enemies
     resolve collisions
     draw graphics
     play sounds
   end while

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

Следуйте этому шаблону, и вашу игру будет намного проще написать.

person Scott Chamberlain    schedule 08.05.2013
comment
Проблема в том, что если я решу не двигать свой pacman, призраки замерзнут :s - person Anthony Raymond; 08.05.2013
comment
Это не так. Перемещение pacman будет на шаге Resolve Collisions. Если pacman не движется, эта функция просто ничего не делает в этом цикле. - person Scott Chamberlain; 08.05.2013

Наконец нашел то, что мне нужно:
Потоки и синхронизация потоков в C#

person Anthony Raymond    schedule 10.05.2013