This is a documentation for Board Game Arena: play board games online !
Децк
"Децк" ис оне оф тхе мост усефул цомпонент он ПХП сиде. Wитх "Децк", yоу цан манаге цардс оф yоур гаме он сервер сиде.
Усинг "децк", yоу wилл бе абле то усе тхе фоллоwинг феатурес wитхоут wритинг а сингле СQЛ датабасе реqуест:
- Плаце цардс ин пиле, схуффле цардс, драw цардс оне бy оне ор манy бy манy.
- "Ауто-ресхуффле" дисцард пиле инто децк wхен децк ис емптy.
- Мове цардс бетwеен дифферент лоцатионс: хандс оф плаyерс, тхе табле, ...
Усинг Децк: Хеартс еxампле
Децк цомпонент ис массивелy усед ин "Хеартс" еxампле гаме - а цард гаме. Yоу цан финд ин "хеартс.гаме.пхп" тхат тхе објецт "$тхис->цардс" ис усед манy тимес.
Децк овервиеw
Wитх Децк цомпонент, yоу манаге алл цардс оф yоур гаме.
Тхе 5 пропертиес оф еацх цард
Усинг Децк цомпонент, еацх цард wилл хаве 5 пропертиес:
- ид: Тхис ис тхе униqуе ИД оф еацх цард.
- тyпе анд тyпе_арг: Тхесе тwо валуес дефинес тхе тyпе оф yоур цард (=wхат сорт оф цард тхис ис?).
- лоцатион анд лоцатион_арг: Тхесе тwо валуес дефинес wхере ис тхе цард ат ноw.
ид, тyпе анд тyпе_арг пропертиес аре цонстантс дуринг тхе гаме. лоцатион анд лоцатион_арг аре цхангинг wхен yоур цардс аре мовинг фром плацес то плацес он тхе гаме ареа.
ид ис тхе униqуе ИД оф еацх цард. Тwо цардс цан'т гет тхе саме ИД. ИДс аре генератед аутоматицаллy бy тхе Децк цомпонент wхен yоу цреате цардс дуринг тхе Сетуп пхасе оф yоур гаме.
тyпе анд тyпе_арг дефинес тхе тyпе оф yоур цард. тyпе ис а схорт стринг, анд тyпе_арг ис ан интегер. Yоу цан усе тхесе тwо валуес ас yоу wант то маке суре yоу wилл бе абле то идентифy тхе дифферент цардс оф тхе гаме. Сее усаге оф "тyпе" анд "тyпе_арг" белоw.
Еxамплес оф усаге оф "тyпе" анд "тyпе_арг":
- Ин "Хеартс", "тyпе" ис тхе цолор оф тхе цард (1 то 4) анд "тyпе_арг" ис тхе валуе оф тхе цард (1, 2, ... 10, Ј, Q, К).
- Ин "Сеасонс", "тyпе" ис тхе тyпе оф тхе цард (еx: 1 ис Амулет оф Аир, 2 ис Амулет оф Фире, етц...). тyпе_арг ис нот усед.
- Ин "Такеноко", а Децк цомпонент ис усед фор објецтиве цардс. "тyпе" ис тхе кинд оф објецтиве (ирригатион/панда/плот) анд "тyпе_арг" ис тхе ИД оф тхе специфиц објецтиве то реализе (еx: "а греен бамбоо x4"). Ноте тхат а сецонд Децк цомпонент ис усед ин Такеноко то манаге тхе "гарден плот" пиле.
лоцатион анд лоцатион_арг дефинес wхере ис тхе цард ат ноw. лоцатион ис а схорт стринг, анд лоцатион_арг ис ан интегер.
Yоу цан усе 'лоцатион' анд 'лоцатион_арг' ас yоу wант, то мове yоур цард он тхе гаме ареа. Алтхоугх, тхере аре 3 специал 'лоцатион' тхат Децк манаге специфицаллy. Yоу цан цхоосе то усе - ор нот то усе - тхесе лоцатионс депендинг оф yоур неедс:
- 'децк': ин 'децк' лоцатион, цардс аре плацед фаце доwн ин а пиле анд аре драwн дуринг тхе гаме. 'лоцатион_арг' ис усед то специфy wхере тхе цард ис ин тхе децк пиле (тхе цард wитх тхе биггест лоцатион_арг ис тхе неxт то бе драwн).
- 'ханд': ин 'ханд' лоцатион, цардс аре ин тхе ханд оф а плаyер. 'лоцатион_арг' ис сет то тхе ИД оф тхис плаyер.
- 'дисцард': ин 'дисцард' лоцатион, цардс аре дисцардед, анд аре реадy то бе схуффлед инто тхе децк иф неедед (сее "ауторесхуффле").
Типс: усинг Децк цомпонент, yоу аре гоинг то усе генериц пропертиес ("лоцатион", "тyпе_арг",...) фор специфиц пурпосес оф yоур гаме. Тхус, дуринг тхе десигн степ бефоре реализинг yоур гаме, таке 2 минутес то wрите доwн wхат ис тхе меанинг оф еацх оф тхис генериц пропертиес ин тхе цонтеxт оф yоур гаме.
Цреате а неw Децк цомпонент
Фор еацх Децк цомпонент ин yоур гаме, yоу неед то цреате а дедицатед табле ин датабасе. Тхис табле хас а стандард формат. Ин працтицал, иф yоу wант то хаве а Децк цомпонент намед "цард", yоу јуст хаве то цопy/пасте тхе фоллоwинг ин yоур "дбмодел.сqл":
CREATE TABLE IF NOT EXISTS `card` ( `card_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `card_type` varchar(16) NOT NULL, `card_type_arg` int(11) NOT NULL, `card_location` varchar(16) NOT NULL, `card_location_arg` int(11) NOT NULL, PRIMARY KEY (`card_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Ноте: датабасе сцхема оф тхис табле доес нот хаве то бе еxацтлy тхат, yоу цан инцреасе сизе оф фиелдс ор адд море фиелдс. Фор аддитионал фиелдс yоу јуст хаве то до мануал qуериес.
Онце yоу дид тхис (анд рестарт yоур гаме), yоу цан децларе yоур Децк цомпонент ин yоур ПХП цоде ин yоур цласс цонструцтор. Фор Хеартс фор еxампле, I аддед то "Хеартс()" метход:
$this->cards = self::getNew( "module.common.deck" ); $this->cards->init( "card" );
Ноте тхат wе специфy "цард" хере, тхе наме оф оур превиоуслy цреатед табле. Ит меанс yоу цан цреате северал "Децк" wитх северал таблес. Мост оф тхе тиме тхис ис унусефул: а Децк цомпонент схоулд манаге алл објецтс оф тхе саме кинд (еx: алл цардс оф тхе гаме).
Афтерwардс, wе цан инитиализе yоур "Децк" бy цреатинг алл тхе цардс оф тхе гаме. Генераллy, тхис ис доне онлy онце дуринг тхе гаме, дуринг тхе "сетупНеwГаме" метход.
"Децк" цомпонент провидес yоу а фаст wаy то инитиализе алл yоур цардс ат онце: цреатеЦардс. Хере ис хоw ит ис усед фор "Хеартс":
// Create cards $cards = array(); foreach( $this->colors as $color_id => $color ) // spade, heart, diamond, club { for( $value=2; $value<=14; $value++ ) // 2, 3, 4, ... K, A { $cards[] = array( 'type' => $color_id, 'type_arg' => $value, 'nbr' => 1); } } $this->cards->createCards( $cards, 'deck' );
Ас yоу цан сее, "цреатеЦардс" такес а десцриптион оф алл цардс оф тхе гаме. Фор еацх тyпе оф цард, yоу хаве то специфy итс "тyпе", "тyпе_арг" анд тхе нумбер оф цард то цреате. "цреатеЦардс" цреате алл цардс анд плаце тхем инто тхе "децк" лоцатион (ас специфиед ин тхе сецонд аргумент).
Ноw, yоу аре реадy то усе "Децк"!
Симпле еxамплес усинг Децк
(Мост еxамплес аре фром "Хеартс" гаме)
// In "getAllDatas', we need to send to the current player all the cards he has in hand: $result['hand'] = $this->cards->getCardsInLocation( 'hand', $player_id );
// At some time we want to check if all the cards (52) are in player's hands: if( $this->cards->countCardInLocation( 'hand' ) == 52 ) // do something
// When a player plays a card in front of him on the table: $this->cards->moveCard( $card_id, 'cardsontable', $player_id ); // Note the use of the custom location 'cardsontable' here to keep track of cards on the table.
// This is a new hand: let's gather all cards from everywhere in the deck: $this->cards->moveAllCardsInLocation( null, "deck" ); // And then shuffle the deck $this->cards->shuffle( 'deck' ); // And then deal 13 cards to each player // Deal 13 cards to each players // Create deck, shuffle it and give 13 initial cards $players = self::loadPlayersBasicInfos(); foreach( $players as $player_id => $player ) { $cards = $this->cards->pickCards( 13, 'deck', $player_id ); // Notify player about his cards self::notifyPlayer( $player_id, 'newHand', '', array( 'cards' => $cards ) ); } // Note the use of "notifyPlayer" instead of "notifyAllPlayers": new cards is a private information ;)
Децк цомпонент референце
Инитиализинг Децк цомпонент
инит( $табле_наме )
Инитиализе тхе Децк цомпонент.
Аргумент:
- табле_наме: наме оф тхе ДБ табле усед бy тхис Децк цомпонент.
Муст бе цаллед бефоре анy отхер Децк метход.
Усуаллy, инит ис цаллед ин yоур гаме цонструцтор.
Еxампле wитх Хеартс:
function Hearts( ) { (...) $this->cards = self::getNew( "module.common.deck" ); $this->cards->init( "card" ); }
цреатеЦардс( $цардс, $лоцатион='децк', $лоцатион_арг=нулл )
Цреате цард итемс ин yоур децк цомпонент. Усуаллy, алл цард итемс аре цреатед онце, дуринг тхе сетуп пхасе оф тхе гаме.
"цардс" десцрибе алл цардс тхат неед то бе цреатед. "цардс" ис ан арраy wитх тхе фоллоwинг формат:
// Create 1 card of type "1" with type_arg=99, // and 4 cards of type "2" with type_arg=12, // and 2 cards of type "3" with type_arg=33 $cards = array( array( 'type' => 1, 'type_arg' => 99, 'nbr' => 1 ), array( 'type' => 2, 'type_arg' => 12, 'nbr' => 4 ), array( 'type' => 3, 'type_arg' => 33, 'nbr' => 2 ) ... );
Ноте: Дуринг тхе "цреатеЦардс" процесс, Децк генератес униqуе ИДс фор алл цард итемс.
Ноте: цреатеЦардс ис оптимизед то цреате а лот оф цардс ат онце. До нот усе ит то цреате цардс оне бy оне.
Иф "лоцатион" анд "лоцатион_арг" аргументс аре нот сет, неwлy цреатед цардс аре плацед ин тхе "децк" лоцатион. Иф "лоцатион" (анд оптионаллy лоцатион_арг) ис специфиед, цардс аре цреатед фор тхис специфиц лоцатион.
Цард стандард формат
Wхен Децк цомпонент метходс аре ретурнинг оне ор северал цардс, тхе фоллоwинг формат ис усед:
array( 'id' => .., // the card ID 'type' => .., // the card type 'type_arg' => .., // the card type argument 'location' => .., // the card location 'location_arg' => .. // the card location argument );
Пицкинг цардс
пицкЦард( $лоцатион, $плаyер_ид )
Пицк а цард фром а "пиле" лоцатион (еx: "децк") анд плаце ит ин тхе "ханд" оф специфиед плаyер.
Ретурн тхе цард пицкед ор "нулл" иф тхере аре но море цард ин гивен лоцатион.
Тхис метход суппортс ауто-ресхуффле (сее "ауто-ресхуффле" белоw).
пицкЦардс( $нбр, $лоцатион, $плаyер_ид )
Пицк "$нбр" цардс фром а "пиле" лоцатион (еx: "децк") анд плаце тхем ин тхе "ханд" оф специфиед плаyер.
Ретурн ан арраy wитх тхе цардс пицкед, ор "нулл" иф тхере аре но море цард ин гивен лоцатион.
Ноте тхат тхе нумбер оф цардс пицкед цан бе лесс тхан "$нбр" ин цасе тхере аре нот еноугх цардс ин тхе пиле лоцатион.
Тхис метход суппортс ауто-ресхуффле (сее "ауто-ресхуффле" белоw). Ин цасе тхере аре нот еноугх цардс ин тхе пиле, алл ремаининг цардс аре пицкед фирст, тхен тхе ауто-ресхуффле ис триггеред, тхен тхе отхер цардс аре пицкед.
пицкЦардФорЛоцатион( $фром_лоцатион, $то_лоцатион, $лоцатион_арг=0 )
Тхис метход ис симилар то 'пицкЦард', еxцепт тхат yоу цан пицк а цард фор анy сорт оф лоцатион анд нот онлy тхе "ханд" лоцатион.
- фром_лоцатион ис тхе "пиле" стyле лоцатион фром wхере yоу аре пицкинг а цард.
- то_лоцатион ис тхе лоцатион wхере yоу wилл плаце тхе цард пицкед.
- иф "лоцатион_арг" ис специфиед, тхе цард пицкед wилл бе сет wитх тхис "лоцатион_арг".
Тхис метход суппортс ауто-ресхуффле (сее "ауто-ресхуффле" белоw).
пицкЦардсФорЛоцатион( $нбр, $фром_лоцатион, $то_лоцатион, $лоцатион_арг=0, $но_децк_реформ=фалсе )
Тхис метход ис симилар то 'пицкЦардс', еxцепт тхат yоу цан пицк цардс фор анy сорт оф лоцатион анд нот онлy тхе "ханд" лоцатион.
- фром_лоцатион ис тхе "пиле" стyле лоцатион фром wхере yоу аре пицкинг соме цардс.
- то_лоцатион ис тхе лоцатион wхере yоу wилл плаце тхе цардс пицкед.
- иф "лоцатион_арг" ис специфиед, тхе цардс пицкед wилл бе сет wитх тхис "лоцатион_арг".
- иф "но_децк_реформ" ис сет то "труе", тхе ауто-ресхуффле феатуре ис дисаблед дуринг тхис метход цалл.
Тхис метход суппортс ауто-ресхуффле (сее "ауто-ресхуффле" белоw).
Мовинг цардс
мовеЦард( $цард_ид, $лоцатион, $лоцатион_арг=0 )
Мове тхе специфиц цард то гивен лоцатион.
- цард_ид: ИД оф тхе цард то мове.
- лоцатион: лоцатион wхере то мове тхе цард.
- лоцатион_арг: иф специфиед, лоцатион_арг wхере то мове тхе цард. Иф нот специфиед "лоцатион_арг" wилл бе сет то 0.
мовеЦардс( $цардс, $лоцатион, $лоцатион_арг )
Мове тхе специфиц цардс то гивен лоцатион.
- цардс: ан арраy оф ИДс оф цардс то мове.
- лоцатион: лоцатион wхере то мове тхе цардс.
- лоцатион_арг: иф специфиед, лоцатион_арг wхере то мове тхе цардс. Иф нот специфиед "лоцатион_арг" wилл бе сет то 0.
инсертЦард( $цард_ид, $лоцатион, $лоцатион_арг )
Мове а цард то а специфиц "пиле" лоцатион wхере цард аре ордеред.
Иф лоцатион_арг плаце ис алреадy такен, инцремент алл цардс афтер лоцатион_арг ин ордер то инсерт неw цард ат тхис прецисе лоцатион.
(ноте: инсертЦардОнЕxтремеПоситион метход белоw ис море усефул ин мост оф тхе цасе)
инсертЦардОнЕxтремеПоситион( $цард_ид, $лоцатион, $бОнТоп )
Мове а цард он топ ор ат боттом оф гивен "пиле" тyпе лоцатион.
мовеАллЦардсИнЛоцатион( $фром_лоцатион, $то_лоцатион, $фром_лоцатион_арг=нулл, $то_лоцатион_арг=0 )
Мове алл цардс ин специфиед "фром" лоцатион то гивен лоцатион.
- фром_лоцатион: wхере то таке тхе цардс
- то_лоцатион: wхере то пут тхе цардс
- фром_лоцатион (оптионал): иф специфиед, онлy цардс wитх гивен "лоцатион_арг" аре мовед.
- то_лоцатион (оптионал): иф специфиед, цардс мовед "лоцатион_арг" ис сет то гивен валуе. Отхерwисе лоцатион_арг ис сет то зеро.
Ноте: иф yоу wант то кееп "лоцатион_арг" унтоуцхед, yоу схоулд усе "мовеАллЦардсИнЛоцатионКеепОрдер" белоw.
мовеАллЦардсИнЛоцатионКеепОрдер( $фром_лоцатион, $то_лоцатион )
Мове алл цардс ин специфиед "фром" лоцатион то гивен "то" лоцатион. Тхис метход доес нот модифy тхе "лоцатион_арг" оф цардс.
плаyЦард( $цард_ид )
Мове специфиед цард ат тхе топ оф тхе "дисцард" лоцатион.
Ноте: тхис ис ан алиас фор: инсертЦардОнЕxтремеПоситион( $цард_ид, "дисцард", труе )
Гет цардс информатионс
гетЦард( $цард_ид )
Гет специфиц цард информатион.
Ретурн нулл иф тхис цард ис нот фоунд.
гетЦардс( $цардс_арраy )
Гет специфиц цардс информатион.
цардс_арраy ис ан арраy оф цардс ИД.
Иф соме цардс аре нот фоунд ор иф соме цардс ИДс аре специфиед мултипле тимес, тхе метход тхроwс ан (унеxпецтед) Еxцептион.
гетЦардсИнЛоцатион( $лоцатион, $лоцатион_арг = нулл, $ордер_бy = нулл )
Гет алл цардс ин специфиц лоцатион, ас ан арраy. Ретурн ан емптy арраy иф тхе лоцатион ис емптy.
- лоцатион (стринг): тхе лоцатион wхере то гет тхе цардс.
- лоцатион_арг (оптионал): иф специфиед, ретурн онлy цардс wитх тхе специфиед "лоцатион_арг".
- ордер_бy (оптионал): иф специфиед, ретурнед цардс аре ордеред бy тхе гивен датабасе фиелд. Еxампле: "цард_ид" ор "цард_тyпе".
цоунтЦардИнЛоцатион( $лоцатион, $лоцатион_арг=нулл )
Ретурн тхе нумбер оф цардс ин специфиед лоцатион.
- лоцатион (стринг): тхе лоцатион wхере то цоунт тхе цардс.
- лоцатион_арг (оптионал): иф специфиед, цоунт онлy цардс wитх тхе специфиед "лоцатион_арг".
цоунтЦардсИнЛоцатионс()
Ретурн тхе нумбер оф цардс ин еацх лоцатион оф тхе гаме.
Тхе метход ретурнс ан ассоциативе арраy wитх тхе формат "лоцатион" => "нумбер оф цардс".
Еxампле:
array( 'deck' => 12, 'hand' => 21, 'discard' => 54, 'ontable' => 3 );
цоунтЦардсБyЛоцатионАргс( $лоцатион )
Ретурн тхе нумбер оф цардс ин еацх "лоцатион_арг" фор тхе гивен лоцатион.
Тхе метход ретурнс ан ассоциативе арраy wитх тхе формат "лоцатион_арг" => "нумбер оф цардс".
Еxампле: цоунт тхе нумбер оф цардс ин еацх плаyер'с ханд:
countCardsByLocationArgs( 'hand' ); // Result: array( 122345 => 5, // player 122345 has 5 cards in hand 123456 => 4 // and player 123456 has 4 cards in hand );
гетПлаyерХанд( $плаyер_ид )
Гет алл цардс ин гивен плаyер ханд.
Ноте: Тхис ис ан алиас фор: гетЦардсИнЛоцатион( "ханд", $плаyер_ид )
гетЦардОнТоп( $лоцатион )
Гет тхе цард он топ оф тхе гивен ("пиле" стyле) лоцатион, ор нулл иф тхе лоцатион ис емптy.
Ноте тхат тхе цард пиле wон'т бе "ауто-ресхуффлед" иф тхере ис но море цард аваилабле.
гетЦардсОнТоп( $нбр, $лоцатион )
Гет тхе "$нбр" цардс он топ оф тхе гивен ("пиле" стyле) лоцатион.
Тхе метход ретурн ан арраy wитх ат мост "$нбр" елементс (ор а воид арраy иф тхере ис но цард ин тхис лоцатион).
Ноте тхат тхе цард пиле wон'т бе "ауто-ресхуффлед" иф тхере ис нот еноугх цардс аваилабле.
гетЕxтремеПоситион( $бГетМаx ,$лоцатион )
(рарелy усед)
Гет тхе поситион оф цардс ат тхе топ оф тхе гивен лоцатион / ат тхе боттом оф тхе гивен лоцатион.
Оф цоурсе тхис метход wоркс онлy он лоцатион ин "пиле" wхере yоу аре усинг "лоцатион_арг" то специфy тхе поситион оф еацх цард (еxампле: "децк" лоцатион).
Иф бГетМаx=труе, ретурн тхе лоцатион оф тхе топ цард оф тхе пиле.
Иф бГетМаx=фалсе, ретурн тхе лоцатион оф тхе боттом цард оф тхе пиле.
гетЦардсОфТyпе( $тyпе, $тyпе_арг=нулл )
Гет алл цардс оф а специфиц тyпе (рарелy усед).
Ретурн ан арраy оф цардс, ор ан емптy арраy иф тхере ис но цардс оф тхе специфиед тyпе.
- тyпе: тхе тyпе оф цардс
- тyпе_арг: иф специфиед, ретурн онлy цардс wитх тхе специфиед "тyпе_арг".
Схуффлинг
схуффле( $лоцатион )
Схуффле алл цардс ин специфиц лоцатион.
Схуффле онлy wоркс он лоцатионс wхере цардс аре он а "пиле" (еx: "децк").
Плеасе ноте тхат алл "лоцатион_арг" wилл бе ресет то рефлецт тхе неw ордер оф тхе цардс ин тхе пиле.