1

演習中に、while ループと if/else 句を組み合わせたので、代わりに if/else を変換して switch ステートメントを使用することにしました。

プログラムは簡単です: ゲームを停止するには、2 人のプレイヤーが 3 試合連続で勝利する必要があります。プレイヤーの値は 0 から 1 の間でランダムに並べ替えられ、ランダム性がレースに勝つ場合に備えて、ペアの一致には上限があります :)

どちらが最適なソリューションであるか、またその理由を理解したいと思います。なぜなら、スイッチ バージョンにはさらに数行のコードが必要なように思われるからです。

<?php
$playerA=0;
$playerB=0;
$winA=0;
$winB=0;
$pair=0;
    while ($winA<=2 && $winB<=2 && $pair<=15) {
        $playerA = rand(0,1);
        $playerB = rand(0,1);
            if ($playerA > $playerB) {
                    $winA ++;
                    $winB=0;
                    echo "<div>Player A Wins.</div>";
            } elseif ($playerA < $playerB) {
                    $winB ++;
                    $winA=0;
                    echo "<div>Player B Wins.</div>";
            } elseif ($playerA == $playerB) {
                    $pair ++;
                    $winA=0;
                    $winB=0;
                    echo "<div>Pair, play again!</div>";
            }

    }
    echo "<div>There is a total of {$pair} pair matches</div>"; 
?>

そして今、スイッチ1...

<?php
$playerA=0;
$playerB=0;
$winA=0;
$winB=0;
$pair=0;
    while ($winA<=2 && $winB<=2 && $pair<=15) {
        $playerA = rand(0,1);
        $playerB = rand(0,1);
            switch ($playerA && $playerB): 
            //This is an error: it should have been switch(true)
                case ($playerA > $playerB):
                    $winA++;
                    $winB=0;
                    echo "<div>Player A Wins.</div>";
                    break;
                case ($playerA < $playerB):
                    $winB++;
                    $winA=0;
                    echo "<div>Player B Wins.</div>";
                    break;
                case ($playerA == $playerB):
                    $pair++;
                    $winA=0;
                    $winB=0;
                    echo "<div>Pair, Play again!</div>";
                    break;
            endswitch;

    }
    echo "<div>There is a total of {$pair} pair matches</div>";
?>
4

5 に答える 5

0

switch/case は if/else コンストラクトで常に再現可能であることを考えると、それが輝いているときに使用する必要があります。スイッチ部分に固定値または式の結果があり、その値がどの「ケース」を表しているかを確認すると、より明確になります。

例えば

$year_born = 2000;
switch ($age = get_current_year() - 2000){
   case $age < 18:
      // do something
      break;
   case $age >= 18 && $age <=20:
      // do something
      break;
   case $age > 20:
      // do something
      break;
}

if で書き直すことができますが、ここでは、年齢の可能な値に関連する何かを常に行うことは明らかです。if/else でこれと同じパターンは期待できません。

ただし、別の方法でそれらを使用することを誰も止めませんが、これは良いコーディングスタイルだと思います

于 2013-10-11T12:14:19.057 に答える
0

多くの場合、可読性とスケーラビリティの問題のためにスイッチを使用する必要があります。基本的に、スイッチでできることはすべて、else if ブロックでもできることです。

しかし、あなたの例では、switch 2 変数 (player A と player B) でテストしているため、switch ステートメントはコードの可読性を向上させません。私の選択は、else if ブロックです。

また、次のように、同じ変数を別の値と数回比較する場合は、スイッチを使用するとよいことを覚えておくとよいでしょう。

switch ($a) {
    case 0:
        echo "a = 0";
        break;
    case 1:
        echo "a = 1;
        break;
    case 2:
        echo "a = 2";
        break;
}

a が 3 回比較されていることがわかります。

あなたの質問を明確にしたいと思います。

于 2013-10-11T12:01:14.937 に答える