nepster-web
@nepster-web

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

Делаю создание игры по заявке и наткнулся на следующую проблему.
Из предоставленного списка правил мне нужно сгенерировать форму для создания заявки по желаемым правилам.

Итак начну с сервера:

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'=> 'Да'],
                                 ]
            ]
        ];
    }


Следующий этап это виджет который и генерирует нашу форму. Виджет обращается к хелперу, который собирает общий массив правил и генерирует вот такую вот форму:

f0ef12f4ef944d40b3c4ffd254ea6a73.jpg

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

Собственно возникло несколько вопросов:
1) Поделитесь советом правильно ли я думаю в сторону организации правил для игр по заявкам ?
2) как все-же лучше всего прикрутить дочерние правила ?
  • Вопрос задан
  • 2319 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы