gpt4 book ai didi

php - 石头剪刀布蜥蜴 Spock 在 PHP 中

转载 作者:可可西里 更新时间:2023-11-01 01:00:55 24 4
gpt4 key购买 nike

所以我是 PHP 的新手,正在构建一个 RPSLS 实现,只是为了在命令行中执行。我有一个半工作实现,但有两个问题。

1) 当玩家 2 击败玩家 1 时,下面的代码似乎没有达到 else 条件,我不知道为什么?

2) 这是一组令人难以置信的重复条件。什么是更有效的实现?我真的很想了解如何让它变得更好。

谢谢

<?php

// Assign moves to integers (1 = Rock, 2 = Paper, 3 = Scissors, 4 = Lizard, 5 = Spock)
echo 'Welcome to Rock, Paper Scissors, Lizard, Spock';
echo "\n";

// Randomize Moves
$player1 = rand(1, 5);
$player2 = rand(1, 5);

// Declare wins
$rock_wins = array(3, 4);
$paper_wins = array(1, 5);
$scissors_wins = array(2, 4);
$lizard_wins = array(5, 2);
$spock_wins = array(3, 1);

// Conditional logic for wins
if ($player1 == $player2) {
echo "Tie.";
echo "\n";
} elseif ($player1 == 1) {
if (in_array($player2, $rock_wins)) {
echo "Player 1 wins";
echo "\n";
}
} elseif ($player1 == 2) {
if (in_array($player2, $paper_wins)) {
echo "Player 1 wins";
echo "\n";
}
} elseif ($player1 == 3) {
if (in_array($player2, $scissors_wins)) {
echo "Player 1 wins";
echo "\n";
}
}
elseif ($player1 == 4) {
if (in_array($player2, $lizard_wins)) {
echo "Player 1 wins";
echo "\n";
}
}
elseif ($player1 == 5) {
if (in_array($player2, $spock_wins)) {
echo "Player 1 wins";
echo "\n";
}
} else {
echo "Player 2 wins";
}

?>

最佳答案

您可以将逻辑编码为二维数组:

<?php
$play = function ($player1, $player2) {
$rock = 1;
$paper = 2;
$scissors = 3;
$lizard = 4;
$spock = 5;
$matches = array(
$rock => array($scissor, $lizard),
$paper => array($rock, $spock),
$scissors => array($paper, $lizard),
$lizard => array($spock, $paper),
$spock => array($scissor, $rock),
);

return in_array($player2, $matches[$player1]);
};

// Assign moves to integers (1 = Rock, 2 = Paper, 3 = Scissors, 4 = Lizard, 5 = Spock)
echo 'Welcome to Rock, Paper Scissors, Lizard, Spock';
echo "\n";

// Randomize Moves
$player1 = rand(1, 5);
$player2 = rand(1, 5);

if ($player1 == $player2) {
echo "Draw!\n";
} else if (Game::play($player1, $player2)) {
echo "Player 1 wins\n";
} else {
echo "Player 2 wins\n";
}

显然,改进是无止境的:

  • 您可以用二维数组上的闭包(带有 play 方法的类或工厂函数内的嵌套函数)替换该函数,这样您就不会在每次调用时实例化它
  • 对于石头、纸等的值,您可以使用常量而不是变量。
  • 应该测试输入是否在有效值集中,等等。

    <?php
    class Game {
    const ROCK = 1;
    const PAPER = 2;
    const SCISSORS = 3;
    const LIZARD = 4;
    const SPOCK = 5;
    const MATCHES = array(
    self::ROCK => array(self::SCISSOR, self::LIZARD),
    self::PAPER => array(self::ROCK, self::SPOCK),
    self::SCISSORS => array(self::PAPER, self::LIZARD),
    self::LIZARD => array(self::SPOCK, self::PAPER),
    self::SPOCK => array(self::SCISSOR, self::ROCK),
    );

    public static function play($player1, $player2) {
    if (!self::isValid($player1) || !self::isValid($player2)) {
    throw new Exception('Invalid input!');
    }
    return in_array($player2, self::matches[$player1]);
    }

    public static function isValid($num) {
    return array_key_exists(self::MATCHES, $num);
    }
    }

关于php - 石头剪刀布蜥蜴 Spock 在 PHP 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com