You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

1 Días
10 Hrs
13 Min
17 Seg

Recorridos parte 3: los retos

14/25
Resources

How to develop a solution to simulate a Pokémon battle?

To talk about programming is to enter a world of logic and creativity, and nothing combines these concepts better than practical projects. One of them is the simulation of Pokémon battles, a challenge that invites us to apply fundamental skills such as the use of variables, conditionals and cycles. This exercise is not only fun, but also allows us to delve deeper into the handling of function inputs and outputs in Swift.

What is the approach of the exercise?

In this exercise, we seek to develop a function that simulates a battle between two Pokémon. The function will receive two dictionaries, each representing a Pokémon with its life points (LP) and attack points (AP). The battle will start with the first Pokémon attacking, and will end when one of the two Pokémon has no more HP. The function will output a message indicating the winner.

How to take advantage of variables and constants in development?

A crucial detail in Swift is that parameters within functions are constants. To manipulate the Pokémon data, we will need to create copies of these parameters and work with variables:

var pOne = pokemonOne var pTwo = pokemonTwo.

How do we manage the flow of the battle?

To simulate the turn of each Pokémon, we will use a while loop to keep the battle active as long as both Pokémon have life points. Here, a clever use of conditionals will define which Pokémon is attacking at any given time.

var turn = 1 // Turn of the first Pokémon by default while (pOne["PB"]! > 0) && (pTwo["PB"]! > 0) { if turn == 1 { // Turn of Pokémon 1 // Logic of Pokémon 1 attacking Pokémon 2 } else { // Turn of Pokémon 2 // Logic of Pokémon 2 attacking Pokémon 1 } // Change turn }

How do we handle life points and attacks?

It is essential to subtract the attacking Pokémon's attack points from the opponent Pokémon's life points. In addition, we must check after each attack if a Pokémon has lost all its life points.

if turn == 1 { pTwo["BP"]! -= pOne["PA"]! if pTwo["PB"]! <= 0 { return "Pokémon One won" } turn = 2 } else { pOne["PB"]! -= pTwo["PA"]! if pOne["PB"]! <= 0 { return "Pokémon Two won" } turn = 1 }

How can we interact with the result correctly?

When executing our function, it is important to capture and display the result. This is accomplished by assigning the output of the function to a variable and then printing this result:

let result = simulateBattlePokemon(pikachu, charmander) print(result).

Final tips and thoughts on simulation?

It is important to experiment with different scenarios and adjust life and attack points to explore how the outcome of the battle varies. Constant practice in modifying and executing this exercise will strengthen your programming skills.

Simulating Pokémon battles is an excellent way to consolidate programming fundamentals. These types of tasks not only promote logical reasoning but also creativity in writing efficient and functional code. We encourage you to continue exploring and developing your Swift skills to take on new and exciting projects.

Contributions 11

Questions 1

Sort by:

Want to see more contributions, questions and answers from the community?

