- mt_rand: documentation ( source)
<?php
interface Roulette
{
public function move();
}
interface Checkable
{
public function check();
}
interface Rotatable
{
public function rotate();
}
abstract class CircleLoad implements Rotatable, Checkable
{
protected $charges = null;
public function __construct()
{
$this->setCharges();
}
abstract protected function setCharges();
}
class SixChargedRevolver extends CircleLoad
{
CONST CHARGES = 6;
protected $loaded = null;
protected $current = null;
public function __construct()
{
$this->loaded = mt_rand(1, self::CHARGES);
$this->current = 1;
}
public function check()
{
return $this->current==$this->loaded;
}
public function rotate()
{
$rotations = mt_rand(1, 2*self::CHARGES);
$this->current = 1 + $rotations%self::CHARGES;
}
protected function setCharges()
{
$this->charges = self::CHARGES;
}
}
abstract class RouletteGame implements Roulette
{
protected $playable = null;
public function setPlayable(CircleLoad $playable)
{
$this->playable = $playable;
}
}
class RussianRoulette extends RouletteGame
{
public function move()
{
$this->playable->rotate();
if($this->playable->check())
{
die('Boom..');
}
echo 'Click!';
}
}
class RussianRouletteFactory
{
public function create()
{
$playable = new SixChargedRevolver();
$roulette = new RussianRoulette();
$roulette->setPlayable($playable);
return $roulette;
}
}
$owner = new RussianRouletteFactory;
$roulette = $owner->create();
$roulette->move();
$roulette->move();
$roulette->move();
$roulette->move();