Simulación de Batalla Pokémon en Swift

Clase 14 de 25Curso de Swift para Apps iOS

Contenido del curso

Fundamentos de programación iOS

POO en iOS

Resumen

Dominar variables, condicionales y ciclos abre la puerta a resolver problemas reales de programación. En Swift, combinar estas herramientas permite crear simulaciones completas como una batalla Pokémon por turnos, un ejercicio que integra diccionarios, funciones con retorno y control de flujo con while. A continuación se desglosa paso a paso cómo construir esta solución.

¿Cómo se plantea el reto de la batalla Pokémon en Swift?

El objetivo es escribir una función llamada simularBatallaPokemon que reciba dos diccionarios como parámetros. Cada diccionario representa un Pokémon con dos claves numéricas: PV (puntos de vida) y PA (puntos de ataque). El primer Pokémon ataca primero, reduce los puntos de vida del rival según sus puntos de ataque, y luego el rival responde. La batalla continúa hasta que uno se quede sin vida, y la función retorna un string indicando al ganador.

Los casos de prueba enfrentan a Pikachu contra Charmander, cada uno con valores distintos de PV y PA [01:12].

¿Por qué los parámetros de una función son constantes en Swift?

Uno de los obstáculos más comunes al resolver este ejercicio es intentar modificar directamente los parámetros recibidos. En Swift, los parámetros de una función siempre se comportan como constantes (let), lo que significa que no puedes alterar su contenido dentro del cuerpo de la función [03:45].

La solución es crear copias mutables usando var:

swift var p1 = pokemon1 var p2 = pokemon2

De esta forma ya se pueden modificar los puntos de vida durante cada turno de ataque.

¿Qué son los opcionales y por qué aparecen al acceder a diccionarios?

Cuando accedes a un valor de un diccionario mediante su llave, Swift devuelve un opcional (optional). Esto ocurre porque no hay garantía de que la llave exista. Al imprimir p1["PV"], el resultado muestra algo como Optional(100) [04:30].

Para trabajar con el valor real se necesita hacer unwrap, es decir, extraer el contenido del opcional con el operador !. Esto es fundamental para que las operaciones aritméticas y las comparaciones funcionen correctamente dentro del algoritmo.

¿Cómo funciona el ciclo while en la simulación de turnos?

El ciclo while ejecuta el bloque de código mientras ambos Pokémon tengan puntos de vida mayores a cero [05:30]:

swift var turno = 1

while p1["PV"]! > 0 && p2["PV"]! > 0 { if turno == 1 { p2["PV"] = p2["PV"]! - p1["PA"]! if p2["PV"]! > 0 { turno = 2 } else { return "Ganó Pokémon uno" } } else { p1["PV"] = p1["PV"]! - p2["PA"]! if p1["PV"]! > 0 { turno = 1 } else { return "Ganó Pokémon dos" } } }

  • La variable turno controla quién ataca.
  • Cada ataque resta los puntos de ataque del atacante a los puntos de vida del defensor.
  • Después de cada ataque se verifica si el defensor sigue vivo; si no, la función retorna inmediatamente con un return [07:15].

Un return dentro de un ciclo while termina la función de forma instantánea, sin importar que el ciclo aún no haya completado su condición.

¿Cómo se valida y se imprime el resultado de la función?

Para ver el resultado en consola es necesario capturar el valor de retorno en una variable e imprimirlo [09:00]:

swift let resultado = simularBatallaPokemon(pokemon1: pikachu, pokemon2: charmander) print(resultado)

Con los valores originales gana Pokémon dos. Al cambiar los puntos de vida de Pikachu a 500, el resultado se invierte y gana Pokémon uno, lo que confirma que la lógica es correcta [09:30].

Una consideración importante sobre los strings: dentro de una cadena de caracteres se pueden usar tildes, virgulillas y otros caracteres especiales sin problema. Sin embargo, no deben usarse en nombres de variables o funciones porque generan errores de compilación [08:15].

Este ejercicio integra todo lo aprendido en fundamentos de programación con Swift: variables, constantes, condicionales, ciclos, arreglos, conjuntos, diccionarios y funciones. Si tu solución fue diferente, compártela en los comentarios; en programación existen múltiples caminos válidos para llegar al mismo resultado.