因此,我是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";
}
?>
答案 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";
}
显然,改善是无止境的:
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
不等于1
到5
,则玩家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)