Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно реализовать общую структуру правил д 
:(
    Опции темы
nepster
  Дата 14.8.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 26.4.2009

Репутация: нет
Всего: нет



Делаю игровой портал, где есть игры по заявкам и столы. 
Столы - фиксированные правила, пользователи присоединяются за стол и в любой момент могут уйти 
Заявки - пользователи создают игры по желаемым правилам (например играть в дурака переводного, колодой из 52 карт, на ход отводить 2 минуты).

Столкнулся с проблемами проектирования для правил игры по заявкам. 

GameProposalRulesInterface - интерфейс для реализации правил

Код

interface GameProposalRulesInterface
{
    public function getRulePlayers();
    
    public function getRuleMoney();
       
    public function getRuleTimeHit();

    public function getAdditionalRules();

}


Итак в любой заявке есть правило для выбора игроков (2, 3, 4, на пару), игра на интерес или на рейтинг и тп, время хода и дополнительные правила. 

Например:
Дурак: 2, 3, 4 или на пару, на интерес или на рейтинг, 60 секунд на ход, дурак переводной, колода из 52 карт
Шашки: 2 игрока, на интерес или на рейтинг, 60 секунд на ход, дамка ходит только на 1 клетку, бить назад нельзя

Правила описываются в конфигурационном файла примерно так:

Код

public function getRulePlayers() {
     return [
            'name'        => 'players',
            'description' => 'Кол-во игроков',
            'type'        => 'list-button',
            'options'     => [
                                ['value'=> '2',   'description' => 'Вдвоем', 'selected'=>'selected'],
                                ['value'=> '3',   'description' => 'Втроем'],
                                ['value'=> '4',   'description' => 'Вчетвером'],
                                ['value'=> '4.5', 'description' => 'На пару'],
                             ]
        ];
    }

    public function getRuleMoney() {
     return [
            'name'        => 'money',
            'description' => 'Игра на',
            'type'        => 'list-select',
            'options'     => [
                                [
                                    'value' => 0, 
                                    'description' => 'Интерес', 
                                    'selected'=>'selected'
                                ],
                                [
                                    'value' => 1,
                                    'description' => 'Деньги',
                                    'bet' => [
                                        'description' => 'Ставка',
                                        'type'        => 'numeric',
                                        'min'         => 0.1,
                                        'max'         => 100,
                                        'default'     => [0.1,0.25,0.50,1,2,3,5,10,25,50]
                                    ]
                                ],
                                [
                                    'value' =>-1,
                                    'description' => 'Голды',
                                    'bet' => [
                                        'description' => 'Ставка',
                                        'type'        => 'numeric',
                                        'min'         => 0.1,
                                        'max'         => 100,
                                        'default'     => 0.1
                                    ]
                                ],
                             ]
        ];
    }
   
    public function getRuleTimeHit() {
     return [
            'name'        => 'time_hit',
            'description' => 'Время на ход',
            'type'        => 'list-select',
            'options'     => [
                                ['value'=>30, 'description'=> '30 секунд'],
                                ['value'=>45, 'description'=> '45 секунд', 'selected'=>'selected'],
                                ['value'=>60, 'description'=> '1 минута'],
                                ['value'=>120,'description'=> '2 минуты'],
                             ]
        ];
    }

    public function getAdditionalRules() {
        return [            
         [
                'name'          => 'points_win',
                'description'   => 'Игра до',
                'type'          => 'list-button',
                'options'       => [
                                    ['value'=>301,  'description'=> '301 очков'],
                                    ['value'=>501,  'description'=> '501 очков', 'selected'=>'selected'],
                                    ['value'=>1001, 'description'=> '1001 очков'],
                                 ]
            ],
            
         [
                'name'        => 'kill_trump',
                'type'        => 'list-button',
                'description' => 'Перебивать козырь',
                'options'     => [
                                    ['value'=>0,  'description'=> 'Нет', 'selected'=>'selected'],
                                    ['value'=>1,  'description'=> 'Да'],
                                 ]
            ]
        ];
    }



Следующий этап это виджет который генерирует из общего массива правил игры (общий массив правил собирает спец. хелпер) форму для пользователя:
user posted image


Вопрос 1:
Как организовать дочерние правила ? Тоесть к примеру если пользователь выбирает играть на рейтинг, должно открыться окошко для ввода суммы.
Я генерировал эти правили и скрывал через display:block, но это не лучший вариант, так как данные летят на сервер.

Вопрос 2:
Поделитесь пожалуйста советом, возможно есть косяки при структуре и можно сделать лучше ?
PM MAIL   Вверх
ksnk
Дата 14.8.2014, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



nepster, Вопрос непонятен.

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

Таким образом, логика валидации параметров игры оказывается собрана в одном месте - в конструкторе класса игры. Дополнительно в классе есть метод-генератор формы ввода параметров игры. Его, вероятно, удобно разместить в классе-родителе всех таких игр.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
nepster
Дата 14.8.2014, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 26.4.2009

Репутация: нет
Всего: нет



Вы не так поняли. 

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

Вопрос в том, что у меня не выходит красиво с точки зрения проектирования оформить заявку. 

Тоесть мы делим игры на типы (столы, заявки, лоттереи и тп.). Берем к примеру тип заявки, к которому относятся: шашки, шахматы, нарды, дурак, деберц, морской бой и тп. 

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

эти все правила есть в любой игре текущего типа. Дальше есть дополнительные правила, которые в каждой игре разные. 

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

и 2 вопрос

Как организовать вложенные правила ? 




PM MAIL   Вверх
Game-lot
Дата 14.8.2014, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 8.11.2007

Репутация: нет
Всего: 2



воспользуйтесь форматом JSON или XML

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
nepster
Дата 14.8.2014, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 26.4.2009

Репутация: нет
Всего: нет



xml - умер =) 

а какая разница между массивом и json в данной ситуации ? 
PM MAIL   Вверх
Aliance
Дата 15.8.2014, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Мне кажется не верно разные игры подпихивать под один интерфейс. Скорее всего их должно быть несколько.

А что бы скрытые данные не посылались на сервер - им нужно назначать атрибут disabled

ПС: ksnk, что-то мне не кажется такое решение хорошим =(
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 15.8.2014, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Aliance @  15.8.2014,  07:55 Найти цитируемый пост)
 что-то мне не кажется такое решение хорошим =( 

Почему? Логика в одном месте - это всегда хорошо. Нет? Другое дело, что валидация делается через реакцию сервера, это немного замедляет реактивность.

Добавлено через 2 минуты и 51 секунду
nepster, Как хранить - какая разница? Чем не устраивает php-array? Если хочется чего-то более красивого - можно смотреть на yaml, но принципиальной разницы не очень много.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 15.8.2014, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(ksnk @  15.8.2014,  10:58 Найти цитируемый пост)
Почему? Логика в одном месте - это всегда хорошо. Нет? Другое дело, что валидация делается через реакцию сервера, это немного замедляет реактивность.

мне не понравилась сама идея "выполнить фейковую операцию и посмотреть что вернется в ответ". наверное, единственный раз, где это было оправдано в моем опыте - это создание объявлений через ВК АПИ (что логично - валидация находится на другом сервере, и может быть изменена - поэтому тестовое создание - единственное универсальное в том случае решение). А в собственном же проекте лучше обойтись без этого. Что мешает продублировать основные правила на клиент, как это обычно делается? Или я не правильно чего-то понял?
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 15.8.2014, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
nepster
Дата 15.8.2014, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 26.4.2009

Репутация: нет
Всего: нет



Фактически форма вообще не должна меняться. Ну может только в том случае, если в какой-то игре будет добавленно новое правило. 
Я даже не знаю, например пользователи попросили включить джокеров в игру дурака. 

Мне очень интересно как максимально просто хранить список правил, в каком вормате и максимально легко сгенерировать форму. 
Тоесть чтобы при добавлении новой игры, нужно было только внести ее в базу и добавить список правил. 
PM MAIL   Вверх
ksnk
Дата 15.8.2014, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(nepster @  15.8.2014,  13:46 Найти цитируемый пост)
Фактически форма вообще не должна меняться.


Цитата(nepster @  14.8.2014,  16:32 Найти цитируемый пост)
Я генерировал эти правили и скрывал через display:block, но это не лучший вариант, так как данные летят на сервер.

Так форма должна меняться?

В принципе, чтобы скрытые поля не передавали данные на сервер, их можно дополнительно disable' ить. Хотя и не понятно чему мешают лишние поля в post'е?

В Yaml есть алиасы и еще какие то навороты, что позволяет единые опции для разных игр определять в конфигурации в одном месте. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1589 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.