Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: manuchi en 8 Octubre 2019, 03:55 am



Título: piedra, papel o tijera. Hay alguna forma más eficiente????
Publicado por: manuchi en 8 Octubre 2019, 03:55 am
Código
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Untitled Document</title>
  6. </head>
  7.  
  8. <body>
  9. <?php
  10. if (isset($_POST["forma"]) and isset($_POST["forma2"])){
  11. $forma=$_POST["forma"]; //jugador 1
  12. $forma2=$_POST["forma2"]; //jugador 2
  13.  
  14. if ($forma==$forma2){
  15. echo "empate";
  16. }else{
  17. if($forma=="ti"){
  18. //echo "es tijera";
  19. if ($forma2=="pa"){
  20. echo "gano jugador 1";
  21. }else{
  22. echo "gano jugador 2";
  23. }
  24. }else{
  25. if ($forma=="pa"){
  26. //echo "es papel";
  27. if ($forma2=="pi"){
  28. echo "gano el jugador 1";
  29. }else{
  30. echo "gano el jugador 2";
  31. }
  32. }else{
  33. if ($forma=="pi"){
  34. //echo "es piedra";
  35. if ($forma2=="ti"){
  36. echo "gano el jugador 1";
  37. }else{
  38. echo "gano el jugador 2";
  39. }
  40. }
  41. }
  42. }
  43.  
  44. }
  45. }
  46.  
  47. ?>
  48. </body>
  49. </html>


Título: Re: piedra, papel o tijera. Hay alguna forma más eficiente????
Publicado por: engel lex en 8 Octubre 2019, 04:18 am
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
  1. <?php
  2. function jugar($p1, $p2){
  3.  if($p1==$2){  // si son iguales
  4.    return "empate";
  5.  }
  6.  if($p1-$p2 == 1){ // si p1 es mayor que p2 por 1
  7.    return "gano jugador 1";
  8.  }
  9.  if($p2-$p1 == 1){ // si p2 es mayor que p1 por 1
  10.    return "gano jugador 2";
  11.  }
  12.  // en este punto ya cubrimos igual y todas las victorias excepto tijera vs piedra, así que quien tenga piedra ganó
  13.  if($p1==0){
  14.    return "gano jugador 1";
  15.  }else{
  16.    return "gano jugador 2";
  17.  }
  18. }
  19.  
  20.  
  21.  
  22. if (isset($_POST["forma"]) and isset($_POST["forma2"])){
  23. $forma1=$_POST["forma"]; //jugador 1
  24. $forma2=$_POST["forma2"]; //jugador 2
  25. echo jugar($forma1, $forma2);
  26. }
  27.  
  28.  
  29.  
  30.  
  31. ?>
  32.  

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


Título: Re: piedra, papel o tijera. Hay alguna forma más eficiente????
Publicado por: manuchi en 8 Octubre 2019, 04:20 am
Código
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Untitled Document</title>
  6. </head>
  7.  
  8. <body>
  9. <?php
  10. if (isset($_POST["forma"]) and isset($_POST["forma2"])){
  11. $forma=$_POST["forma"];
  12. $forma2=$_POST["forma2"];
  13. if (($forma=="pi" and $forma2=="ti") or ($forma=="ti" and $forma2=="pa")or ($forma=="pa" and $forma2=="pi")){
  14. echo "gano el jugador 1";
  15. }else{
  16. if ($forma==$forma2){
  17. echo "hay empate";
  18. }else{
  19. echo "gano el jugador 2";
  20. }
  21. }
  22. }
  23. ?>
  24. </body>
  25. </html>
ahi creo que lo mejore un poco, que opinas??


Título: Re: piedra, papel o tijera. Hay alguna forma más eficiente????
Publicado por: engel lex en 8 Octubre 2019, 04:30 am
mucho mejor, ayuda a hacerlo mas legible


Título: Re: piedra, papel o tijera. Hay alguna forma más eficiente????
Publicado por: #!drvy en 8 Octubre 2019, 04:51 am
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
  1. function play_prs($player1, $player2, $rules)
  2. {
  3.    if ($player1 === $player2) {
  4.        return 0;
  5.    }
  6.  
  7.    // Compruebo si el jugador 1 tiene una acción valida y si su acción
  8.    // "mata" a la de su oponente
  9.    if (isset($rules[$player1]) && in_array($player2, $rules[$player1])) {
  10.        return 1;
  11.    }
  12.  
  13.    return 2;
  14. }
  15.  
  16. $rules = array(
  17.    'pa' => ['pi'],
  18.    'pi' => ['ti'],
  19.    'ti' => ['pa']
  20. );
  21.  
  22. $resultado = play_prs($forma, $forma2, $rules);
  23. 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
  1. $rules = array(
  2.    'pa' => ['pi', 'sp'],
  3.    'pi' => ['ti', 'la'],
  4.    'ti' => ['pa', 'la'],
  5.    'la' => ['sp', 'pa'],
  6.    'sp' => ['ti', 'pi'],
  7. );

(https://pbs.twimg.com/media/DAcEI5ZW0AAftPY.jpg)

Saludos


Título: Re: piedra, papel o tijera. Hay alguna forma más eficiente????
Publicado por: manuchi en 8 Octubre 2019, 05:59 am
gracias!!