En esta página se muestran una parte de las soluciones de los ejercicios if .. elseif ... else ... (1), concretamente el fragmento PHP, sin el principio ni el final de la página que se pueden dejar en fragmentos HTML.
Si lo prefiere, puede descargar unas posibles soluciones completas de estos ejercicios.
<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);
print " <p>\n";
print " <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">\n";
print " </p>\n";
print "\n";
if ($dado1 == $dado2) {
print " <p>Ha sacado una pareja de $dado1.</p>\n";
print "\n";
} else {
print " <p>No ha sacado pareja. La suma obtenida es " . $dado1 + $dado2 . ".</p>\n";
print "\n";
}
?>
Este programa se podría escribir también separando los cálculos de la presentación.
<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);
if ($dado1 == $dado2) {
$resultado = " <p>Ha sacado una pareja de $dado1.</p>\n";
} else {
$resultado = " <p>No ha sacado pareja. La suma obtenida es " . $dado1 + $dado2 . ".</p>\n";
}
print " <p>\n";
print " <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">\n";
print " </p>\n";
print "\n";
print $resultado;
print "\n";
?>
<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
if ($dado1 > $dado2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($dado1 < $dado2) {
print " <td>Ha ganado el jugador 2</td>\n";
} else {
print " <td>Han empatado</td>\n";
}
?>
Probablemente, la forma de resolver este ejercicio que primero viene a la cabeza es la siguiente, en la que se plantean tres situaciones y se entra en el detalle de cada una de ellas:
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
// Si ambos jugadores sacan pareja ...
if ($j1d1 == $j1d2 && $j2d1 == $j2d2) {
// Si el primer jugador saca la pareja más alta
if ($j1d1 > $j2d1) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca la pareja más alta
} elseif ($j1d1 < $j2d1) {
print " <td>Ha ganado el jugador 2</td>\n";
// Por descarte, ambos sacan la misma pareja
} else {
print " <td>Han empatado</td>\n";
}
// Si solo un jugador saca pareja ...
} elseif ($j1d1 == $j1d2 && $j2d1 != $j2d2 || $j1d1 != $j1d2 && $j2d1 == $j2d2) {
// Si el primer jugador saca pareja
if ($j1d1 == $j1d2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Por descarte, el segundo jugador saca pareja
} else {
print " <td>Ha ganado el jugador 2</td>\n";
}
// Por descarte, nadie saca pareja
} else {
// Si el primer jugador saca más puntos que el segundo
if ($j1d1 + $j1d2 > $j2d1 + $j2d2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca más puntos que el primero
} elseif ($j1d1 + $j1d2 < $j2d1 + $j2d2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Por descarte, ambos sacan los mismos puntos
} else {
print " <td>Han empatado</td>\n";
}
}
?>
Escribiendo los casos en el mismo orden, pero sin agrupar y escribiendo las condiciones completas tendríamos el siguiente programa:
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
// Si ambos jugadores sacan pareja y el primer jugador saca la pareja más alta
if ($j1d1 == $j1d2 && $j2d1 == $j2d2 && $j1d1 > $j2d1) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si ambos jugadores sacan pareja y el segundo jugador saca la pareja más alta
} elseif ($j1d1 == $j1d2 && $j2d1 == $j2d2 && $j1d1 < $j2d1) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si ambos jugadores sacan parejas iguales
} elseif ($j1d1 == $j1d2 && $j2d1 == $j2d2 && $j1d1 == $j2d1) {
print " <td>Han empatado</td>\n";
// Si el primer jugador saca pareja y el segundo no
} elseif ($j1d1 == $j1d2 && $j2d1 != $j2d2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca pareja y el primero no
} elseif ($j1d1 != $j1d2 && $j2d1 == $j2d2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si ningún jugador saca pareja y el primer jugador saca más puntos
} elseif ($j1d1 != $j1d2 && $j2d1 != $j2d2 && $j1d1 + $j1d2 > $j2d1 + $j2d2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si ningún jugador saca pareja y el segundo jugador saca más puntos
} elseif ($j1d1 != $j1d2 && $j2d1 != $j2d2 && $j1d1 + $j1d2 < $j2d1 + $j2d2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si ningún jugador saca pareja y ambos sacan los mismo puntos
} elseif ($j1d1 != $j1d2 && $j2d1 != $j2d2 && $j1d1 + $j1d2 == $j2d1 + $j2d2) {
print " <td>Han empatado</td>\n";
}
?>
En este programa podríamos reordenar los casos y el programa seguiría siendo correcto.
Manteniendo los casos en el mismo orden, podríamos simplificar las condiciones teniendo en cuenta que algunas comparaciones son innecesarias debido a los casos anteriores
Por ejemplo
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
// Si ambos jugadores sacan pareja y el primer jugador saca la pareja más alta
if ($j1d1 == $j1d2 && $j2d1 == $j2d2 && $j1d1 > $j2d1) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si ambos jugadores sacan pareja y el segundo jugador saca la pareja más alta
} elseif ($j1d1 == $j1d2 && $j2d1 == $j2d2 && $j1d1 < $j2d1) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si ambos jugadores sacan pareja (por descarte, las parejas son iguales)
} elseif ($j1d1 == $j1d2 && $j2d1 == $j2d2) {
print " <td>Han empatado</td>\n";
// Si el primer jugador saca pareja (por descarte, el segundo jugador no)
} elseif ($j1d1 == $j1d2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca pareja (por descarte, el primer jugador no)
} elseif ($j2d1 == $j2d2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si el primer jugador saca más puntos (por descarte, ningún jugador saca pareja)
} elseif ($j1d1 + $j1d2 > $j2d1 + $j2d2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca más puntos (por descarte, ningún jugador saca pareja)
} elseif ($j1d1 + $j1d2 < $j2d1 + $j2d2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Por descarte, ambos jugadores sacan los mismos puntos y ningún jugador saca pareja
} else {
print " <td>Han empatado</td>\n";
}
?>
En este programa
Otra forma de enfocar el ejercicio que será más útil cuando en posteriores ejercicios aumente el número de dados consiste en calcular unas variables intermedias que guarden la información sobre la pareja de dados obtenida por cada jugador.
Estas variables auxiliares reducen el número de casos necesarios porque al comparar las variables $pareja estamos incluyendo tanto el caso en que una pareja es mayor que la otra como el caso en que un jugador tiene pareja y el otro no. Y los casos en que ambos jugadores han sacado pareja se pueden resovler junto con los casos en que nadie ha sacado pareja, porque en ambos casos gana el que tenga más puntos en total.
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
// $pareja indica el número de la pareja obtenida (0 si no ha sacado pareja) por el jugador
if ($j1d1 == $j1d2) {
$pareja1 = $j1d1;
} else {
$pareja1 = 0;
}
if ($j2d1 == $j2d2) {
$pareja2 = $j2d1;
} else {
$pareja2 = 0;
}
// $total indica el total de puntos obtenidos por el jugador
$total1 = $j1d1 + $j1d2;
$total2 = $j2d1 + $j2d2;
// Si el primer jugador saca una pareja de mayor valor que el segundo
// o si el primer jugador saca pareja y el segundo no
if ($pareja1 > $pareja2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca una pareja de mayor valor que el primero
// o si el primer jugador saca pareja y el segundo no
} elseif ($pareja1 < $pareja2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Por descarte, ambos jugadores sacan pareja del mismo valor
// o ningún jugador saca pareja
} else {
// Si el primer jugador saca más puntos que el segundo
if ($total1 > $total2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca más puntos que el primero
} elseif ($total1 < $total2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si ambos jugadores sacan los mismos puntos
} else {
print " <td>Han empatado</td>\n";
}
}
?>
El programa se podría simplificar utilizando la notación abreviada ... ? ... : ... y eliminado el anidamiento en el bloque if ... elseif ... else ...:
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " </td>\n";
$pareja1 = $j1d1 == $j1d2 ? $j1d1 : 0;
$pareja2 = $j2d1 == $j2d2 ? $j2d1 : 0;
$total1 = $j1d1 + $j1d2;
$total2 = $j2d1 + $j2d2;
// Si el primer jugador saca una pareja de mayor valor que el segundo
// o si el primer jugador saca pareja y el segundo no
if ($pareja1 > $pareja2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca una pareja de mayor valor que el primero
// o si el primer jugador saca pareja y el segundo no
} elseif ($pareja1 < $pareja2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Si el primer jugador saca más puntos que el segundo (por descarte, ambos sacan pareja o no)
} elseif ($total1 > $total2) {
print " <td>Ha ganado el jugador 1</td>\n";
// Si el segundo jugador saca más puntos que el primero (por descarte, ambos sacan pareja o no)
} elseif ($total1 < $total2) {
print " <td>Ha ganado el jugador 2</td>\n";
// Por descarte, ambos jugadores sacan los mismos puntos, sacando pareja o no
} else {
print " <td>Han empatado</td>\n";
}
?>
<?php
$dado1 = rand(1, 6);
$dado2 = rand(1, 6);
$dado3 = rand(1, 6);
print " <p>\n";
print " <img src=\"img/$dado1.svg\" alt=\"$dado1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$dado2.svg\" alt=\"$dado2\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$dado3.svg\" alt=\"$dado3\" width=\"140\" height=\"140\">\n";
print " </p>\n";
print "\n";
if ($dado1 == $dado2 && $dado1 == $dado3) {
print " <p>Ha sacado un trío de $dado1.</p>\n";
print "\n";
} elseif ($dado1 == $dado2 || $dado1 == $dado3) {
print " <p>Ha sacado una pareja de $dado1.</p>\n";
print "\n";
} elseif ($dado2 == $dado3) {
print " <p>Ha sacado una pareja de $dado2.</p>\n";
print "\n";
} else {
print " <p>La suma obtenida es " . $dado1 + $dado2 + $dado3 . ".</p>\n";
print "\n";
}
?>
La solución propuesta calcula unas variables intermedias que guardan la información sobre el trío o la pareja de dados obtenida por cada jugador. La variable que guarda el trío valdrá 0 si el jugador no ha sacado trío y valdrá el valor del trío si sí que ha sacado trío. La variable que guarda la pareja valdrá 0 si el jugador no ha sacado pareja y valdrá el valor de la pareja si sí que ha sacado pareja.
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j1d3 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
$j2d3 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d3.svg\" alt=\"$j1d3\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d3.svg\" alt=\"$j2d3\" width=\"140\" height=\"140\">\n";
print " </td>\n";
if ($j1d1 == $j1d2 && $j1d1 == $j1d3) {
$trio1 = $j1d1;
} else {
$trio1 = 0;
}
if ($j2d1 == $j2d2 && $j2d1 == $j2d3) {
$trio2 = $j2d1;
} else {
$trio2 = 0;
}
if ($j1d1 == $j1d2 || $j1d1 == $j1d3) {
$pareja1 = $j1d1;
} elseif ($j1d2 == $j1d3) {
$pareja1 = $j1d2;
} else {
$pareja1 = 0;
}
if ($j2d1 == $j2d2 || $j2d1 == $j2d3) {
$pareja2 = $j2d1;
} elseif ($j2d2 == $j2d3) {
$pareja2 = $j2d2;
} else {
$pareja2 = 0;
}
$total1 = $j1d1 + $j1d2 + $j1d3;
$total2 = $j2d1 + $j2d2 + $j2d3;
if ($trio1 > $trio2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($trio1 < $trio2) {
print " <td>Ha ganado el jugador 2</td>\n";
} else {
if ($pareja1 > $pareja2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($pareja1 < $pareja2) {
print " <td>Ha ganado el jugador 2</td>\n";
} else {
if ($total1 > $total2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($total1 < $total2) {
print " <td>Ha ganado el jugador 2</td>\n";
} else {
print " <td>Han empatado</td>\n";
}
}
}
?>
Como en el ejercicio 3, el programa se podría simplificar utilizando la notación abreviada ... ? ... : ... (que en el caso de la pareja se podría anidar) y eliminado el anidamiento en el bloque if ... elseif ... else ...:
<?php
$j1d1 = rand(1, 6);
$j1d2 = rand(1, 6);
$j1d3 = rand(1, 6);
$j2d1 = rand(1, 6);
$j2d2 = rand(1, 6);
$j2d3 = rand(1, 6);
print " <td style=\"padding: 10px; background-color: red;\">\n";
print " <img src=\"img/$j1d1.svg\" alt=\"$j1d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d2.svg\" alt=\"$j1d2\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j1d3.svg\" alt=\"$j1d3\" width=\"140\" height=\"140\">\n";
print " </td>\n";
print " <td style=\"padding: 10px; background-color: blue;\">\n";
print " <img src=\"img/$j2d1.svg\" alt=\"$j2d1\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d2.svg\" alt=\"$j2d2\" width=\"140\" height=\"140\">\n";
print " <img src=\"img/$j2d3.svg\" alt=\"$j2d3\" width=\"140\" height=\"140\">\n";
print " </td>\n";
$trio1 = $j1d1 == $j1d2 && $j1d1 == $j1d3 ? $j1d1 : 0;
$trio2 = $j2d1 == $j2d2 && $j2d1 == $j2d3 ? $j2d1 : 0;
$pareja1 = $j1d1 == $j1d2 || $j1d1 == $j1d3 ? $j1d1 : ($j1d2 == $j1d3 ? $j1d2 : 0);
$pareja2 = $j2d1 == $j2d2 || $j2d1 == $j2d3 ? $j2d1 : ($j2d2 == $j2d3 ? $j2d2 : 0);
$total1 = $j1d1 + $j1d2 + $j1d3;
$total2 = $j2d1 + $j2d2 + $j2d3;
if ($trio1 > $trio2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($trio1 < $trio2) {
print " <td>Ha ganado el jugador 2</td>\n";
} elseif ($pareja1 > $pareja2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($pareja1 < $pareja2) {
print " <td>Ha ganado el jugador 2</td>\n";
} elseif ($total1 > $total2) {
print " <td>Ha ganado el jugador 1</td>\n";
} elseif ($total1 < $total2) {
print " <td>Ha ganado el jugador 2</td>\n";
} else {
print " <td>Han empatado</td>\n";
}
?>