Я начал здесь:
<?php
class GameOfStones
{
const STONE_PAIR = 'OO';
const GAP_PAIR = '__';
public $line;
public function __construct($length)
{
$this->line = str_pad('', $length, self::STONE_PAIR);
}
// Removes a pair of stones from the line at nth location.
public function remove($n)
{
if(substr($this->line, $n-1, 2) == self::STONE_PAIR)
$this->line =
substr_replace($this->line, self::GAP_PAIR , $n-1, 2);
else
throw new Exception('Invalid move.');
}
// Check if there are no further possible moves.
public function is_finished()
{
return strpos($this->line, self::STONE_PAIR) === false;
}
// Representation of line.
public function __toString()
{
return implode('.', str_split($this->line)) ."\n";
}
};
$game = new GameOfStones(6);
echo $game;
var_dump($game->is_finished());
$game->remove(5);
echo $game;
var_dump($game->is_finished());
$game->remove(2);
echo $game;
var_dump($game->is_finished());
Вывод:
O.O.O.O.O.O
bool(false)
O.O.O.O._._
bool(false)
O._._.O._._
bool(true)
В настоящее время этот класс начинается с создания строки, состоящей из символов «O».
Таким образом, если длина равна 5, строка будет выглядеть следующим образом:
OOOOO
Метод удаления принимает индекс.Если этот индекс был 1, сначала строка проверяется по индексу 0 строки (ваш n-1) для двух последовательных O.Другими словами «есть ли камни для удаления в данной позиции?».Если есть камни, мы выполняем замену строки в этой позиции и меняем два Os на два _s.
Метод is_finished проверяет строку на предмет первого вхождения двух Os.Другими словами, если есть два последовательных камня, на линии все еще есть ход для игры.
Магический метод __toString - строковое представление объекта GameOfStones.Это используется как способ визуализации состояния игры.
O.O.O.O._._
Выше показаны четыре камня и два пробела (я не уверен, что разделители точек необходимы - подчеркивания могут сливаться друг с другомвот почему я их использовал).
Я добавил пример использования кода, в котором (две) пары камней удаляются из линии из шести камней.После каждого удаления мы проверяем, есть ли еще один возможный ход, или, скорее, игра закончилась.
В настоящее время нет атрибуции игрока, которая оставлена вам.
Ваше последнее правило:
'Если число оставшихся камней нечетное, A побеждает.В противном случае выигрывает B. '
Я борюсь с.Посмотрите эти примеры:
i) Line of length 3:
OOO
O__ A (1)
End: one (odd) stone left.
ii) Line of length 4:
OOOO
OO__ A (3)
____ B (1)
End: zero (even) stones left.
ii) Line of length 7:
OOOOOOO
O__OOOO A(1)
O__O__O B(5)
End: three (odd) stones left.
Я бы сказал, что человек, который удаляет пару, чтобы следующий игрок не смог пойти, является победителем.В игре ii) выше, если A играл в позиции 1 (O__O
), тогда они не давали бы играть B.