<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<body>
<?php
if (isset($_POST["forma"]) and isset($_POST["forma2"])){
$forma=$_POST["forma"]; //jugador 1
$forma2=$_POST["forma2"]; //jugador 2
if ($forma==$forma2){
echo "empate";
}else{
if($forma=="ti"){
//echo "es tijera";
if ($forma2=="pa"){
echo "gano jugador 1";
}else{
echo "gano jugador 2";
}
}else{
if ($forma=="pa"){
//echo "es papel";
if ($forma2=="pi"){
echo "gano el jugador 1";
}else{
echo "gano el jugador 2";
}
}else{
if ($forma=="pi"){
//echo "es piedra";
if ($forma2=="ti"){
echo "gano el jugador 1";
}else{
echo "gano el jugador 2";
}
}
}
}
}
}
?>
</body>
</html>
recomendaría en pro de la salud mental y legibilidad no usar tantos anidados... yo haría
primero usaría valores numericos, ej.
piedra = 0
papel = 1
tijera = 2
<?php
function jugar($p1, $p2){
if($p1==$2){ // si son iguales
return "empate";
}
if($p1-$p2 == 1){ // si p1 es mayor que p2 por 1
return "gano jugador 1";
}
if($p2-$p1 == 1){ // si p2 es mayor que p1 por 1
return "gano jugador 2";
}
// en este punto ya cubrimos igual y todas las victorias excepto tijera vs piedra, así que quien tenga piedra ganó
if($p1==0){
return "gano jugador 1";
}else{
return "gano jugador 2";
}
}
if (isset($_POST["forma"]) and isset($_POST["forma2"])){
$forma1=$_POST["forma"]; //jugador 1
$forma2=$_POST["forma2"]; //jugador 2
echo jugar($forma1, $forma2);
}
?>
ojo tal vez mi forma de programar no sea la mas legible y un poco abstracta, pero es porque considero que muchos problemas se resuelven con matemáticas
si quieres una forma menos abstracta y mas legible, en lugar de anidar, usa el return como yo lo uso para salir de la funcion
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<body>
<?php
if (isset($_POST["forma"]) and isset($_POST["forma2"])){
$forma=$_POST["forma"];
$forma2=$_POST["forma2"];
if (($forma=="pi" and $forma2=="ti") or ($forma=="ti" and $forma2=="pa")or ($forma=="pa" and $forma2=="pi")){
echo "gano el jugador 1";
}else{
if ($forma==$forma2){
echo "hay empate";
}else{
echo "gano el jugador 2";
}
}
}
?>
</body>
</html>
ahi creo que lo mejore un poco, que opinas??
mucho mejor, ayuda a hacerlo mas legible
Yo creo que en programación ha de haber un equilibro entre código legible y eficiente. En el primer caso que expones, creo que utilizas un
else { demás entre cada comprobación. En el segundo, si, es algo mejor, pero la legibilidad se reduce drásticamente según se añaden comprobaciones dado que tienes muchos casos en un solo if.
Consejos:
- Utiliza
|| en vez de
OR.
https://stackoverflow.com/questions/5998309/logical-operators-or-or
https://stackoverflow.com/questions/2803321/and-vs-as-operator
- Compara siempre strings con
=== o con (
strcmp)en vez de
==.
https://stackoverflow.com/questions/80646/how-do-the-php-equality-double-equals-and-identity-triple-equals-comp
Dicho esto, yo lo que haría son reglas.
function play_prs($player1, $player2, $rules)
{
if ($player1 === $player2) {
return 0;
}
// Compruebo si el jugador 1 tiene una acción valida y si su acción
// "mata" a la de su oponente
if (isset($rules[$player1]) && in_array($player2, $rules[$player1])) {
return 1;
}
return 2;
}
$rules = array(
'pa' => ['pi'],
'pi' => ['ti'],
'ti' => ['pa']
);
$resultado = play_prs($forma, $forma2, $rules);
echo ($resultado === 0 ? 'Empate' : 'Gana el jugador '.$resultado);
Básicamente las reglas son: quien => mata a que. De esta forma, podríamos incluso añadir lagarto y spock sin mayor dificultad.
$rules = array(
'pa' => ['pi', 'sp'],
'pi' => ['ti', 'la'],
'ti' => ['pa', 'la'],
'la' => ['sp', 'pa'],
'sp' => ['ti', 'pi'],
);
(https://pbs.twimg.com/media/DAcEI5ZW0AAftPY.jpg)
Saludos
gracias!!