# ============================================================ # VARIABLES GLOBALES # ============================================================ aldeano: Sprite = None granja: Sprite = None casa: Sprite = None restaurante: Sprite = None enemigo_sprite: Sprite = None contador_dia = 0 enemigo_presente = False es_dia = True # ============================================================ # POSICIONES # ============================================================ CASA_X = 20 CASA_Y = 100 GRANJA_X = 140 GRANJA_Y = 100 RESTAURANTE_X = 80 RESTAURANTE_Y = 30 ESQUELETO_X = 80 ESQUELETO_Y = 60 # ============================================================ # CONFIGURACIÓN # ============================================================ VELOCIDAD = 50 DURACION_DIA = 300 # ============================================================ # ESTADO DE LA FSM # ============================================================ estado = "EN_CASA" # ============================================================ # ACTUALIZAR CIELO # ============================================================ def actualizar_cielo(): if estado == "EN_RESTAURANTE": scene.set_background_color(5) elif es_dia: scene.set_background_color(9) else: scene.set_background_color(12) # ============================================================ # TRANSICIONES DE LA FSM # ============================================================ def transicion_fsm(): global estado # -------------------------------------------------------- # EL ESQUELETO TIENE PRIORIDAD # -------------------------------------------------------- if enemigo_presente: if aldeano.x != CASA_X or aldeano.y != CASA_Y: estado = "REGRESANDO_A_CASA" else: estado = "EN_CASA" return # -------------------------------------------------------- # EN CASA # -------------------------------------------------------- if estado == "EN_CASA": if es_dia: estado = "IR_A_GRANJA" # -------------------------------------------------------- # IR A LA GRANJA # -------------------------------------------------------- elif estado == "IR_A_GRANJA": if not es_dia: estado = "REGRESANDO_A_CASA" elif aldeano.x >= GRANJA_X: aldeano.set_position( GRANJA_X, GRANJA_Y ) estado = "TRABAJANDO" # -------------------------------------------------------- # TRABAJANDO # -------------------------------------------------------- elif estado == "TRABAJANDO": if not es_dia: estado = "REGRESANDO_A_CASA" else: estado = "IR_A_RESTAURANTE" # -------------------------------------------------------- # IR AL RESTAURANTE # -------------------------------------------------------- elif estado == "IR_A_RESTAURANTE": if not es_dia: estado = "REGRESANDO_A_CASA" elif (abs(aldeano.x - RESTAURANTE_X) <= VELOCIDAD and abs(aldeano.y - RESTAURANTE_Y) <= VELOCIDAD): aldeano.set_position( RESTAURANTE_X, RESTAURANTE_Y ) estado = "EN_RESTAURANTE" # -------------------------------------------------------- # EN EL RESTAURANTE # -------------------------------------------------------- elif estado == "EN_RESTAURANTE": if not es_dia: estado = "REGRESANDO_A_CASA" # -------------------------------------------------------- # REGRESANDO A CASA # -------------------------------------------------------- elif estado == "REGRESANDO_A_CASA": if (abs(aldeano.x - CASA_X) <= VELOCIDAD and abs(aldeano.y - CASA_Y) <= VELOCIDAD): aldeano.set_position( CASA_X, CASA_Y ) estado = "EN_CASA" # ============================================================ # ACCIONES DE LA FSM # ============================================================ def accion_fsm(): # -------------------------------------------------------- # EN CASA # -------------------------------------------------------- if estado == "EN_CASA": aldeano.vx = 0 aldeano.vy = 0 # -------------------------------------------------------- # IR A LA GRANJA # -------------------------------------------------------- elif estado == "IR_A_GRANJA": aldeano.vx = VELOCIDAD aldeano.vy = 0 # -------------------------------------------------------- # TRABAJANDO # -------------------------------------------------------- elif estado == "TRABAJANDO": aldeano.vx = 0 aldeano.vy = 0 # -------------------------------------------------------- # IR AL RESTAURANTE # -------------------------------------------------------- elif estado == "IR_A_RESTAURANTE": if aldeano.x < RESTAURANTE_X: aldeano.vx = VELOCIDAD elif aldeano.x > RESTAURANTE_X: aldeano.vx = -VELOCIDAD else: aldeano.vx = 0 if aldeano.y > RESTAURANTE_Y: aldeano.vy = -VELOCIDAD elif aldeano.y < RESTAURANTE_Y: aldeano.vy = VELOCIDAD else: aldeano.vy = 0 # -------------------------------------------------------- # EN EL RESTAURANTE # -------------------------------------------------------- elif estado == "EN_RESTAURANTE": aldeano.vx = 0 aldeano.vy = 0 # Cielo amarillo scene.set_background_color(5) # -------------------------------------------------------- # REGRESANDO A CASA # -------------------------------------------------------- elif estado == "REGRESANDO_A_CASA": if aldeano.x > CASA_X: aldeano.vx = -VELOCIDAD elif aldeano.x < CASA_X: aldeano.vx = VELOCIDAD else: aldeano.vx = 0 if aldeano.y > CASA_Y: aldeano.vy = -VELOCIDAD elif aldeano.y < CASA_Y: aldeano.vy = VELOCIDAD else: aldeano.vy = 0 # ============================================================ # CICLO DÍA / NOCHE # ============================================================ def actualizar_ciclo_dia(): global contador_dia global es_dia contador_dia += 1 if contador_dia >= DURACION_DIA: contador_dia = 0 es_dia = not es_dia actualizar_cielo() # ============================================================ # CREAR ESQUELETO # ============================================================ def colocar_enemigo(): global enemigo_sprite global enemigo_presente if not enemigo_presente: enemigo_sprite = sprites.create( assets.image(""" enemy """), SpriteKind.enemy ) enemigo_sprite.set_position( ESQUELETO_X, ESQUELETO_Y ) enemigo_presente = True # ============================================================ # ELIMINAR ESQUELETO # ============================================================ def eliminar_enemigo(): global enemigo_sprite global enemigo_presente if enemigo_presente: enemigo_sprite.destroy() enemigo_sprite = None enemigo_presente = False actualizar_cielo() # ============================================================ # BOTÓN A # ============================================================ def on_a_pressed(): colocar_enemigo() controller.A.on_event( ControllerButtonEvent.PRESSED, on_a_pressed ) # ============================================================ # BOTÓN B # ============================================================ def on_b_pressed(): eliminar_enemigo() controller.B.on_event( ControllerButtonEvent.PRESSED, on_b_pressed ) # ============================================================ # CONFIGURAR JUEGO # ============================================================ def configurar(): global casa global granja global restaurante global aldeano # -------------------------------------------------------- # CASA # -------------------------------------------------------- casa = sprites.create( assets.image(""" house """), SpriteKind.food ) casa.set_position( CASA_X, CASA_Y ) # -------------------------------------------------------- # GRANJA # -------------------------------------------------------- granja = sprites.create( assets.image(""" farm """), SpriteKind.food ) granja.set_position( GRANJA_X, GRANJA_Y ) # -------------------------------------------------------- # RESTAURANTE # -------------------------------------------------------- restaurante = sprites.create( assets.image(""" restaurant """), SpriteKind.food ) restaurante.set_position( RESTAURANTE_X, RESTAURANTE_Y ) # -------------------------------------------------------- # ALDEANO # -------------------------------------------------------- aldeano = sprites.create( assets.image(""" villager """), SpriteKind.player ) aldeano.set_position( CASA_X, CASA_Y ) # -------------------------------------------------------- # DETENER EDIFICIOS # -------------------------------------------------------- casa.vx = 0 casa.vy = 0 granja.vx = 0 granja.vy = 0 restaurante.vx = 0 restaurante.vy = 0 # ============================================================ # INICIO DEL JUEGO # ============================================================ configurar() es_dia = True estado = "EN_CASA" scene.set_background_color(9) # ============================================================ # BUCLE PRINCIPAL # ============================================================ def on_on_update(): actualizar_ciclo_dia() transicion_fsm() accion_fsm() game.on_update(on_on_update)