Ejercicios Sesiones - Minijuegos (1) - Soluciones

En esta página se muestran una parte de las soluciones de los ejercicios Sesiones Minijuegos (1).

Si lo prefiere, puede descargar unas posibles soluciones completas de estos ejercicios.

¡Atención!Una vez completada la aplicación hay que comprobar desde el principio (cerrando el navegador previamente) que la aplicación funciona correctamente (es decir, que la aplicación tiene en cuenta que la primera vez que se ejecuta, todavía no hay datos).

Es importante recordar que el usuario sólo va a ver la página 1 del programa, ya que la página 2 va a redirigir siempre automáticamente a la página 1. Por ello, la página 2 no debe tener ningún fragmento de HTML, ni ningún print.

Minijuegos (1) 1 - Nueva carta

  1. Para que las dos páginas del programa puedan utilizar el número de carta, guardaremos ese valor en $_SESSION. Ese valor se muestra en la página 1 y se modifica en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlo o modificarlo provocaría un error, por lo que damos valor a la variable si no existe.
  3. La página 1 muestra la carta guardada en $_SESSION (el número guardado corresponde al nombre del fichero de la imagen de la carta).
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si la variable de sesión no está definida, redirigiremos a la página 1 donde se le dará un valor inicial.
  6. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 el único control es un botón con atributo name, por lo que sólo hay que recoger ese dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. En general, la página 2 modifica los valores guardados en la sesión, dependiendo de la petición recibida. En este caso, cuando recibimos el valor "nueva", cambiamos el valor de la carta al azar.
  8. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-1-1.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-1");
session_start();

