Просмотр полной версии : "Ставка -> Карта -> Игра", как умнее сделать?
Serg_pnz
23.10.2012, 14:10
Помогите разобраться с вопросом
Геймплей таков: пользователь "сел" за игровой стол. Он может выбрать карту, на которую ставит и ставку. Если оба выбора сделаны кнопка "Играть" становится активной.
При чем пользователь может менять карту, убавлять ставку, соответственно "Играть" тоже должна менять статус "Активна/не активна".
Как правильнее, гибче для дальнейшего использования сделать активацию "Играть"? Вижу варианты:
1. После клика на "Выбрать карту" ("Сделать ставку") проверять "Сделана ставка?" ("Выбрана карта?") и в зависимости от результатов активировать "Играть"
2. Использовать Объекты Deferred (тут не нравится, что переключать их можно один раз. Получается, что если игрок уберет ставку совсем, то статус "Ставка сделана" останется. Или я что-то не так понимаю?)
3. Использовать Объекты Callbacks - вообще не могу представить где в реальном кодинге сие нужно! То, что показывают в примерах "фу-бар", как-то ни о чем.
Буду рад выслушать любые мнения.
Serg_pnz
23.10.2012, 21:26
Апну под вечер, может у кого под "вечерний горячительный напиток" мысль появится?
Давайте хотя бы порассуждаем?
Как правильнее, гибче для дальнейшего использования сделать активацию "Играть"?
мое мнение - напрашиваются сущности (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? /*речь о игральных картах))*/, но всё равно прошу словами.
Как правильнее, гибче для дальнейшего использования сделать активацию "Играть"?
я бы сделал усовия, при которых игра будет "активна", и при любом бы действии проверял бы их список (ясное дело, что для оптимизации не стоит проверять сразу все ... я не противоречу сам себе ))
т.е. я вижу это как-то так :
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/finite_state_machines.php
Serg_pnz
24.10.2012, 09:38
DjDiablo,
всем плюсанул, а тебе не могу, что за система... (((
Спасибо, еще раз!
nerv_, спасибо!
было бы за что :)
черт, Map===Card? /*речь о игральных картах))*/, но всё равно прошу словами.
аха. Проглядел.
еще так можно накодить:
- он может выбрать карту;
- ставит/делает ставку;
- если оба выбора сделаны кнопка "Играть" становится активной;
- пользователь может менять карту;
- убавлять/менять ставку;
- соответственно "Играть" тоже должна менять статус "Активна/не активна".
Закомментированные методы для примере в зависимости от реальных потребностей.
var game = {
_players: [],
addPlayer: function() {
this._players.push( new Player() );
},
start: function() {
// start game
// some init
}
};
function Player() {
this.card = null;
this.bet = null;
}
Player.prototype = {
// addCard: function() {
// },
changeCard: function() {
game.buttons.play.updateState( this );
},
// removeCard: function() {
// },
makeBet: function() {
game.buttons.play.updateState( this );
},
// changeBet: function() {
// },
// removeBet: function() {
// }
};
game.buttons = {
play: {
updateState: function( player ) {
if ( player.card && player.bet ) {
// some action
return;
}
}
}
};
а можно еще словами логику?
логика простая:
- есть игра, куда можно добавить игрока;
- игрок, у которого есть карта и ставка, а также методы их (карту и ставку) меняющие;
- есть кнопки, в частности кнопка играть (play), у которой имеется метод "обновить состояние" (updateState), который опирается на текущее состояние карты и ставки игрока, и в зависимости от этого меняет свое (кнопки) вкл/выкл.
Т.е. все то, что ты описал :)
DjDiablo
24.10.2012, 19:30
Ха)))
Я переживу без плюсика ))
А вот хороший паттерн обижать ненадо.
Пример работы, http://www.z254505.infobox.ru/cardGame.html
исходник http://www.z254505.infobox.ru/cardGame.zip
upd: 25го исправлены небольшие недостатки в примере, вроде возможности нажать на невидимую кнопку game.
Serg_pnz
25.10.2012, 09:35
Курю ваши примеры второй день - ооочень абстрактно пока для меня, но я настойчивый)
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot