在PHP的岩石纸剪刀蜥蜴Spock

时间:2014-11-26 20:07:15

标签: php if-statement conditional

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

1)当玩家2击败玩家1时,下面的代码似乎没有达到其他条件,我无法确定原因?

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";
}

?>

3 个答案:

答案 0 :(得分:3)

您可以在二维数组中编码逻辑:

<?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";
}

显然,改善是无止境的:

  • 您可以在2d阵列上用闭包(带有play方法的类或工厂函数中的嵌套函数)替换该函数,这样您就不会在每次调用时实例化它< / LI>
  • 你可以使用常数而不是变量来表示摇滚,纸张等的值。
  • 测试输入是否在有效值集合内,依此类推。

    <?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);
        }
    }
    

答案 1 :(得分:1)

正如Marc B在评论中所说,有更好的方法可以解决这个问题,但对于你的情况,玩家2永远不会赢的原因是因为你把它作为基于$player1的其他条件等于。如果$player2在数组中,则应该根据其他内容。

如果有限制,你可以剥离内部,你有:

if ($player1 == $player2) {
    echo "Tie.";
    echo "\n";
} elseif ($player1 == 1) {

} elseif ($player1 == 2) {

} elseif ($player1 == 3) {

} elseif ($player1 == 4) {

} elseif ($player1 == 5) {

} else {
    echo "Player 2 wins";
}

如果$player2不等于$player1$player1不等于15,则玩家2获胜的唯一可行方式是

因此,如果您将$player1设置为6,则播放器2会“赢”,但这在游戏的上下文中没有意义。

答案 2 :(得分:0)

你说你是php的新手,我猜你对编程比较陌生。考虑到这一点,我将集中讨论一些基本原则。

所以回答你的问题2),这里有一些值得考虑的事情:

  • 为您的代码添加好的评论 - 这将对您有所帮助 记录RPSLS的规则。我不得不为此查找规则 游戏,看起来至少有一个人误入歧途 规则。我发现解决问题的方法经常变得清晰 当我写评论时。

  • 将常量用于不会改变的值 - 即使用 ROCK而不是1,PAPER而不是2等。其他语言都有 为此目的的枚举,但在PHP中你可以使用&#34;定义&#34;至 将每个命名常量与其值相关联。这应该使程序更容易阅读,并且更容易发现任何错误 - 如果您尝试使用未定义的常量,您将收到警告。

  • 如果可能,程序结构应匹配&#34;逻辑&#34;的方法 想着这个问题。例如程序的本质 如下:

    if (player 1 beats player 2) {
        echo "Player 1 wins\n";
    }
    elseif (player 2 beats player 1) {
        echo "Player 2 wins\n";
    }
    else {
        echo "Tie.";
    }
    

将这些放在一起,这是做你想做的事情的另一种方法:

<?php

// As we'll use these as array indices, we'll start at 0 
define ('ROCK', 0); 
define ('PAPER', 1); 
define ('SCISSORS', 2); 
define ('LIZARD', 3); 
define ('SPOCK', 4); 

/* 
    A reasonable place to document the rules ....
*/
$winning_conditions = array();
$winning_conditions[ROCK] = array(SCISSORS, LIZARD);
$winning_conditions[SCISSORS] = array(PAPER, LIZARD);
$winning_conditions[LIZARD] = array(SPOCK, PAPER);
$winning_conditions[SPOCK] = array(SCISSORS, ROCK);
$winning_conditions[PAPER] = array(ROCK, SPOCK);

// Randomize Moves
$player1 = rand(0, 4);
$player2 = rand(0, 4);

if (in_array($player2, $winning_conditions[$player1]) {
    echo "Player 1 wins\n";
}
elseif (in_array($player1, $winning_conditions[$player2]) {
    echo "Player 2 wins\n";
}
else {
    echo "Tie.\n";
}

?>

通过一些附加功能(可能使用php关联数组),应该可以将输出增强到:

Player 2 wins (Lizard poisons Spock)