// Si el valor de sesión no existe, ponemos el valor de la carta a uno 2
if (!isset($_SESSION["carta"])) {
    $_SESSION["carta"] = 1;
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-1-2.php">
<?php
// Mostramos la carta, guardada en la sesión 3
print "    <p><img src=\"img/cartas/c$_SESSION[carta].svg\" alt=\"$_SESSION[carta] de corazones\" height=\"150\"></p>\n";
print "\n";
?>
    <p><button type="submit" name="accion" value="nueva">Nueva carta</button></p>
  </form>
...

minijuegos-1-1-2.php

<?php
// Accedemos a la sesión 4
session_name("minijuegos-1-1");
session_start();

// Si el valor de sesión no existe, redirigimos a la primera página 5
if (!isset($_SESSION["carta"])) {
    header("Location:minijuegos-1-1-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Si recibimos "nueva", modificamos el número de carta 7
if ($accion == "nueva") {
    $_SESSION["carta"] = rand(1, 10);
}

// Volvemos al formulario 8
header("Location:minijuegos-1-1-1.php");

Minijuegos (1) 2 - La carta más alta (1)

Este ejercicio añade al anterior la capacidad de llevar la cuenta de la carta más alta mostrada hasta el momento, así como la posibilidad de reiniciar el proceso.

  1. Para que las dos páginas del programa puedan utilizar el número de carta y el valor máximo obtenido, guardaremos esos valores en $_SESSION. Esos valores se muestran en la página 1 y se modifican en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlos o modificarlos provocaría un error, por lo que damos valor a ambas variables si no existen.
  3. La página 1 muestra la carta y el valor máximo, ambos valores guardados en $_SESSION.
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si las variables de sesión no están definidas, redirigiremos a la página 1 donde se les dará un valor inicial.
  6. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 2 botones que tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. Si recibimos el valor "reiniciar", damos a las variables de sesión los valores iniciales (1 en las dos).
  8. Si recibimos el valor "nueva", cambiamos el valor de la carta ...
  9. ... y comprobamos si la nueva carta es superior al máximo anterior, en cuyo caso lo actualizamos al nuevo valor.
  10. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-2-1.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-2");
session_start();

// Si los valores de sesión no existen, ponemos los dos valores de sesión a uno 2
if (!isset($_SESSION["carta"])) {
    $_SESSION["carta"] = $_SESSION["maximo"] = 1;
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-2-2.php">
<?php
// Mostramos la carta, guardada en la sesión 3
print "    <p><img src=\"img/cartas/p$_SESSION[carta].svg\" alt=\"$_SESSION[carta] de picas\" height=\"150\"></p>\n";
print "\n";
// Mostramos el máximo, guardado en la sesión
print "    <p>Carta más alta obtenida: $_SESSION[maximo]</p>\n";
print "\n";
?>
...

minijuegos-1-2-2.php

<?php// Accedemos a la sesión 4
session_name("minijuegos-1-2");
session_start();

// Si los valores de sesión no existen, redirigimos a la primera página 5
if (!isset($_SESSION["carta"])) {
    header("Location:minijuegos-1-2-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

$accion = recoge("accion");

// Si recibimos "reiniciar", reiniciamos los valores de sesión 7
if ($accion == "reiniciar") {
    $_SESSION["maximo"] = $_SESSION["carta"] = 1;
    // Si recibimos "nueva", modificamos el número de carta ... 8
} elseif ($accion == "nueva") {
    $_SESSION["carta"] = rand(1, 10);
    //  ... y comprobamos si se ha superado el máximo anterior 9
    //  para cambiar el máximo por la nueva carta
    if ($_SESSION["carta"] > $_SESSION["maximo"]) {
        $_SESSION["maximo"] = $_SESSION["carta"];
    }
}

// Volvemos al formulario 10
header("Location:minijuegos-1-2-1.php");

Minijuegos (1) 3 - La carta más alta (2)

Este ejercicio añade al anterior la capacidad de llevar la cuenta del número de cartas mostradas desde que se inicia o reinicia el proceso.

  1. Para que las dos páginas del programa puedan utilizar el número de carta, el valor máximo obtenido y el número de cartas mostradas hasta conseguir el máximo, guardaremos esos valores en $_SESSION. Esos valores se muestran en la página 1 y se modifican en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlos o modificarlos provocaría un error, por lo que damos valor a las tres variables si no existen.
  3. La página 1 muestra la carta, el valor máximo y el contador de cartas, valores guardados en $_SESSION.
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si las variables de sesión no están definidas, redirigiremos a la página 1 donde se les dará un valor inicial.
  6. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 2 botones que tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. Si recibimos el valor "reiniciar", damos a las variables de sesión los valores iniciales (1 en las dos).
  8. Si recibimos el valor "nueva", cambiamos el valor de la carta ...
  9. ... comprobamos si todavía no hemos sacado un 10 (que es la carta más alta posible), en cuyo caso aumentamos el contador de cartas mostradas. Es importante realizar esta comprobación antes de comprobar si la carta es superior al máximo, porque si no no contaríamos el turno en que obtenemos un 10.
  10. ... y comprobamos si la nueva carta es superior al máximo anterior, en cuyo caso lo actualizamos al nuevo valor.
  11. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-3-1.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-3");
session_start();

// Si los valores de sesión no existen, ponemos los valores iniciales 2
if (!isset($_SESSION["carta"])) {
    $_SESSION["maximo"] = $_SESSION["carta"] = 1;
    $_SESSION["intentos"] = 0;
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-3-2.php">
<?php
// Mostramos la carta, guardada en la sesión 3
print "    <p><img src=\"img/cartas/d$_SESSION[carta].svg\" alt=\"$_SESSION[carta] de diamantes\" height=\"150\"></p>\n";
print "\n";
// Mostramos el máximo, guardado en la sesión
print "    <p>Carta más alta obtenida: $_SESSION[maximo]</p>\n";
print "\n";
// Mostramos el número de intentos, guardado en la sesión
print "    <p>Intentos hasta conseguir un 10: $_SESSION[intentos]</p>\n";
print "\n";
?>
...

minijuegos-1-3-2.php

<?php// Accedemos a la sesión 4
session_name("minijuegos-1-3");
session_start();

// Si los valores de sesión no existen, redirigimos a la primera página 5
if (!isset($_SESSION["carta"])) {
    header("Location:minijuegos-1-3-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

$accion = recoge("accion");

// Si recibimos "reiniciar", reiniciamos los valores de sesión 7
if ($accion == "reiniciar") {
    $_SESSION["maximo"]   = $_SESSION["carta"] = 1;
    $_SESSION["intentos"] = 0;
// Si recibimos "nueva", modificamos el número de carta, ... 8
} elseif ($accion == "nueva") {
    $_SESSION["carta"] = rand(1, 10);
    //  ... comprobamos si no hemos obtenido todavía un 10 9
    //  para incrementar el contador
    if ($_SESSION["maximo"] < 10) {
        $_SESSION["intentos"]++;
    }
    //  ... comprobamos si se ha superado el máximo anterior 10
    //  para cambiar el máximo por la nueva carta
    if ($_SESSION["carta"] > $_SESSION["maximo"]) {
        $_SESSION["maximo"] = $_SESSION["carta"];
    }
}

// Volvemos al formulario 11
header("Location:minijuegos-1-3-1.php");

Minijuegos (1) 4 - Nuevas cartas

  1. Para que las dos páginas del programa puedan utilizar los números de las cartas, guardaremos esos valores en $_SESSION. Esos valores se muestran en la página 1 y se modifican en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlos o modificarlos provocaría un error, por lo que damos valor a las variables si no existen.
  3. La página 1 muestra las cartas guardadas en $_SESSION (los números guardados corresponden al nombre del fichero de la imagen de la carta).
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si las variables de sesión no están definidas, redirigiremos a la página 1 donde se les dará los valores iniciales.
  6. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 el único control es un botón con atributo name, por lo que sólo hay que recoger ese dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. En general, la página 2 modifica los valores guardados en la sesión, dependiendo de la petición recibida. En este caso, cuando recibimos el valor "nuevas", cambiamos los valores de las cartas al azar.
  8. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-4-1.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-4");
session_start();

// Si los valores de sesión no existen, damos valor a las tres cartas 2
if (!isset($_SESSION["carta1"])) {
    $_SESSION["carta1"] = rand(1, 10);
    $_SESSION["carta2"] = rand(1, 10);
    $_SESSION["carta3"] = rand(1, 10);
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-4-2.php">
<?php
print "    <p>\n";
print "      <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print "           width=\"260\" height=\"190\" viewBox=\"-50 -10 260 190\">\n";
// Mostramos las tres cartas, guardadas en la sesión 3
print "        <image href=\"img/cartas/t$_SESSION[carta1].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(-15, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/t$_SESSION[carta2].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(0, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/t$_SESSION[carta3].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(15, 0, 150)\"/>\n";
print "      </svg>\n";
print "    </p>\n";
print "\n";
?>
    <p><button type="submit" name="accion" value="nuevas">Nuevas cartas</button></p>
  </form>
...

minijuegos-1-4-2.php

<?php
// Accedemos a la sesión 4
session_name("minijuegos-1-4");
session_start();

// Si el valor de sesión no existe, redirigimos a la primera página 5
if (!isset($_SESSION["carta1"])) {
    header("Location:minijuegos-1-4-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Si recibimos "nuevas", reiniciamos los valores de las cartas 7
if ($accion == "nuevas") {
    $_SESSION["carta1"] = rand(1, 10);
    $_SESSION["carta2"] = rand(1, 10);
    $_SESSION["carta3"] = rand(1, 10);
}

// Volvemos al formulario 8
header("Location:minijuegos-1-4-1.php");

Minijuegos (1) 5 - Jugada de tres cartas

Este programa lo podemos enfocar de dos maneras:

El segundo enfoque tiene la ventaja de que el papel de ambas páginas está claramente separado: la página 1 se encarga únicamente de mostrar el resultado y la página 2 se encarga únicamente de calcular los datos. La "lógica" del programa está separada de la visualización de los datos.

Minijuegos (1) 5 - Jugada de tres cartas - Solución (A)

En esta versión, únicamente guardamos en $_SESSION los valores de las tres cartas.

  1. Para que las dos páginas del programa puedan utilizar los números de las cartas, guardaremos esos valores en $_SESSION. Esos valores se muestran en la página 1 y se modifican en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlos o modificarlos provocaría un error, por lo que damos valor a las variables si no existen.
  3. La página 1 muestra las cartas guardadas en $_SESSION (los números guardados corresponden al nombre del fichero de la imagen de la carta) ...
  4. La página 1 analiza la jugada obtenida y muestra el resultado correspondiente, comprobando si las tres cartas son iguales, si hay dos cartas iguales o si las tres cartas son distintas, en cuyo caso muestra el valor de la carta más grande.
  5. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  6. Si las variables de sesión no están definidas, redirigiremos a la página 1 donde se les dará los valores iniciales.
  7. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 el único control es un botón con atributo name, por lo que sólo hay que recoger ese dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  8. En general, la página 2 modifica los valores guardados en la sesión, dependiendo de la petición recibida. En este caso, cuando recibimos el valor "nuevas", cambiamos los valores de las cartas al azar.
  9. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-5-1.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-5");
session_start();

// Si los valores de sesión no existen, damos valor a las tres cartas 2
if (!isset($_SESSION["carta1"])) {
    $_SESSION["carta1"] = rand(1, 10);
    $_SESSION["carta2"] = rand(1, 10);
    $_SESSION["carta3"] = rand(1, 10);
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-5-2.php">
<?php
print "    <p>\n";
print "      <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print "           width=\"260\" height=\"190\" viewBox=\"-50 -10 260 190\">\n";
// Mostramos las tres cartas, guardadas en la sesión 3
print "        <image href=\"img/cartas/c$_SESSION[carta1].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(-15, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/c$_SESSION[carta2].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(0, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/c$_SESSION[carta3].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(15, 0, 150)\"/>\n";
print "      </svg>\n";
print "    </p>\n";
print "\n";
// Comprobamos si se ha obtenido un trío, una pareja o cartas distintas 4
// y mostramos la jugada obtenida en cada caso
if ($_SESSION["carta1"] == $_SESSION["carta2"] && $_SESSION["carta2"] == $_SESSION["carta3"]) {
    print "    <p>Ha obtenido un trío de $_SESSION[carta1].<p>\n";
} elseif ($_SESSION["carta1"] == $_SESSION["carta2"] || $_SESSION["carta1"] == $_SESSION["carta3"]) {
    print "    <p>Ha obtenido una pareja de $_SESSION[carta1].<p>\n";
} elseif ($_SESSION["carta2"] == $_SESSION["carta3"]) {
    print "    <p>Ha obtenido una pareja de $_SESSION[carta2].<p>\n";
} else {
    print "    <p>Ha obtenido un " . max($_SESSION["carta1"], $_SESSION["carta2"], $_SESSION["carta3"]) . ".<p>\n";
}
print "\n";
?>
    <p><button type="submit" name="accion" value="nuevas">Nuevas cartas</button></p>
  </form>
...

minijuegos-1-5-2.php

<?php
// Accedemos a la sesión 5
session_name("minijuegos-1-5");
session_start();

// Si los valores de sesión no existen, redirigimos a la primera página 6
if (!isset($_SESSION["carta1"])) {
  header("Location:minijuegos-1-5-1.php");
  exit;
}

// Función de recogida de datos 7
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Si recibimos "nuevas", reiniciamos los valores de las cartas 8
if ($accion == "nuevas") {
    $_SESSION["carta1"] = rand(1, 10);
    $_SESSION["carta2"] = rand(1, 10);
    $_SESSION["carta3"] = rand(1, 10);
}

// Volvemos al formulario 9
header("Location:minijuegos-1-5-1.php");

Minijuegos (1) 5 - Jugada de tres cartas - Solución (B)

En esta versión, guardamos en $_SESSION los valores de las tres cartas y la descripción de la jugada obtenida.

  1. Para que las dos páginas del programa puedan utilizar los números de las cartas y la jugada obtenida, guardaremos esos valores en $_SESSION. Esos valores se muestran en la página 1 y se modifican en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlos o modificarlos provocaría un error, por lo que damos valor a las variables si no existen. Para que la página 1 no contenga ninguna "lógica" de programa, sino que simplemente muestre los valores obtenidos en la página 2, redirigiremos a la página 2 para su cálculo.
  3. La página 1 muestra las cartas guardadas en $_SESSION (los números guardados corresponden al nombre del fichero de la imagen de la carta) ...
  4. ... y la jugada obtenida.
  5. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  6. Si las variables de sesión no están definidas, les damos valores a las tres cartas al azar. No volvemos inmediatamente a la página 1 porque queda por determinar la jugada obtenida (trío, pareja o valores sueltos).
  7. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 el único control es un botón con atributo name, por lo que sólo hay que recoger ese dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  8. En general, la página 2 modifica los valores guardados en la sesión, dependiendo de la petición recibida. En este caso, cuando recibimos el valor "nuevas", cambiamos los valores de las cartas al azar.
  9. El análisis de la jugada obtenida se realiza independientemente del dato recibido, de manera que el análisis se realice tanto cuando se han cambiado las cartas como cuando se han asignado las cartas por primera vez.
  10. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-5-1-b.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-5-b");
session_start();

// Si los valores de sesión no existen, redirigimos a la segunda página 2
if (!isset($_SESSION["carta1"])) {
    header("Location:minijuegos-1-5-2.php");
    exit;
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-5-2-b.php">
<?php
print "    <p>\n";
print "      <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print "           width=\"260\" height=\"190\" viewBox=\"-50 -10 260 190\">\n";
// Mostramos las tres cartas, guardadas en la sesión 3
print "        <image href=\"img/cartas/c$_SESSION[carta1].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(-15, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/c$_SESSION[carta2].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(0, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/c$_SESSION[carta3].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(15, 0, 150)\"/>\n";
print "      </svg>\n";
print "    </p>\n";
print "\n";
// Mostramos la jugada obtenida, guardada en la sesión 4
print "    <p>Ha obtenido $_SESSION[mano].</p>\n";
print "\n";
?>
    <p><button type="submit" name="accion" value="nuevas">Nuevas cartas</button></p>
  </form>
...

minijuegos-1-5-2-b.php

<?php
// Accedemos a la sesión 5
session_name("minijuegos-1-5-b");
session_start();

// Si los valores de sesión no existen, damos valor a las tres cartas 6
// Más adelante comprobamos qué jugada se ha obtenido
if (!isset($_SESSION["carta1"])) {
    $_SESSION["carta1"] = rand(1, 10);
    $_SESSION["carta2"] = rand(1, 10);
    $_SESSION["carta3"] = rand(1, 10);
}

// Función de recogida de datos 7
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Si recibimos "nuevas", reiniciamos los valores de las cartas 8
if ($accion == "nuevas") {
    $_SESSION["carta1"] = rand(1, 10);
    $_SESSION["carta2"] = rand(1, 10);
    $_SESSION["carta3"] = rand(1, 10);
}

// Comprobamos si se ha obtenido un trío, una pareja o cartas distintas 9
if ($_SESSION["carta1"] == $_SESSION["carta2"] && $_SESSION["carta2"] == $_SESSION["carta3"]) {
    $_SESSION["mano"] = "un trío de $_SESSION[carta1]";
} elseif ($_SESSION["carta1"] == $_SESSION["carta2"] || $_SESSION["carta1"] == $_SESSION["carta3"]) {
    $_SESSION["mano"] = "una pareja de $_SESSION[carta1]";
} elseif ($_SESSION["carta2"] == $_SESSION["carta3"]) {
    $_SESSION["mano"] = "una pareja de $_SESSION[carta2]";
} else {
    $_SESSION["mano"] = "un " . max($_SESSION["carta1"], $_SESSION["carta2"], $_SESSION["carta3"]);
}

// Volvemos al formulario 10
header("Location:minijuegos-1-5-1.php");

Minijuegos (1) 6 - Partida de tres cartas

En esta versión, guardamos en $_SESSION los valores de las tres cartas y el resultado de la partida.

  1. Para que las dos páginas del programa puedan utilizar los números de las cartas y la jugada obtenida, guardaremos esos valores en $_SESSION. Esos valores se muestran en la página 1 y se modifican en la página 2. Para ello, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlos o modificarlos provocaría un error, por lo que damos valor a las variables si no existen. Para que la página 1 no contenga ninguna "lógica" de programa, sino que simplemente muestre los valores obtenidos en la página 2, redirigiremos a la página 2 para su cálculo.
  3. La página 1 muestra las cartas guardadas en $_SESSION (los números guardados corresponden al nombre del fichero de la imagen de la carta) ...
  4. ... y quién es el ganador.
  5. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  6. Si las variables de sesión no están definidas, les damos valores a las seis cartas al azar. No volvemos inmediatamente a la página 1 porque queda por determinar quién es el ganador.
  7. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 el único control es un botón con atributo name, por lo que sólo hay que recoger ese dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  8. En general, la página 2 modifica los valores guardados en la sesión, dependiendo de la petición recibida. En este caso, cuando recibimos el valor "nuevas", cambiamos los valores de las cartas al azar.
  9. El análisis del resultado de la partida se realiza independientemente del dato recibido, tanto cuando se han cambiado las cartas como cuando se han asignado las cartas por primera vez. En primer lugar analizamos la jugada obtenida por el primer jugador (como en el ejercicio 5) y guardamos el resultado en dos variables auxiliares $manoN y $valorN. $manoN valdrá 3, 2 o 1 si el jugador ha obtenido tres cartas iguales, 2 cartas iguales o tres cartas distintas, respectivamente. $valorR contendrá el valor del trío, de la pareja o de la carta más alta, respectivamente.
  10. A continuación, analizaremos la jugada obtenida por el segundo jugador, guardando el resultado en dos variables auxiliares $manoR y $valorR.
  11. Por último, comparamos los valores de $manoN y $manoR y de $valorN y $valorR para determinar el ganador.
  12. Finalmente, la página 2 redirige a la página 1.

minijuegos-1-6-1.php

<?php
// Accedemos a la sesión 1
session_name("minijuegos-1-6");
session_start();

// Si los valores de sesión no existen, redirigimos a la segunda página2
if (!isset($_SESSION["cartaR1"])) {
    header("Location:minijuegos-1-6-2.php");
    exit;
}
?>
<!DOCTYPE html>
...
  <form action="minijuegos-1-6-2.php">
<?php
print "    <p>\n";
print "      <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print "           width=\"400\" height=\"190\" viewBox=\"-50 -10 400 190\">\n";
// Mostramos las seis cartas, guardadas en la sesión 3
print "        <image href=\"img/cartas/p$_SESSION[cartaN1].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(-15, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/p$_SESSION[cartaN2].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(0, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/p$_SESSION[cartaN3].svg\" x=\"0\" y=\"0\" height=\"150\" transform=\"rotate(15, 0, 150)\"/>\n";
print "        <image href=\"img/cartas/d$_SESSION[cartaR1].svg\" x=\"200\" y=\"0\" height=\"150\" transform=\"rotate(-15, 200, 150)\"/>\n";
print "        <image href=\"img/cartas/d$_SESSION[cartaR2].svg\" x=\"200\" y=\"0\" height=\"150\" transform=\"rotate(0, 200, 150)\"/>\n";
print "        <image href=\"img/cartas/d$_SESSION[cartaR3].svg\" x=\"200\" y=\"0\" height=\"150\" transform=\"rotate(15, 200, 150)\"/>\n";
print "      </svg>\n";
print "    </p>\n";
print "\n";
// Mostramos el ganador, guardado en la sesión 4
print "    <p>$_SESSION[ganador]</p>\n";
print "\n";
?>
    <p><button type="submit" name="accion" value="nuevas">Nuevas cartas</button></p>
  </form>
...

minijuegos-1-6-2.php

<?php
// Accedemos a la sesión 5
session_name("minijuegos-1-6");
session_start();

// Si los valores de sesión no existen, damos valor a las seis cartas 6
// Más adelante comprobamos quién es el ganador
if (!isset($_SESSION["cartaN1"])) {
    $_SESSION["cartaN1"] = rand(1, 10);
    $_SESSION["cartaN2"] = rand(1, 10);
    $_SESSION["cartaN3"] = rand(1, 10);
    $_SESSION["cartaR1"] = rand(1, 10);
    $_SESSION["cartaR2"] = rand(1, 10);
    $_SESSION["cartaR3"] = rand(1, 10);
}

// Función de recogida de datos 7
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Si recibimos "nuevas", reiniciamos los valores de las cartas 8
if ($accion == "nuevas") {
    $_SESSION["cartaN1"] = rand(1, 10);
    $_SESSION["cartaN2"] = rand(1, 10);
    $_SESSION["cartaN3"] = rand(1, 10);
    $_SESSION["cartaR1"] = rand(1, 10);
    $_SESSION["cartaR2"] = rand(1, 10);
    $_SESSION["cartaR3"] = rand(1, 10);
}

// Comprobamos si el primer jugador ha obtenido un trío, una pareja o cartas distintas 9
if ($_SESSION["cartaN1"] == $_SESSION["cartaN2"] && $_SESSION["cartaN2"] == $_SESSION["cartaN3"]) {
    $manoN  = 3;
    $valorN = $_SESSION["cartaN1"];
} elseif ($_SESSION["cartaN1"] == $_SESSION["cartaN2"] || $_SESSION["cartaN1"] == $_SESSION["cartaN3"]) {
    $manoN  = 2;
    $valorN = $_SESSION["cartaN1"];
} elseif ($_SESSION["cartaN2"] == $_SESSION["cartaN3"]) {
    $manoN  = 2;
    $valorN = $_SESSION["cartaN2"];
} else {
    $manoN  = 1;
    $valorN = max($_SESSION["cartaN1"], $_SESSION["cartaN2"], $_SESSION["cartaN3"]);
}

// Comprobamos si el segundo jugador ha obtenido un trío, una pareja o cartas distintas 10
if ($_SESSION["cartaR1"] == $_SESSION["cartaR2"] && $_SESSION["cartaR2"] == $_SESSION["cartaR3"]) {
    $manoR  = 3;
    $valorR = $_SESSION["cartaR1"];
} elseif ($_SESSION["cartaR1"] == $_SESSION["cartaR2"] || $_SESSION["cartaR1"] == $_SESSION["cartaR3"]) {
    $manoR  = 2;
    $valorR = $_SESSION["cartaR1"];
} elseif ($_SESSION["cartaR2"] == $_SESSION["cartaR3"]) {
    $manoR  = 2;
    $valorR = $_SESSION["cartaR2"];
} else {
    $manoR  = 1;
    $valorR = max($_SESSION["cartaR1"], $_SESSION["cartaR2"], $_SESSION["cartaR3"]);
}

// Comparamos el resultado de ambos jugadores para saber quién ha ganado 11
if ($manoN > $manoR) {
    $_SESSION["ganador"] = "Ha ganado el jugador de las cartas negras.";
} elseif ($manoR > $manoN) {
    $_SESSION["ganador"] = "Ha ganado el jugador de las cartas rojas.";
} elseif ($valorN > $valorR) {
    $_SESSION["ganador"] = "Ha ganado el jugador de las cartas negras.";
} elseif ($valorR > $valorN) {
    $_SESSION["ganador"] = "Ha ganado el jugador de las cartas rojas.";
} else {
    $_SESSION["ganador"] = "Han empatado.";
}

// Volvemos al formulario 12
header("Location:minijuegos-1-5-1.php");