Skip to content

Commit

Permalink
Añade UInt
Browse files Browse the repository at this point in the history
  • Loading branch information
autosquash committed Jan 27, 2024
1 parent b88a51e commit 3dc0485
Show file tree
Hide file tree
Showing 20 changed files with 180 additions and 57 deletions.
5 changes: 5 additions & 0 deletions dev/estructura.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,11 @@
- modelo/encargos.h
- modelo/dominio.h
- shared/log_init.h
- shared/types.h
- templates/helpers.h

- modelo/encargos.h:
- shared/types.h
- tiempo.h

- modelo/modelo.cpp:
Expand All @@ -77,6 +79,7 @@
- modelo/modelo.h:
- modelo/dominio.h
- modelo/modelo_shared.h
- shared/types.h

- modelo/modelo_interno.cpp:
- modelo/modelo_interno.h
Expand Down Expand Up @@ -144,6 +147,7 @@
- globales.h
- manejo_rutas.h
- paths.h
- shared/log_init.h
- vista/cadenas.h
- vista/vista_data.h

Expand Down Expand Up @@ -420,6 +424,7 @@

- vista/grid.cpp:
- vista/grid.h
- shared/types.h

- vista/paneles.cpp:
- vista/paneles.h
Expand Down
41 changes: 32 additions & 9 deletions src/datos_niveles.cpp
Original file line number Diff line number Diff line change
@@ -1,59 +1,82 @@
#include "datos_niveles.h"
#include "setup_juego.h"
#include "textos.h"
#include <iostream>

using dominio::TipoPizza;
using modelo::Pedidos;

Pedido crear_pedido(std::map<TipoPizza, int> data) {
std::map<TipoPizza, PedidoTipoPizza> contenido;
for (const auto &par : data) {
try {
// Intenta convertir y asignar el valor
const UInt value = UInt(par.second);
contenido[par.first] = PedidoTipoPizza(value.to_int());
} catch (const std::exception &e) {
std::cerr << "Error en la conversión: " << e.what()
<< " para la pizza " << static_cast<int>(par.first)
<< '\n';
}
}
return Pedido(contenido);
}

const DatosNivel datos_niveles[] = {
// TODO: adaptar texto instrucciones al nivel correspondiente
DatosNivel{
INSTRUCCIONES_NIVEL_DINAMICO, //
Pedidos{{
Pedido({{TipoPizza::Margarita, 2}, {TipoPizza::Pepperoni, 1}}),
crear_pedido({{TipoPizza::Margarita, 2}, {TipoPizza::Pepperoni, 1}}
),
}}
},
DatosNivel{
INSTRUCCIONES_NIVEL_DINAMICO, //
Pedidos{{
Pedido({{TipoPizza::Margarita, 3}, {TipoPizza::CuatroQuesos, 1}}),
crear_pedido(
{{TipoPizza::Margarita, 3}, {TipoPizza::CuatroQuesos, 1}}
),
}}
},
DatosNivel{
INSTRUCCIONES_NIVEL_DINAMICO, //
Pedidos{
//
{//
Pedido({{TipoPizza::Margarita, 2}, {TipoPizza::Pepperoni, 1}}),
Pedido({{TipoPizza::Margarita, 1}, {TipoPizza::CuatroQuesos, 1}})
crear_pedido({{TipoPizza::Margarita, 2}, {TipoPizza::Pepperoni, 1}}
),
crear_pedido(
{{TipoPizza::Margarita, 1}, {TipoPizza::CuatroQuesos, 1}}
)
}
}
},
DatosNivel{
INSTRUCCIONES_NIVEL_DINAMICO, //
Pedidos{{
Pedido({{TipoPizza::Margarita, 2}}),
Pedido(
crear_pedido({{TipoPizza::Margarita, 2}}),
crear_pedido(
{{TipoPizza::Margarita, 1},
{TipoPizza::CuatroQuesos, 1},
{TipoPizza::Pepperoni, 1}}
),
Pedido(
crear_pedido(
{{TipoPizza::Margarita, 1},
{TipoPizza::CuatroQuesos, 1},
{TipoPizza::Funghi, 2},
{TipoPizza::Vegetariana, 1},
{TipoPizza::Pepperoni, 1}}
),
Pedido(
crear_pedido(
{{TipoPizza::Margarita, 2}, //
{TipoPizza::Pepperoni, 1}}
),
}}
},
{INSTRUCCIONES_NIVEL_DINAMICO, //
Pedidos{{
Pedido({
crear_pedido({
{TipoPizza::Margarita, 6},
{TipoPizza::Pepperoni, 4},
{TipoPizza::CuatroQuesos, 3},
Expand Down
4 changes: 2 additions & 2 deletions src/modelo/control_pizzas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ void ControlPizzas::procesar_despacho(const dominio::TipoPizza tp) {
}
}

int ControlPizzas::obtener_total_preparadas() const {
int total_preparadas = 0;
UInt ControlPizzas::obtener_total_preparadas() const {
UInt total_preparadas = 0;
for (auto &[_, contador_tp] : contadores) {
total_preparadas += contador_tp.preparadas;
}
Expand Down
2 changes: 1 addition & 1 deletion src/modelo/control_pizzas.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace modelo {
void add_pedidos(Pedidos);
const dominio::TiposDePizza &get_tipos_disponibles() const;
void procesar_despacho(dominio::TipoPizza tp);
int obtener_total_preparadas() const;
UInt obtener_total_preparadas() const;
bool faltan_pedidos_por_cubrir() const;
};
} // namespace modelo
Expand Down
5 changes: 3 additions & 2 deletions src/modelo/encargos.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "encargos.h"
#include "../shared/log_init.h"
#include "../shared/types.h"
#include "../templates/helpers.h"
#include "dominio.h"
#include <cassert>
Expand Down Expand Up @@ -39,8 +40,8 @@ EncargoACocina::EncargoACocina(

// Definicion metodos Encargos

int Encargos::del_tipo(TipoPizza tp) const {
int contador = 0;
UInt Encargos::del_tipo(TipoPizza tp) const {
UInt contador = 0;
for (auto &encargo : _datos) {
if (encargo.tipo == tp) {
contador++;
Expand Down
3 changes: 2 additions & 1 deletion src/modelo/encargos.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "../shared/types.h"
#include "../tiempo.h"
#include <vector>

Expand All @@ -23,7 +24,7 @@ struct Encargos {
std::vector<EncargoACocina> _datos;

public:
int del_tipo(dominio::TipoPizza) const;
UInt del_tipo(dominio::TipoPizza) const;
void anadir(const EncargoACocina);
std::vector<EncargoACocina>::const_iterator begin() const;
std::vector<EncargoACocina>::const_iterator end() const;
Expand Down
13 changes: 7 additions & 6 deletions src/modelo/modelo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@ EstadoPreparacionPizzas::EstadoPreparacionPizzas(

//////// PedidoTipoPizza

PedidoTipoPizza::PedidoTipoPizza(int objetivo) : objetivo(objetivo) {
PedidoTipoPizza::PedidoTipoPizza() {}
PedidoTipoPizza::PedidoTipoPizza(UInt objetivo) : objetivo(objetivo) {
assert(objetivo >= 0);
}
PedidoTipoPizza::PedidoTipoPizza(int servido, int objetivo)
PedidoTipoPizza::PedidoTipoPizza(UInt servido, UInt objetivo)
: servido(servido), objetivo(objetivo) {
assert(objetivo >= 0);
assert(servido >= 0);
Expand All @@ -50,7 +51,7 @@ bool PedidoTipoPizza::cubierto() const {

//////// Pedido

Pedido::Pedido(ContenidoPedido &&contenido) : contenido(std::move(contenido)) {}
Pedido::Pedido(ContenidoPedido contenido) : contenido(contenido) {}

/* Evalua si el pedido esta cubierto */
void Pedido::evaluar() {
Expand Down Expand Up @@ -104,7 +105,7 @@ bool Pedido::intentar_servir(const dominio::TipoPizza tp) {
void evaluar_preparacion(
Encargos &encargos, //
modelo::PizzasAContadores &contadores, //
int preparables, //
const UInt preparables, //
const sf::Time &tiempo_actual //
) {
size_t i = 0;
Expand All @@ -125,14 +126,14 @@ void evaluar_preparacion(
}

// Ordenar y limitar las pizzas que pueden salir
if (pizzas_listas_con_tiempo.size() > preparables) {
if (pizzas_listas_con_tiempo.size() > preparables.to_int()) {
// Ordenamos la lista de manera descendente para que
// las que llevan mas tiempo preparadas salgan antes
std::sort(
pizzas_listas_con_tiempo.begin(), pizzas_listas_con_tiempo.end(),
[](const auto &a, const auto &b) { return a.second > b.second; }
);
pizzas_listas_con_tiempo.resize(preparables);
pizzas_listas_con_tiempo.resize(preparables.to_int());
}

std::unordered_set<size_t> indices_para_pasar;
Expand Down
25 changes: 16 additions & 9 deletions src/modelo/modelo.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "../shared/types.h"
#include "dominio.h"
#include "modelo_shared.h"
#include <cassert>
Expand All @@ -18,9 +19,9 @@ struct Encargos;
* confusion entre preparadas y servidas.
*/
struct Contadores {
int servidas = 0;
UInt servidas = 0;
// Actualmente en el area de preparadas
int preparadas = 0;
UInt preparadas = 0;
};

namespace debug {
Expand All @@ -29,10 +30,14 @@ namespace debug {

/* Parte de un pedido relativa a un tipo de pizza */
struct PedidoTipoPizza {
int servido = 0;
int objetivo = 0;
PedidoTipoPizza(int objetivo);
PedidoTipoPizza(int servido, int objetivo);
UInt servido = 0;
UInt objetivo = 0;

// para usarlo en maps
PedidoTipoPizza();

PedidoTipoPizza(UInt objetivo);
PedidoTipoPizza(UInt servido, UInt objetivo);
bool cubierto() const;
};

Expand All @@ -44,7 +49,7 @@ class Pedido {

public:
ContenidoPedido contenido;
Pedido(ContenidoPedido &&);
Pedido(ContenidoPedido);
void evaluar();
bool incluye(dominio::TipoPizza) const;
/* Devuelve true si acepta el servicio */
Expand All @@ -53,8 +58,10 @@ class Pedido {
};

void evaluar_preparacion(
Encargos &encargos, modelo::PizzasAContadores &contadores, int maximo,
const sf::Time &tiempo_actual
Encargos &, //
modelo::PizzasAContadores &, //
UInt maximo, //
const sf::Time &tiempo_actual //
);

/** Representa el estado de preparacion de las pizzas en un momento concreto */
Expand Down
5 changes: 3 additions & 2 deletions src/modelo/modelo_interno.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ sf::Time ModeloInterno::obtener_tiempo_juego() const {
}

void ModeloInterno::evaluar_preparacion_pizzas() {
int total_preparadas = control_pizzas.obtener_total_preparadas();
int preparables = modelo_info::MAXIMO_PIZZAS_PREPARADAS - total_preparadas;
UInt total_preparadas = control_pizzas.obtener_total_preparadas();
UInt preparables =
modelo_info::MAXIMO_PIZZAS_PREPARADAS - total_preparadas.to_int();
if (preparables > 0) {
const auto tiempo_actual = gestor_tiempo.obtener_tiempo_juego();
evaluar_preparacion(
Expand Down
83 changes: 83 additions & 0 deletions src/shared/types.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#pragma once

#include <cassert>
#include <iostream>
#include <string>

class UInt {
private:
int value;

public:
UInt(int v) : value(v) { assert(value >= 0); }
UInt operator+(UInt other) const { return UInt(value + other.value); }
UInt operator-(UInt other) const {
const int resta = value - other.value;
assert(resta >= 0);
return UInt(resta);
}

// Operador +=
UInt &operator+=(UInt other) {
value += other.value;
return *this;
}

// Incremento prefijo
UInt &operator++() {
++value;
return *this;
}

// Incremento sufijo
UInt operator++(int) {
UInt temp(*this);
++value;
return temp;
}

// Decremento prefijo
UInt &operator--() {
assert(value > 0); // Asegurarse de que el valor nunca sea negativo
--value;
return *this;
}

// Decremento sufijo
UInt operator--(int) {
assert(value > 0); // Asegurarse de que el valor nunca sea negativo
UInt temp(*this);
--value;
return temp;
}

// Mayor que (>)
bool operator>(UInt other) const { return value > other.value; }

// Menor que (<)
bool operator<(UInt other) const { return value < other.value; }

// Menor o igual que (<=)
bool operator<=(UInt other) const { return value <= other.value; }

// Mayor o igual que (>=)
bool operator>=(UInt other) const { return value >= other.value; }

// Distinto (!=)
bool operator!=(UInt other) const { return value != other.value; }

// Igual (==)
bool operator==(UInt other) const { return value == other.value; }

// Conversion a int
int to_int() const { return value; }

// Conversion a string
std::string to_string() const { return std::to_string(value); }

// Sobrecarga del operador << para iostream
friend std::ostream &operator<<(std::ostream &os, const UInt &u) {
os << u.value;
return os;
}
};
2 changes: 1 addition & 1 deletion src/tests/presentador/test_activacion_botones.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ ModeloInterno crear_modelo_interno(modelo::Pedidos pedidos) {
ModeloInterno modelo(datos_modelo_interno);
return modelo;
}
Pedidos crear_pedidos_margarita(unsigned int num_pizzas) {
Pedidos crear_pedidos_margarita(UInt num_pizzas) {
return {Pedido({{TipoPizza::Margarita, num_pizzas}})};
}

Expand Down
Loading

0 comments on commit 3dc0485

Please sign in to comment.