Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   "Ставка -> Карта -> Игра", как умнее сделать? (https://javascript.ru/forum/jquery/32615-stavka-karta-igra-kak-umnee-sdelat.html)

Serg_pnz 23.10.2012 14:10

"Ставка -> Карта -> Игра", как умнее сделать?
 
Помогите разобраться с вопросом

Геймплей таков: пользователь "сел" за игровой стол. Он может выбрать карту, на которую ставит и ставку. Если оба выбора сделаны кнопка "Играть" становится активной.
При чем пользователь может менять карту, убавлять ставку, соответственно "Играть" тоже должна менять статус "Активна/не активна".

Как правильнее, гибче для дальнейшего использования сделать активацию "Играть"? Вижу варианты:
1. После клика на "Выбрать карту" ("Сделать ставку") проверять "Сделана ставка?" ("Выбрана карта?") и в зависимости от результатов активировать "Играть"
2. Использовать Объекты Deferred (тут не нравится, что переключать их можно один раз. Получается, что если игрок уберет ставку совсем, то статус "Ставка сделана" останется. Или я что-то не так понимаю?)
3. Использовать Объекты Callbacks - вообще не могу представить где в реальном кодинге сие нужно! То, что показывают в примерах "фу-бар", как-то ни о чем.

Буду рад выслушать любые мнения.

Serg_pnz 23.10.2012 21:26

Апну под вечер, может у кого под "вечерний горячительный напиток" мысль появится?
Давайте хотя бы порассуждаем?

nerv_ 23.10.2012 22:40

Цитата:

Сообщение от Serg_pnz
Как правильнее, гибче для дальнейшего использования сделать активацию "Играть"?

мое мнение - напрашиваются сущности (for example)
var player = {
    selectMap: function() {
        buttonPlay.updateState( someArg );
    },
    makeBet: function() {
        buttonPlay.updateState( someArg );
    }
};

var buttonPlay = {
    updateState: function( someArg ) {
    }
};

Serg_pnz 23.10.2012 23:05

nerv_, спасибо!
а можно еще словами логику?

Serg_pnz 23.10.2012 23:10

черт, Map===Card? /*речь о игральных картах))*/, но всё равно прошу словами.

melky 24.10.2012 00:07

Цитата:

Сообщение от Serg_pnz
Как правильнее, гибче для дальнейшего использования сделать активацию "Играть"?

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

т.е. я вижу это как-то так :
Game = {

    conditions: [],

    conditionsAreAbided: function () {
        return this.conditions.every(function (condition) {
            
            return condition.check();//.....
            
        });
    }

    // ...

};

DjDiablo 24.10.2012 00:11

Вот что получилось :)
Можно пред тавить что игра находится в разных состояниях. И переключаться между этими состояниями.
Это самый банальный подход в играх. Это автоматы основанные на состояниях

Однако я сделал финт ушами и привязал события к определённому состоянию, тоесть система находясь в определённом состоянии будет реагировать на события. Несколько состояний могут быть подписаны как game.event([1,2,3],{//какаято инфа});

game={
      state:0,
     
      //флаги выбора ставки и карты / могли бы быть переменные со значением карты и суммой ставки
      selcarta:false,
      selstavka:false,

      //функция переключающая состояния
      setState:function(state){
            this.state=state;
     },  

     //альтернативный вариант переключения состояний
     nextState:function(){
           this.state++;
     },

     // запускает состояние
     goState:function(state){
         //необязательное переключение состояния
          if(state) this.state=state; 
          this[this.state](param);
     },
             
     //вызывает состояние как обработчик события 
     event:function(state,param){
           //если это массив, то подписаны несколько состояний      
           if (typeof(state) == 'object'){      
                 for (var i=0;i<state.length;i++) {
                      if (state[i]==this.state)  this[this.state](param);
                 }                  
          } else {
                //если только одно состояние
                if (state==this.state) this[state](param);
          }
    },

     //состояния игры

      //блок инициализации
     "0":function(){
        $("карта").click(function(){ game.event('1',{act:"selcarta"})})
        $("ставка").click(function(){ game.event('1',{act:"selstavka"} )})
        $("кнопка игра").click(function(){game.event('3')})

        game.setState('1');
     },
     
     //проверяем выбор пользователя
     "1":function(param){            
                  if(param.act=="selcarta") this.selcarta=true; 
                  if(param.act=="selstavka") this.selstavka=true;

                 //если оба условия определены, то переходим к активации кнопки
                 if (this.selstavka && this.selcarta) game.goState(2);                     
     },

     //активируем кнопку
     "2":function(){
            // что-то делаем, допустим активируем кнопку играть

            //переходим на состояние в котором ждём нажатия кнопки.
            this.setState(3);//
     },

     //реагирует на нажатие кнопки играть
     "3":function(){
             alert("ура мы играем");

             //вернёмся обратно к ожиданию нажатий по картам        
             game.setState('1'); 
     }

     //другие состояния, к примеру ход противника, тусовка колоды, вычисление удачности хода и тп, и тд
}

//начинаем игру
game.goState(0);

Serg_pnz 24.10.2012 00:30

спасибо! буду разбирать варианты!

собственно пока речь идет о игре "игрокИ vs казино", т.е. за столом несколько юзеров против системы, играем по очереди, но ставки в один ход (блек-джек, если хотите), в перспективе игра между юзерами.

PS: дай мне Бог терпения на релиз!

DjDiablo 24.10.2012 01:26

До кучи
Кури что то вроде http://shatalov.su/ru/articles/ai/fi...e_machines.php

Serg_pnz 24.10.2012 09:38

DjDiablo,
всем плюсанул, а тебе не могу, что за система... (((
Спасибо, еще раз!


Часовой пояс GMT +3, время: 03:38.