How to resolve the algorithm Playing cards step by step in the PHP programming language
How to resolve the algorithm Playing cards step by step in the PHP programming language
Table of Contents
Problem Statement
Create a data structure and the associated methods to define and manipulate a deck of playing cards. The deck should contain 52 unique cards. The methods must include the ability to: Each card must have a pip value and a suit value which constitute the unique value of the card. Related tasks:
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Playing cards step by step in the PHP programming language
The code you provided is an implementation of a deck of cards in PHP. It includes classes for Card
, CardCollection
, Deck
, and Hand
. The specific details of the implementation are as follows:
- The
Card
class represents a single card, with a suit and a pip (value). - The
CardCollection
class is an abstract class that provides a common interface for collections of cards, including methods for getting the number of cards in the collection, iterating over the cards, and sorting the cards. - The
Deck
class is a concrete subclass ofCardCollection
that represents a deck of cards. It provides methods for shuffling the deck, dealing cards from the deck, and sorting the deck. - The
Hand
class is a concrete subclass ofCardCollection
that represents a player's hand of cards. It provides methods for playing cards from the hand.
The code also includes a bit of sample usage, where a deck of cards is created, shuffled, dealt to four players, and then the players' hands are sorted and displayed.
Here is a breakdown of the key methods in each class:
Card
__construct
: Creates a new card with the specified suit and pip.getSuit
: Gets the suit of the card.getPip
: Gets the pip (value) of the card.getSuitOrder
: Gets the order of the card's suit.getPipOrder
: Gets the order of the card's pip.getOrder
: Gets the overall order of the card, which is a combination of the suit order and pip order.compareSuit
: Compares the suit of this card to the suit of another card.comparePip
: Compares the pip of this card to the pip of another card.compare
: Compares this card to another card, based on their overall order.__toString
: Returns a string representation of the card, showing the suit and pip.
CardCollection
__construct
: Creates a new card collection, optionally with an array of cards.count
: Returns the number of cards in the collection.key
: Returns the key of the current card in the collection.valid
: Returns whether the current card in the collection is valid.next
: Moves to the next card in the collection.current
: Returns the current card in the collection.rewind
: Resets the collection to the first card.sort
: Sorts the cards in the collection using the specified comparer.toString
: Returns a string representation of the collection, showing all the cards.
Deck
__construct
: Creates a new deck of cards, optionally shuffled.deal
: Deals the specified number of cards from the deck to the specified card collection.shuffle
: Shuffles the cards in the deck.
Hand
__construct
: Creates a new hand of cards.play
: Plays the card at the specified position in the hand.
Overall, the code provides a flexible and extensible way to represent and manipulate decks and hands of cards in PHP. It uses a number of object-oriented design principles, including inheritance, polymorphism, and encapsulation, to provide a clean and easy-to-use interface.
Source code in the php programming language
class Card
{
// if unable to save as UTF-8, use other, non-UTF-8, symbols here
protected static $suits = array( '♠', '♥', '♦', '♣' );
protected static $pips = array( '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' );
protected $suit;
protected $suitOrder;
protected $pip;
protected $pipOrder;
protected $order;
public function __construct( $suit, $pip )
{
if( !in_array( $suit, self::$suits ) )
{
throw new InvalidArgumentException( 'Invalid suit' );
}
if( !in_array( $pip, self::$pips ) )
{
throw new InvalidArgumentException( 'Invalid pip' );
}
$this->suit = $suit;
$this->pip = $pip;
}
public function getSuit()
{
return $this->suit;
}
public function getPip()
{
return $this->pip;
}
public function getSuitOrder()
{
// lazy evaluate suit order
if( !isset( $this->suitOrder ) )
{
// cache suit order
$this->suitOrder = array_search( $this->suit, self::$suits );
}
return $this->suitOrder;
}
public function getPipOrder()
{
// lazy evaluate pip order
if( !isset( $this->pipOrder ) )
{
// cache pip order
$this->pipOrder = array_search( $this->pip, self::$pips );
}
return $this->pipOrder;
}
public function getOrder()
{
// lazy evaluate order
if( !isset( $this->order ) )
{
$suitOrder = $this->getSuitOrder();
$pipOrder = $this->getPipOrder();
// cache order
$this->order = $pipOrder * count( self::$suits ) + $suitOrder;
}
return $this->order;
}
public function compareSuit( Card $other )
{
return $this->getSuitOrder() - $other->getSuitOrder();
}
public function comparePip( Card $other )
{
return $this->getPipOrder() - $other->getPipOrder();
}
public function compare( Card $other )
{
return $this->getOrder() - $other->getOrder();
}
public function __toString()
{
return $this->suit . $this->pip;
}
public static function getSuits()
{
return self::$suits;
}
public static function getPips()
{
return self::$pips;
}
}
class CardCollection
implements Countable, Iterator
{
protected $cards = array();
protected function __construct( array $cards = array() )
{
foreach( $cards as $card )
{
$this->addCard( $card );
}
}
/**
* Countable::count() implementation
*/
public function count()
{
return count( $this->cards );
}
/**
* Iterator::key() implementation
*/
public function key()
{
return key( $this->cards );
}
/**
* Iterator::valid() implementation
*/
public function valid()
{
return null !== $this->key();
}
/**
* Iterator::next() implementation
*/
public function next()
{
next( $this->cards );
}
/**
* Iterator::current() implementation
*/
public function current()
{
return current( $this->cards );
}
/**
* Iterator::rewind() implementation
*/
public function rewind()
{
reset( $this->cards );
}
public function sort( $comparer = null )
{
$comparer = $comparer ?: function( $a, $b ) {
return $a->compare( $b );
};
if( !is_callable( $comparer ) )
{
throw new InvalidArgumentException( 'Invalid comparer; comparer should be callable' );
}
usort( $this->cards, $comparer );
return $this;
}
public function toString()
{
return implode( ' ', $this->cards );
}
public function __toString()
{
return $this->toString();
}
protected function addCard( Card $card )
{
if( in_array( $card, $this->cards ) )
{
throw new DomainException( 'Card is already present in this collection' );
}
$this->cards[] = $card;
}
}
class Deck
extends CardCollection
{
public function __construct( $shuffled = false )
{
foreach( Card::getSuits() as $suit )
{
foreach( Card::getPips() as $pip )
{
$this->addCard( new Card( $suit, $pip ) );
}
}
if( $shuffled )
{
$this->shuffle();
}
}
public function deal( $amount = 1, CardCollection $cardCollection = null )
{
if( !is_int( $amount ) || $amount < 1 )
{
throw new InvalidArgumentException( 'Invalid amount; amount should be an integer, larger than 0' );
}
if( $amount > count( $this->cards ) )
{
throw new RangeException( 'Invalid amount; requested amount is larger than the amount of available cards' );
}
$cards = array_splice( $this->cards, 0, $amount );
$cardCollection = $cardCollection ?: new CardCollection;
foreach( $cards as $card )
{
$cardCollection->addCard( $card );
}
return $cardCollection;
}
public function shuffle()
{
shuffle( $this->cards );
}
}
class Hand
extends CardCollection
{
// override CardCollection __constructor
// to allow public instantiation
// but disallow instantiation with cards
public function __construct() {}
public function play( $position )
{
if( !isset( $this->cards[ $position ] ) )
{
throw new OutOfBoundsException( 'Invalid position; position is not present in this hand' );
}
$result = array_splice( $this->cards, $position, 1 );
return $result[ 0 ];
}
}
// if viewing in a browser, lets output a text/plain header with utf-8 charset
header( 'Content-Type: text/plain; charset=utf-8' );
// create a new Deck
$deck = new Deck();
// show the cards in the new deck
echo count( $deck ) . ' cards in the new deck: ' . PHP_EOL . $deck . PHP_EOL;
// sort the deck, default sort
$deck->sort();
// show the cards in the sorted deck
echo PHP_EOL . count( $deck ) . ' cards in the new deck, default sort: ' . PHP_EOL . $deck . PHP_EOL;
// sort the deck, custom sort
$deck->sort( function( $a, $b ) {
return $a->compareSuit( $b ) ?: $a->comparePip( $b );
} );
// show the cards in the sorted deck
echo PHP_EOL . count( $deck ) . ' cards in the new deck, custom sort: ' . PHP_EOL . $deck . PHP_EOL;
// shuffle the deck
$deck->shuffle();
// show the cards in the shuffled deck
echo PHP_EOL . count( $deck ) . ' cards in the new deck, shuffled: ' . PHP_EOL . $deck . PHP_EOL . PHP_EOL;
// intialize four player hands
$players = array(
new Hand,
new Hand,
new Hand,
new Hand
);
// three deal rounds, with amounts: 2, 2, 3
foreach( array( 2, 2, 3 ) as $amount )
{
// deal this rounds amount to player
foreach( $players as $hand )
{
$deck->deal( $amount, $hand );
}
}
foreach( $players as $p => $hand )
{
// sort player cards, default sort
$hand->sort();
// show player cards
echo 'Player ' . ( $p + 1 ) . ' got dealt the following ' . count( $hand ) . ' cards (sorted): ' . $hand . PHP_EOL;
}
// show the remaining cards in the deck
echo PHP_EOL . count( $deck ) . ' cards remaining in the deck: ' . PHP_EOL . $deck . PHP_EOL;
You may also check:How to resolve the algorithm Sort disjoint sublist step by step in the JavaScript programming language
You may also check:How to resolve the algorithm Euler's sum of powers conjecture step by step in the Ruby programming language
You may also check:How to resolve the algorithm Perfect numbers step by step in the Dart programming language
You may also check:How to resolve the algorithm Poker hand analyser step by step in the Go programming language
You may also check:How to resolve the algorithm Variable size/Set step by step in the BASIC programming language