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:
- Superar el Programa Maestro: demostrar que sabes combinar todo lo aprendido en un programa para BIT-8.
- 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 finalarsort($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()yarray_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.