首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >php a和b玩家接连的棋子

php a和b玩家接连的棋子
EN

Stack Overflow用户
提问于 2018-06-09 22:57:28
回答 1查看 162关注 0票数 0

我必须找到一个php代码来解决一个数学问题。

以下是问题描述:

玩家A和B正在玩一种新的石头游戏。有N的石头放置在地面上,形成了一个序列。这些石头被标记为从1到N的。玩家A和B轮流在地面上取两块连续的石头,直到地面上没有连续的石头。也就是说,每个玩家可以拿石头i和石头i+1,其中1≤i≤N−1。如果剩余的石块数为奇数,则A获胜。否则,B获胜。假设A和B都打得最好,A先打,你知道谁是赢家吗?

这条线有N个,索引从1到N --> N (1≤N≤10 000 000)

如果剩余的石块数为奇数,则A获胜。否则,B获胜。

这是我的代码。它确实起作用了,但它并不正确。

代码语言:javascript
复制
        <?php
$nStones =  rand(1, 10000000);
$string = ("i");
$start = rand(1, 10000000);
$length = 2;
while($nStones > 0) {
    substr( $nStones , $start [,  $length ]): string;
}
if ($nStones % 2 == 1) {
    echo "A";
} else {
echo "B";
}
?>

我想我错过了A和B交替减去两个连续的石头,而$nStones > 0。此外,问题描述提到了最优减法,直到只剩下一块石头。因此,我猜测这些石块一起移动到它们最近的石块上(缝隙消失,并被最近的石块取代)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 00:22:19

我在这里做了一个开始:

代码语言:javascript
复制
<?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());

输出:

代码语言:javascript
复制
O.O.O.O.O.O
bool(false)
O.O.O.O._._
bool(false)
O._._.O._._
bool(true)

目前,这个类从创建一行开始,该行是一个'O‘字符的字符串。

因此,如果长度为5,则行将是这样的字符串:

代码语言:javascript
复制
OOOOO

remove方法接受一个索引。如果索引是1,那么首先在字符串0索引( n-1)处检查两个连续的O。换句话说,“在给定的位置有要移除的石头吗?”如果有石块,我们在该位置进行字符串替换,并将两个O替换为两个_s。

is_finished方法检查行中第一次出现两个O的情况。换句话说,如果有两个连续的棋子,那么仍然有一步棋要走。

魔术方法__toString是GameOfStones对象的字符串表示形式。这是一种可视化游戏状态的方法。

代码语言:javascript
复制
O.O.O.O._._

上面显示了四块石头和两个空格(我不确定点分隔符是否必要-下划线可能会互相渗入,这就是我使用它们的原因)。

我已经添加了代码的示例使用,其中从一行六个石块中删除(两个)对石块。在每次删除之后,我们检查是否有另一个可能的移动,或者更确切地说,游戏是否已经结束。

目前还没有球员归属,这留给你了。

你的最后一条规则:

‘如果剩下的石头数是奇数,A赢,否则B赢。’

我正在苦苦挣扎。请参阅以下示例:

代码语言:javascript
复制
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比赛。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50775556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档