This is a documentation for Board Game Arena: play board games online !

Децк

Извор: Board Game Arena
Пређи на навигацију Пређи на претрагу

"Децк" ис оне оф тхе мост усефул цомпонент он тхе ПХП сиде. Wитх "Децк", yоу цан манаге тхе цардс ин yоур гаме он тхе сервер сиде.

Усинг "децк", yоу wилл бе абле то усе тхе фоллоwинг феатурес wитхоут wритинг а сингле СQЛ датабасе реqуест:

  • Плаце цардс ин а пиле, схуффле цардс, драw цардс оне бy оне ор манy ат а тиме.
  • "Ауто-ресхуффле" тхе дисцард пиле инто тхе децк wхен тхе децк ис емптy.
  • Мове цардс бетwеен дифферент лоцатионс: хандс оф плаyерс, тхе табле, етц.


Усинг Децк: Хеартс еxампле

Тхе Децк цомпонент ис еxтенсивелy усед ин тхе сампле Хеартс цард гаме. Yоу wилл финд ин "хеартс.гаме.пхп" тхат тхе објецт "$тхис->цардс" ис усед ман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оу лике то маке суре yоу wилл бе абле то идентифy тхе дифферент цардс ин тхе гаме. Сее усаге оф "тyпе" анд "тyпе_арг" белоw.

Еxамплес оф усаге оф "тyпе" анд "тyпе_арг":

  • Ин Хеартс, "тyпе" репресентс тхе цолор (суите) оф тхе цард (1 то 4) анд "тyпе_арг" ис тхе валуе оф тхе цард (1, 2, ... 10, Ј, Q, К).
  • Ин Сеасонс, "тyпе" репресентс тхе тyпе оф тхе цард (е.г., 1 ис Амулет оф Аир, 2 ис Амулет оф Фире, етц...). тyпе_арг ис нот усед.
  • Ин Такеноко, а Децк цомпонент ис усед фор објецтиве цардс. "тyпе" ис тхе кинд оф објецтиве (ирригатион/панда/плот) анд "тyпе_арг" ис тхе ИД оф тхе специфиц објецтиве то реализе (е.г., "греен бамбоо x4"). Ноте тхат а сецонд Децк цомпонент ис усед ин Такеноко то манаге тхе "гарден плот" пиле.

лоцатион анд лоцатион_арг дефине wхере а цард ис ат ноw. лоцатион ис а схорт стринг, анд лоцатион_арг ис ан интегер.

Yоу цан усе 'лоцатион' анд 'лоцатион_арг' ас yоу лике, то мове yоур цард wитхин тхе гаме ареа.

Тхере аре 3 специал 'лоцатион' валуес тхат Децк манагес аутоматицаллy. Yоу цан цхоосе то усе тхесе лоцатионс ор нот, депендинг он yоур неедс:

  • 'децк': тхе 'децк' лоцатион ис а стандард драw децк. Цардс аре плацед фаце доwн ин а стацк анд аре драwн ин сеqуентиал ордер дуринг тхе гаме. 'лоцатион_арг' ис усед то специфy wхере тхе цард ис лоцатед wитхин тхе стацк (тхе цард wитх тхе хигхест лоцатион_арг валуе ис тхе неxт то бе драwн).
  • 'ханд': тхе 'ханд' лоцатион репресентс цардс ин а плаyер'с ханд. 'лоцатион_арг' ис сет то тхе ИД оф еацх плаyер.
  • 'дисцард': тхе 'дисцард' лоцатион ис усед фор дисцард пилес. Цард ин 'дисцард' маy бе ресхуффлед инто тхе децк иф неедед (сее "ауторесхуффле").


Типс: усинг тхе Децк цомпонент, yоу wилл усе генериц пропертиес ("лоцатион", "тyпе_арг",...) фор специфиц пурпосес ин yоур гаме. Тхус, дуринг тхе десигн степ бефоре реализинг yоур гаме, таке а феw минутес то wрите доwн тхе еxацт меанинг оф еацх оф тхесе генериц пропертиес ин тхе цонтеxт оф yоур гаме.

Цреате а неw Децк цомпонент

Фор еацх Децк цомпонент ин yоур гаме, yоу неед то цреате а дедицатед табле ин тхе СQЛ датабасе. Тхис табле хас а стандард формат. Ин працтице, иф 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 wхат ис листед абове. Yоу цан инцреасе тхе сизе оф тхе фиелдс ор адд море фиелдс. Фор аддитионал фиелдс yоу јуст хаве то до мануал qуериес.

Онце yоу хаве доне тхис (анд рестартед yоур гаме), yоу цан децларе тхе Децк цомпонент ин yоур ПХП цоде ин yоур цласс цонструцтор. Фор Хеартс фор еxампле, I аддед то тхе "Хеартс()" метход:

        $this->cards = self::getNew( "module.common.deck" );
        $this->cards->init( "card" );

Ноте тхат wе специфy "цард" хере: тхе наме оф оур превиоуслy цреатед табле. Тхис меанс yоу цан цреате северал "Децк" цомпонентс wитх мултипле таблес. Мост оф тхе тиме тхис ис нот усефул; а Децк цомпонент схоулд манаге алл објецтс оф тхе саме кинд (и.е., алл цардс ин тхе гаме).

Афтерwардс, wе цан инитиализе yоур "Децк" бy цреатинг алл тхе цардс оф тхе гаме. Генераллy, тхис ис доне онлy онце дуринг тхе гаме, ин тхе "сетупНеwГаме" метход.

Тхе "Децк" цомпонент провидес а фаст 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 ордер оф тхе цардс ин тхе пиле.

Преузето из „http:///index.php?title=Deck&oldid=3169