Parcial 2: Aplicando patrones de diseño, Enunciado y Resuelto en python by Yuscu Mejia
Parcial 2
Introducción
¡Hola a todos! Soy Yuscu Mejía y en esta lección veremos como resolver un parcial final de la materia programacion en python DE NIVEL UNIVERSIDAD
Ejercicio 1: Aplicando Patrones de Diseño en Street Fighter
Enunciado:
Como todo niño, al empezar el día enciende su PlayStation 5 e ingresa a su videojuego Street Fighter (un videojuego de lucha creado por la empresa japonesa Capcom).

Nosotros, como desarrolladores, creamos ese videojuego después de cursar en mepacademia.com el curso de programación en Python de cero a experto. Para eso, nos centraremos en el inicio del juego, donde tendremos una pantalla con los distintos personajes a elegir para pelear con la máquina. Tenemos que elegir 2 personajes disponibles de los 3 disponibles.
De estos 2 personajes, podrás cambiar durante la pelea entre uno y otro cuantas veces quieras. Los personajes disponibles son: 1-Mr. Bison, 2-Ryo, 3-Chun Li. Mr. Bison tiene un poder de 5, Ryo un poder de 6, y Chun Li un poder de 7.
- a) Queremos que en tu
mainelijas a Bison y Ryo durante el juego. En el primer round utiliza a Bison, en el segundo a Ryo y en el tercero a Bison otra vez, recorda imprimir su poder de pelea durante cada round. - b) El estudio de Capcom nos dice que agreguemos otro personaje, Ken, con poder de pelea 8. Agrégalo y úsalo.
- c) Al agregar a Ken, cumple con los fundamentos de SOLID.
Criterios de Aprobación:
- NO encontró el patrón de diseño para resolver el problema (-3 puntos).
- No cumple con S de SOLID (-1).
- No cumple con O de SOLID (-2).
- No cumple con L de SOLID (-1).
- No cumple con I de SOLID (-2).
- No cumple con D de SOLID (-1).
Solución:
from abc import ABC, abstractmethod
class Personaje(ABC):
@abstractmethod
def atacar(self):
pass
class Bison(Personaje):
def __init__(self):
self.poder = 5
self.nombre = "Mr Bison"
def atacar(self):
print(f"Soy {self.nombre} y tengo un poder de {self.poder}")
class Ryo(Personaje):
def __init__(self):
self.poder = 6
self.nombre = "Ryo"
def atacar(self):
print(f"Soy {self.nombre} y tengo un poder de {self.poder}")
class Chunli(Personaje):
def __init__(self):
self.poder = 6
self.nombre = "Chun Li"
def atacar(self):
print(f"Soy {self.nombre} y tengo un poder de {self.poder}")
class Ken(Personaje):
def __init__(self):
self.poder = 8
self.nombre = "Ken"
def atacar(self):
print(f"Soy {self.nombre} y tengo un poder de {self.poder}")
class ContextoPersonaje:
def __init__(self, unPersonajeAux: Personaje):
self.unPersonaje = unPersonajeAux
def atacar(self):
self.unPersonaje.atacar()
def cambiarPersonaje(self, unPersonajeAux: Personaje):
self.unPersonaje = unPersonajeAux
class Videojuego:
def __init__(self, personajesAux):
self.personajes = personajesAux
def jugar(self):
round = 1
print(f"ROUND {round}: ")
manejadorPersonaje = ContextoPersonaje(self.personajes.pop(0))
manejadorPersonaje.atacar()
for unPersonaje in self.personajes:
round = round + 1
print(f"ROUND {round}: ")
manejadorPersonaje.atacar()
manejadorPersonaje.cambiarPersonaje(unPersonaje)
# Meto en una lista instancias de personajes
unosPersonajes = [Bison(), Ryo(), Bison(), Ken()]
videoJuego = Videojuego(unosPersonajes)
videoJuego.jugar()
# Resultado esperado:
# ROUND 1:
# Soy Mr Bison y tengo un poder de 5
# ROUND 2:
# Soy Mr Bison y tengo un poder de 5
# ROUND 3:
# Soy Ryo y tengo un poder de 6
# ROUND 4:
# Soy Mr Bison y tengo un poder de 5
Principios SOLID:
- Single Responsibility Principle (SRP): Cumplido: Cada clase tiene una única responsabilidad.
- Open/Closed Principle (OCP): Cumplido: Las clases están abiertas para extensión pero cerradas para modificación.
- Liskov Substitution Principle (LSP): Cumplido: Las subclases deben ser sustituibles por sus superclases sin alterar el comportamiento esperado.
- Interface Segregation Principle (ISP): Cumplido: Los clientes no deberían estar obligados a depender de interfaces que no utilizan.
- Dependency Inversion Principle (DIP): Cumplido: Las dependencias deben ser de abstracciones, no de clases concretas.
Práctica
Te invito a ver el resuelto de este parcial por youtube
Recorda si te gusta los videos, te agradeceria si le pones un comentario o un like para saber si subir mas videos! 😮
Si no sabes que comentar, comenta con: estoy avanzando rapido con el curso de Programacion python 🙂 asi te detectaremos que viniste de aca, para una estadistica si conviene o no subir videos


