elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  piedra, papel o tijera. Hay alguna forma más eficiente????
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: piedra, papel o tijera. Hay alguna forma más eficiente????  (Leído 3,792 veces)
manuchi

Desconectado Desconectado

Mensajes: 8


Ver Perfil
piedra, papel o tijera. Hay alguna forma más eficiente????
« 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>


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: piedra, papel o tijera. Hay alguna forma más eficiente????
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: piedra, papel o tijera. Hay alguna forma más eficiente????
« Respuesta #2 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??
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: piedra, papel o tijera. Hay alguna forma más eficiente????
« Respuesta #3 en: 8 Octubre 2019, 04:30 am »

mucho mejor, ayuda a hacerlo mas legible
En línea

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
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: piedra, papel o tijera. Hay alguna forma más eficiente????
« Respuesta #4 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. );


Saludos
« Última modificación: 8 Octubre 2019, 04:54 am por #!drvy » En línea

manuchi

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: piedra, papel o tijera. Hay alguna forma más eficiente????
« Respuesta #5 en: 8 Octubre 2019, 05:59 am »

gracias!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
piedra papel tijera....en c++
Programación C/C++
flony 6 14,499 Último mensaje 9 Agosto 2010, 05:24 am
por Beakman
[SRC] Piedra Papel Tijera [Pro version (?) xD]
Programación Visual Basic
Psyke1 0 1,671 Último mensaje 6 Noviembre 2010, 17:30 pm
por Psyke1
Descubren la forma científica de ganar en piedra-papel-tijera
Dudas Generales
wolfbcn 0 2,677 Último mensaje 4 Mayo 2014, 01:42 am
por wolfbcn
un piedra papel tijera, adaptado
Programación General
Lenckito 2 2,951 Último mensaje 4 Mayo 2017, 18:59 pm
por RevolucionVegana
Juego Piedra-Papel-Tijera
Java
keypanda 1 2,489 Último mensaje 3 Octubre 2018, 01:52 am
por rub'n
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines