Player 2 | #1 (1hp) | #2 (1hp) | #3 (1hp) | #4 (8hp) | #5 (1hp) | #6 (1hp) | #7 (1hp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
1 attack (8 outcomes)
| 2 attack (30 outcomes)
| 3 attack (72 outcomes)
|
// turn an array of healths into a decodable-string // note: we need strings since php arrays are shit function encode($a) { return implode(':', $a); } // turn an encoded-string into an array of healths function decode($s) { return array_map('intval', explode(':', $s)); } // given a hash of states: encoded(healths) -> probability // return the probability of each possible resulting state // after applying one random attack to all remaining units function bomb($states) { $u = array(); foreach ($states as $enc => $prior) { $x = decode($enc); $a = array(); for ($i = 0; $i < count($x); $i++) { // collect indices of living units if ($x[$i] > 0) { $a[] = $i; } } foreach ($a as $i) { // apply an attack to each unit $v = $x; // copy the healths $v[$i]--; // reduce hp by one $k = encode($v); $c = array_key_exists($k, $u) ? $u[$k] : 0; $u[$k] = $c + $prior / count($a); // update probabilities } } return $u; }
// initial board state $healths = array(2, 2); // initial board distribution // (100% chance we have 2x 2-hp units) $s0 = array(encode(healths) => 1);[2:2] => 1.00000// apply one random attack $s1 = bomb($s0);[1:2] => 0.50000 [2:1] => 0.50000// apply another $s2 = bomb($s1);[0:2] => 0.25000 [1:1] => 0.50000 [2:0] => 0.25000