Перейти к содержимому
  • 0
Doob

[CC] Игральные карты (Универсальное ядро 54)

Вопрос

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

  • открыть/закрыть карты
  • передать карты на стол/передать другому игроку
  • передать монеты на стол/игроку

Команды дилера:

  • перепешать колоду
  • раздать карты игрокам/на стол
  • перевести деньги со стола игрокам
  • заморозить игрока
  • сбросить информацию о картах

Загвоздка в том, что при обновлении таблицы подтормаживает реднет сеть и два игрока одновременно не могут послать команды на комп дилера.

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

 

Может кто посоветовать, как настроить синхронизацию команд и быстрое обновление таблицы?
 
Вот ссылка на сам коммандный движок http://pastebin.com/0m3LXTzD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

В каком случае вызывается функция executeCMD ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

executeCMD ловит сообщения игроков и параллельно команды дилера, может мне на каждого игрока по потоку сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Достаточно сделать отдельный поток, который бы слушал сеть, обрабатывал принятый пакет и снова погружался в rednet.receive. Два игрока все равно не смогут послать пакеты одновременно, как бы не старались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Достаточно сделать отдельный поток, который бы слушал сеть, обрабатывал принятый пакет и снова погружался в rednet.receive. Два игрока все равно не смогут послать пакеты одновременно, как бы не старались.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как работает система событий в CraftOS?

Когда возникает какое либо событие (тикает таймер, нажимается клавиша, приходит пакет по сети и т.д.), оно становится в очередь событий. Существует функция os.pullEvent, которая вытаскивает первое событие из очереди и возвращает его программе. Функция эта имеет параметр фильтр. Если этот параметр не пустой, pullEvent вытаскивает из очереди события, пока не вытащит совпадающее с фильтром. Все не совпавшие события будут потеряны.

К примеру функция sleep ждет события "timer", а функция read - "char" и "key". Это значит, что пока эти функции не завершат свою работу, rednet-пакеты будут теряться.

Как этого избежать?

Способ №1: Нужно обрабатывать все события, которые нужно обработать. Т.е. вызываешь pullEvent без параметра (а не sleep или read) и в зависимости от того какое пришло событие делаешь те или иные действия.

Способ №2: Организовываешь многопоточность и в каждом потоке обрабатываешь какое то одно событие. Например, один поток - для обмена по сети, один - для ввода с клавиатуры и т.д.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...