piedra, papel o tijera. Hay alguna forma más eficiente????

Iniciado por manuchi, 8 Octubre 2019, 03:55 AM

0 Miembros y 1 Visitante están viendo este tema.

manuchi

Código (php) [Seleccionar]
<!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>

engel lex

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

Código (php) [Seleccionar]

<?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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

manuchi

Código (php) [Seleccionar]
<!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??

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

#!drvy

#4
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.

Código (php) [Seleccionar]
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.

Código (php) [Seleccionar]
$rules = array(
   'pa' => ['pi', 'sp'],
   'pi' => ['ti', 'la'],
   'ti' => ['pa', 'la'],
   'la' => ['sp', 'pa'],
   'sp' => ['ti', 'pi'],
);



Saludos