PHPlay

Curso de PHP gratis · Final de 13 · con Rasmus

Proyecto final de PHP: el Gran Molino de Zend

El reto final combina todo lo aprendido en el curso en dos programas completos.

El corazón del valle

El Gran Molino de Zend movía el agua y la energía de todo el Valle Zend. Lleva parado desde que BIT-8 se durmió.

Para ponerlo en marcha necesitas dos cosas:

  1. Superar el Programa Maestro: demostrar que sabes combinar todo lo aprendido en un programa para BIT-8.
  2. Entregar los recursos que ves abajo. Consíguelos automatizando tu granja desde la consola de BIT-8 (y mejorándola en el Taller).

Ejercicios de PHP resueltos

Intenta resolverlos antes de mirar la solución. En el juego puedes ejecutarlos y comprobarlos automáticamente.

Misión del dron 1. El Programa Maestro

El Molino necesita una demostración: un campo de 5x5 con hierba, dos árboles maduros y una franja de tierra al norte. Solo tienes una carga de batería.

Con una sola ejecución (batería 1600) consigue:

  • al menos 100 de heno,
  • al menos 25 zanahorias (plántalas en la franja de tierra, y replántalas al cosechar),
  • al menos 6 de madera.

Y hazlo con al menos una función tuya. Plantar una zanahoria cuesta 1 de heno.

Esta misión mueve al dron BIT-8 por un campo de cultivo: juégala en PHPlay para ver tu código animado.

Pistas
  • Divide el problema: tratar_casilla() decide qué hacer en UNA casilla; pasada() recorre el campo llamándola.
  • En cada casilla: si se puede cosechar, cosecha; después, si el suelo es tierra y está vacío (que_hay() === null), planta una zanahoria.
  • Envuélvelo todo en while (true) { pasada(); }: la batería decidirá cuándo parar.
Ver solución
<?php
function tratar_casilla(): void {
    if (puede_cosechar()) {
        cosechar();
    }
    if (suelo() === "tierra" && que_hay() === null) {
        plantar(ZANAHORIA);
    }
}

function pasada(): void {
    $n = tam();
    for ($y = 0; $y < $n; $y++) {
        for ($x = 0; $x < $n; $x++) {
            tratar_casilla();
            mover(ESTE);
        }
        mover(NORTE);
    }
}

while (true) {
    pasada();
}

Encargo 2. El informe del Molino

El Molino lleva un registro de todo lo que entra. Cada entrada de $registro es un array con cultivo, cantidad y dia. El guardián del Molino necesita un informe.

Escribe una función totales(array $registro): array que devuelva [cultivo => total] ordenado de mayor a menor total (si empatan, en el orden en que aparecen). Después imprime el informe con este formato exacto (nombre alineado a la izquierda en 10 caracteres, total a la derecha en 5) y el día con más unidades:

== Informe del Molino ==
heno         42
zanahoria    17
madera        6
Mejor día: 2 (26 unidades)
Pistas
  • En totales: $t[$e["cultivo"]] = ($t[$e["cultivo"]] ?? 0) + $e["cantidad"]; y al final arsort($t);.
  • Para imprimir: printf("%-10s%5d\n", $cultivo, $total);
  • Para el mejor día, acumula por día en otro array y busca el máximo con max() y array_search().
Ver solución
<?php
function totales(array $registro): array {
    $t = [];
    foreach ($registro as $e) {
        $t[$e["cultivo"]] = ($t[$e["cultivo"]] ?? 0) + $e["cantidad"];
    }
    arsort($t);
    return $t;
}

echo "== Informe del Molino ==\n";
foreach (totales($registro) as $cultivo => $total) {
    printf("%-10s%5d\n", $cultivo, $total);
}

$porDia = [];
foreach ($registro as $e) {
    $porDia[$e["dia"]] = ($porDia[$e["dia"]] ?? 0) + $e["cantidad"];
}
$mejor = max($porDia);
$dia = array_search($mejor, $porDia);
echo "Mejor día: $dia ($mejor unidades)\n";

Chuleta: lo esencial

Todo lo aprendido, junto.