**Esta es mi solución:** `var`` pikachu = ["pa":10,"pv":100]` `var`` charmander = ["pa":15,"pv":120]` `func`` pokebattle(poke1:[String:Int] , poke2:[String:Int]) -> String {` `let`` winrate1 = poke2["pv"]!/poke1["pa"]! + (poke2["pv"]! % poke1["pa"]! != 0 ? 1:0)` `let`` winrate2 = poke1["pv"]!/poke2["pa"]! + (poke1["pv"]! % poke2["pa"]! != 0 ? 1:0)` `if`` (winrate1<=winrate2){` `return``("El ganador es el pokemon 1")` `}` `else``{` `return``("El ganador es el pokemon 2")` `}` `}` `print(pokebattle(poke1: pikachu,poke2: charmander))`
Me apareció este error al momento de ejecutar el código![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-12-08%20a%20la%28s%29%201.54.36a.m.-304fcbb0-e951-43c6-827c-07068d52fad3.jpg)
```js var pikachu = [ "pa": 10, "pv": 100 ] var charmander = [ "pa": 15, "pv": 120 ] func simularBatallaPokemon(pokemon1: [String: Int], pokemon2: [String: Int]) -> String { var vidaPoke1 = pokemon1["pv"]! var vidaPoke2 = pokemon2["pv"]! var numeroTurnos: Int = 0 while vidaPoke1 > 0 && vidaPoke2 > 0 { if(numeroTurnos % 2 == 0) { vidaPoke2 -= pokemon1["pa"]! if(vidaPoke2 <= 0){ return "Gana pokemon 1" } else { numeroTurnos += 1 } } else { vidaPoke1 -= pokemon2["pa"]! if(vidaPoke1 <= 0){ return "Gana pokemon 2" } else { numeroTurnos += 1 } } } return "" } print(simularBatallaPokemon(pokemon1: pikachu, pokemon2: charmander)) ```
Aquí mi solución : ```js let pokeSilicon = [ "PB": 400, "PA":80 ] let pokeIntel = [ "PB": 200, "PA":10 ] func isPar(number:Int) -> Bool{ if(number % 2 == 0){ return true }else{ return false } } func fightPokemon(pokemon1:[String:Int], pokemon2:[String:Int]) -> String{ guard let pb1 = pokemon1["PB"], let pb2 = pokemon2["PB"], let pa1 = pokemon1["PA"], let pa2 = pokemon2["PA"] else { return "Necesitas pasarle los puntos de vida y ataque a todos los pokemones" } var pokemon1Data = pokemon1 var pokemon2Data = pokemon2 var shift = 0; while (pokemon1Data["PB"]! > 0 && pokemon2Data["PB"]! > 0){ if(isPar(number:shift)){ pokemon2Data["PB"] = pokemon2Data["PB"]! - pa1 shift+=1; }else{ pokemon1Data["PB"] = pokemon1Data["PB"]! - pa2 shift+=1; } } if(pokemon1Data["PB"]! > 0){ return "El pokemon 1 ha sido el ganador" }else{ return "El pokemon 2 ha sido el ganador" } } print(fightPokemon(pokemon1:pokeSilicon,pokemon2:pokeIntel)) ```**let** pokeSilicon = \[ "PB": 400, "PA":80 ] **let** pokeIntel = \[ "PB": 200, "PA":10 ] **func** isPar(number:Int) -> Bool{ **if**(number % 2 == 0){ **return** **true** }**else**{ **return** **false** } } **func** fightPokemon(pokemon1:\[String:Int], pokemon2:\[String:Int]) -> String{ **guard** **let** pb1 = pokemon1\["PB"], **let** pb2 = pokemon2\["PB"], **let** pa1 = pokemon1\["PA"], **let** pa2 = pokemon2\["PA"] **else** { **return** "Necesitas pasarle los puntos de vida y ataque a todos los pokemones" } **var** pokemon1Data = pokemon1 **var** pokemon2Data = pokemon2 **var** shift = 0; **while** (pokemon1Data\["PB"]! > 0 && pokemon2Data\["PB"]! > 0){ **if**(isPar(number:shift)){ pokemon2Data\["PB"] = pokemon2Data\["PB"]! - pa1 shift+=1; }**else**{ pokemon1Data\["PB"] = pokemon1Data\["PB"]! - pa2 shift+=1; } } **if**(pokemon1Data\["PB"]! > 0){ **return** "El pokemon 1 ha sido el ganador" }**else**{ **return** "El pokemon 2 ha sido el ganador" } } print(fightPokemon(pokemon1:pokeSilicon,pokemon2:pokeIntel))
Comparto mi solucion: **var** pikachu:\[String: Int] = \["pa": 10 , "pv": 100] **var** charmander:\[String: Int] = \["pa": 15, "pv": 120] **func** simularBatallaPokemon(Pokemon1: \[String: Int], Pokemon2:\[String: Int]) -> String { **var** isTurn = **false** **var** pokemon2pv = Pokemon2\["pv"]! **var** pokemon1pv = Pokemon1\["pv"]! **var** isFinal = **false** **var** ganador = "" **while**(!isFinal) { **if**(isTurn == **false**) { pokemon2pv -= Pokemon1\["pa"]! print("pokemon2pv: \\(pokemon2pv)" ) **if**(pokemon2pv < 1 && pokemon1pv > 0){ ganador = "El ganador pokemon1" isFinal = **true** } isTurn = **true** } **else** { pokemon1pv -= Pokemon2\["pa"]! print("pokemon1pv: \\(pokemon1pv)") **if**(pokemon1pv < 1 && pokemon2pv > 0){ ganador = "El ganador pokemon2" isFinal = **true** } isTurn = **false** } } **return** ganador } print(simularBatallaPokemon(Pokemon1: pikachu , Pokemon2: charmander))
Yo utilicé de todos modos un random del turno y balanceé el ataque de Charmander, ya que no importaba quien inicia, siempre ganaba Pikachu.`var pikachu: [String: Any] = ["name": "Pickachu", "AP": 10, "HP": 100]16+var charmander: [String: Any] = ["name": "Charmander", "AP": 9, "HP": 120]17+18+19+func battlePokemons(pokemon1: [String: Any], against pokemon2: [String: Any]) -> String {20+ // Pokemon 1 Destructure21+ guard let pokemon1Name = pokemon1["name"] as? String,22+ let pokemon1Attack = pokemon1["AP"] as? Int,23+ var pokemon1Health = pokemon1["HP"] as? Int else {24+ return "Invalid data for Pokemon 1"25+ }26+ // Pokemon 2 Destructure27+ guard let pokemon2Name = pokemon2["name"] as? String,28+ let pokemon2Attack = pokemon2["AP"] as? Int,29+ var pokemon2Health = pokemon2["HP"] as? Int else {30+ return "Invalid data for Pokemon 1"31+ }32+ 33+ //Randomize first turn34+ var turnPokemonSwitch: Bool = Bool.random()// true for Pokemon 1, false for Pokemon 235+ var pokemonWinner: String = ""36+ 37+ while pokemon1Health > 0 && pokemon2Health > 0 {38+ switch(turnPokemonSwitch){39+ case true:40+ pokemon2Health -= pokemon1Attack; turnPokemonSwitch.toggle()41+ case false:42+ pokemon1Health -= pokemon2Attack; turnPokemonSwitch.toggle()43+ }44+ }45+ 46+ if pokemon1Health > 0 { pokemonWinner = pokemon1Name }47+ if pokemon2Health > 0 { pokemonWinner = pokemon2Name }48+ 49+ return "\(pokemonWinner) is the winner!"50+}51+52+print(battlePokemons(pokemon1: pikachu, against: charmander))53+print(battlePokemons(pokemon1: pikachu, against: charmander))54+print(battlePokemons(pokemon1: pikachu, against: charmander))55+print(battlePokemons(pokemon1: pikachu, against: charmander))56+print(battlePokemons(pokemon1: pikachu, against: charmander))` ```js var pikachu: [String: Any] = ["name": "Pickachu", "AP": 10, "HP": 100] var charmander: [String: Any] = ["name": "Charmander", "AP": 9, "HP": 120] func battlePokemons(pokemon1: [String: Any], against pokemon2: [String: Any]) -> String { // Pokemon 1 Destructure guard let pokemon1Name = pokemon1["name"] as? String, let pokemon1Attack = pokemon1["AP"] as? Int, var pokemon1Health = pokemon1["HP"] as? Int else { return "Invalid data for Pokemon 1" } // Pokemon 2 Destructure guard let pokemon2Name = pokemon2["name"] as? String, let pokemon2Attack = pokemon2["AP"] as? Int, var pokemon2Health = pokemon2["HP"] as? Int else { return "Invalid data for Pokemon 1" } //Randomize first turn var turnPokemonSwitch: Bool = Bool.random()// true for Pokemon 1, false for Pokemon 2 var pokemonWinner: String = "" while pokemon1Health > 0 && pokemon2Health > 0 { switch(turnPokemonSwitch){ case true: pokemon2Health -= pokemon1Attack; turnPokemonSwitch.toggle() case false: pokemon1Health -= pokemon2Attack; turnPokemonSwitch.toggle() } } if pokemon1Health > 0 { pokemonWinner = pokemon1Name } if pokemon2Health > 0 { pokemonWinner = pokemon2Name } return "\(pokemonWinner) is the winner!" } print(battlePokemons(pokemon1: pikachu, against: charmander)) print(battlePokemons(pokemon1: pikachu, against: charmander)) print(battlePokemons(pokemon1: pikachu, against: charmander)) print(battlePokemons(pokemon1: pikachu, against: charmander)) print(battlePokemons(pokemon1: pikachu, against: charmander)) ```
Tuve algunas diferencias en comparación con el resultado del profesor Santiago. En lugar de comprobar después de cada batalla si el Pokémon que fue atacado tenía puntos de vida mayores a 0, esperé a que terminara el ciclo *while* y, finalmente, con un *if*, comprobé cuál de los dos estaba con puntos de vida en 0 y lo imprimí. Tal vez fue un poco menos eficiente, ya que se podrían evitar comprobaciones innecesarias. **func** simularBatallaPokemon(pokemon1: \[String: Int], pokemon2: \[String: Int]) -> String { **var** p1 = pokemon1 **var** p2 = pokemon2 **var** turno = 1 **var** ganador: String = "" **while** p1\["PV"]! > 0 && p2\["PV"]! > 0 { **if** turno == 1 { p2\["PV"]! -= p1\["PA"]! turno = 2 } **else** **if** turno == 2 { p1\["PV"]! -= p2\["PA"]! turno = 1 } } **if** p1\["PV"]! > 0 { ganador = "Ganó el pokemon 1" } **else** { ganador = "Ganó el pokemon 2" } **return** ganador }
```txt var pikachu = ["pa": 10, "pv": 100] var charmander = ["pa": 10, "pv": 100] func simularBatallaPokemon(pokemon1: inout [String: Int], pokemon2: inout [String: Int]) -> String { var whoStrikes = Int.random(in: 1...2) while let pokemon1Pv = pokemon1["pv"], let pokemon2Pv = pokemon2["pv"], pokemon1Pv > 0 && pokemon2Pv > 0 { if whoStrikes == 1 { pokemon2["pv", default: 0] -= pokemon1["pa", default: 0] } else { pokemon1["pv", default: 0] -= pokemon2["pa", default: 0] } whoStrikes = (whoStrikes == 1) ? 2 : 1 } let winner = (pokemon1["pv", default: 0] > 0) ? "Pokemon 1 wins!" : "Pokemon 2 wins!" return winner } print(simularBatallaPokemon(pokemon1: &pikachu, pokemon2: &charmander)) ```**var** pikachu = \["pa": 10, "pv": 100] **var** charmander = \["pa": 10, "pv": 100] **func** simularBatallaPokemon(pokemon1: **inout** \[String: Int], pokemon2: **inout** \[String: Int]) -> String { **var** whoStrikes = Int.random(in: 1...2) **while** **let** pokemon1Pv = pokemon1\["pv"], **let** pokemon2Pv = pokemon2\["pv"], pokemon1Pv > 0 && pokemon2Pv > 0 { **if** whoStrikes == 1 { pokemon2\["pv", **default**: 0] -= pokemon1\["pa", **default**: 0] } **else** { pokemon1\["pv", **default**: 0] -= pokemon2\["pa", **default**: 0] } whoStrikes = (whoStrikes == 1) ? 2 : 1 } **let** winner = (pokemon1\["pv", default: 0] > 0) ? "Pokemon 1 wins!" : "Pokemon 2 wins!" **return** winner } print(simularBatallaPokemon(pokemon1: \&pikachu, pokemon2: \&charmander))
```txt var pikachu = ["pa":10,"pv":100] var charmander = ["pa":15,"pv":120] var ekans = ["pa":10,"pv":100] func simularBatalla(p1: [String:Int], p2: [String:Int]) -> String { var po1 = p1 var po2 = p2 var respuesta = "" while po1["pv"]! > 0 && po2["pv"]! > 0 { po2["pv"] = po2["pv"]! - po1["pa"]! if po2["pv"] == 0 {continue} po1["pv"] = po1["pv"]! - po2["pa"]! } respuesta = po1["pv"]! == po2["pv"] ? "Empate" : po1["pv"]! > po2["pv"]! ? "Gano Pokemon1" : "Gano Pokemon2" return "Resultado de la batalla fue: \(respuesta). Estado: Pokemon1:\(po1), Pokemon2:\(po2)" } print(simularBatalla(p1: pikachu, p2: charmander)) print(simularBatalla(p1: charmander, p2: pikachu)) print(simularBatalla(p1: pikachu, p2: ekans)) ```
Hola a todos! Espero que les sirva mi solución: <https://github.com/paulfloresdevs/platzi-swift-course/blob/main/challenges.playground/Contents.swift>
Hola a todos! Les comparto mi solución: ![](<Captura de pantalla 2025-01-29 a la(s) 11.45.28 p.m.>)![](<Captura de pantalla 2025-01-29 a la(s) 11.45.28 p.m.>)![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202025-01-29%20a%20la%28s%29%2011.45.28p.m.-1ed2ac34-ba62-4526-98f0-2d0092bf8631.jpg)