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

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

Вопрос

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

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

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

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

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

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

 

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

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


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

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

  • 0

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

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

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


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

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

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


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

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

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


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

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

 

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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