Arreglos Fijos en C++: El Inventario de 9 Espacios
Aprende cómo funcionan los arreglos estáticos tradicionales en C++ construyendo el sistema de gestión de la barra de acceso rápido (Hotbar) de Minecraft. Comprenderás la diferencia crucial entre capacidad máxima y cantidad ocupada, el paso de parámetros por referencia con &, y cómo implementar operaciones de agregar, mostrar, modificar y eliminar elementos desplazando memoria manualmente.
1. Primera Versión: El Inventario de 9 Casillas
En Minecraft, la barra de acceso rápido del jugador tiene exactamente 9 casillas fijas numeradas internamente desde la posición 0 hasta la posición 8. Cada casilla almacena el nombre de un objeto en forma de texto (string).
string inventario[9] = { "Espada", "Pico", "Hacha", "Pan", "Madera", "Piedra", "Diamante", "Antorcha", "Arco" };Para recorrer y mostrar todos los elementos en consola utilizamos un bucle for que comienza en el índice 0 y avanza hasta 8 (es decir, mientras i < 9):
2. Modificar un Elemento por Posición
Para cambiar un objeto de la casilla usamos el operador de acceso por corchetes inventario[posicion]. Al conocer el índice exacto, C++ accede y modifica la memoria en tiempo constante $O(1)$:
Ejemplo de ejecución en consola:
Que posicion desea modificar (0-8): 3 Nuevo objeto: Manzana
El inventario ahora queda: Espada | Pico | Hacha | Manzana | Madera | Piedra | Diamante | Antorcha | Arco.
3. El Concepto Central: Capacidad vs. Cantidad Actual
En un videojuego real, el jugador rara vez comienza con el inventario lleno. Supongamos que al iniciar la partida solo tiene 6 objetos.
⚠️ Las Dos Variables Tienen Responsabilidades Distintas
El arreglo por sí mismo no sabe cuántos elementos estamos usando conceptualmente. Por eso, siempre que trabajamos con arreglos fijos necesitamos dos datos complementarios:
string inventario[9];Representa la CAPACIDAD MÁXIMA disponible (9 casillas físicas en memoria).
int cantidadInventario = 6;Representa la CANTIDAD ACTUAL de objetos almacenados (slots ocupados).
Estado del Inventario:
Capacidad máxima: 9 casillas
Cantidad ocupada: 6 objetos (índices 0 al 5)
Espacios libres: 3 casillas disponibles (índices 6, 7 y 8)
Gracias a cantidadInventario = 6, cuando queramos mostrar el inventario en pantalla, el bucle solo debe iterar hasta cantidadInventario:
4. Funciones y Paso por Referencia con &
Para que nuestro código sea limpio y reutilizable, trasladamos la lógica a funciones independientes.
A. Función para Mostrar el Inventario
Esta función solo lee los datos sin modificar el contador de cantidad:
B. Función para Agregar: ¿Por qué int& cantidadInventario lleva &?
Cuando el jugador recoge un nuevo objeto (ej. "Diamante"), la siguiente casilla libre está en el índice cantidadInventario. Al guardarlo, debemos incrementar cantidadInventario++ para que el programa recuerde que ahora tiene 7 objetos.
🚨 Explicación de Memoria: ¿Qué pasa con y sin &?
La función recibe una copia aislada de cantidadInventario. Dentro de la función la copia aumenta a 7, pero al salir de la función esa copia se destruye. En el main el valor sigue siendo 6. ¡El nuevo objeto se perderá en la siguiente inserción!
El símbolo & le indica a C++ que trabaje directamente sobre la variable original del main. Cuando la función hace cantidadInventario++, modifica la memoria real de main, pasando de 6 a 7 permanentemente.
5. Operaciones CRUD con Arreglos Fijos
Un sistema CRUD cubre las 4 operaciones esenciales: Create (Crear/Agregar), Read (Leer/Mostrar), Update (Actualizar/Modificar) y Delete (Eliminar).
Update: Modificar Objeto
Verificamos que la posición ingresada sea válida (entre 0 y cantidadInventario - 1) y sobrescribimos el valor.
Delete: Eliminar con Desplazamiento Manual (Shift Left)
Si eliminamos el elemento en la posición 1 ("Pico"), no podemos dejar un hueco vacío en el medio. Debemos mover todos los elementos de la derecha una posición hacia la izquierda y luego decrementar cantidadInventario--:
Mover: inventario[1] = inventario[2] // Madera pasa a la pos 1
inventario[2] = inventario[3] // Pan pasa a la pos 2
Despues:[Espada(0)] [Madera(1)] [Pan(2)] (cantidad = 3)
Search: Buscar Objeto (Retorno int)
Distinción pedagógica clave: las funciones void ejecutan una acción, mientras que una función de tipo int calcula y retorna un resultado (el índice encontrado o -1 si no existe).
6. Programa Completo: Menú Interactivo del Inventario
A continuación tienes el programa completo listo para copiar, compilar y ejecutar en tu entorno (Visual Studio, Code::Blocks, CLion o terminal con g++):
El Gran Dilema: ¿Por qué los Arreglos Fijos se Quedan Cortos?
Como acabas de ver, trabajar con arreglos tradicionales nos obligó a:
- 1.Tener un límite estricto de 9 posiciones. Si el jugador encuentra un cofre o mochila, el arreglo no puede crecer.
- 2.Administrar manualmente dos variables por separado (
inventario[9]ycantidadInventario). - 3.Escribir bucles complejos para desplazar elementos uno a uno cada vez que borramos un ítem.
¿No sería genial si C++ pudiera encargarse automáticamente del tamaño, inserción y borrado de elementos sin límites fijos?


