Skip to content

Instantly share code, notes, and snippets.

@drealecs
Created December 11, 2016 13:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drealecs/fefa023f3dc02ed0827518170cf72e5f to your computer and use it in GitHub Desktop.
Save drealecs/fefa023f3dc02ed0827518170cf72e5f to your computer and use it in GitHub Desktop.
hearthstone global level
<?php declare(strict_types = 1);
$game = new GameState(5000);
for ($i = 0; $i < 100; $i++) {
$game->step(100);
}
$game->resetDeathLevels();
for ($i = 0; $i < 1000; $i++) {
$game->step(100);
}
$deathLevels = $game->getDeathLevels();
echo "<h3>Stats:</h3>\n";
foreach ($deathLevels as $level => $deaths) {
echo "Level " . str_pad((string)$level, 2, '0', STR_PAD_LEFT) . ": " . str_pad(number_format($deaths / 1000, 2), 5, '0', STR_PAD_LEFT) . "%<br/>\n";
}
echo "<br/><br/><h4>Merry Christmas!</h4><br/>\n";
class GameState
{
private $playersState = [];
private $deathLevels = [];
public function __construct(int $startNumber)
{
$this->playersState[0] = [];
$this->playersState[0][0] = $startNumber;
}
public function step(int $newNumber)
{
if (!isset($this->playersState[0][0])) {
$this->playersState[0][0] = 0;
}
$this->playersState[0][0] += $newNumber;
$this->playersState = $this->playStep($this->playersState);
$this->playersState = $this->cleanUp($this->playersState);
}
private function playStep($playersState)
{
$newPlayersState = [];
foreach ($playersState as $playLevel => $playersDeathState) {
foreach ($playersDeathState as $deaths => $players) {
if (!isset($newPlayersState[$playLevel])) {
$newPlayersState[$playLevel] = [];
}
if (!isset($newPlayersState[$playLevel][$deaths + 1])) {
$newPlayersState[$playLevel][$deaths + 1] = 0;
}
$newPlayersState[$playLevel][$deaths + 1] += $players / 2;
if (!isset($newPlayersState[$playLevel + 1])) {
$newPlayersState[$playLevel + 1] = [];
}
if (!isset($newPlayersState[$playLevel + 1][$deaths])) {
$newPlayersState[$playLevel + 1][$deaths] = 0;
}
$newPlayersState[$playLevel + 1][$deaths] += $players / 2;
}
}
return $newPlayersState;
}
private function cleanUp($playersState)
{
$newPlayersState = [];
foreach ($playersState as $playLevel => $playersDeathState) {
if ($playLevel >= 12) {
if (!isset($this->deathLevels[$playLevel])) {
$this->deathLevels[$playLevel] = 0;
}
$this->deathLevels[$playLevel] += array_sum($playersDeathState);
$newPlayersState[$playLevel] = [];
} else {
foreach ($playersDeathState as $deaths => $players) {
if ($deaths >= 3) {
if (!isset($this->deathLevels[$playLevel])) {
$this->deathLevels[$playLevel] = 0;
}
$this->deathLevels[$playLevel] += $players;
$newPlayersState[$playLevel][$deaths] = 0;
} else {
$newPlayersState[$playLevel][$deaths] = $players;
}
}
}
}
return $newPlayersState;
}
public function resetDeathLevels()
{
$this->deathLevels = [];
}
public function getDeathLevels()
{
return $this->deathLevels;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment