0% encontró este documento útil (0 votos)
14 vistas4 páginas

Tarea 2 EDA

El documento describe la implementación de un juego de rompecabezas deslizante de números en C++. Se requiere que el programa genere un tablero de NxN, lo revuelva aleatoriamente y permita al usuario mover los números hasta resolver el rompecabezas. Además, se sugiere el uso de pilas y colas para manejar el historial de movimientos y la funcionalidad de deshacer y rehacer.

Cargado por

chicoclon2
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
14 vistas4 páginas

Tarea 2 EDA

El documento describe la implementación de un juego de rompecabezas deslizante de números en C++. Se requiere que el programa genere un tablero de NxN, lo revuelva aleatoriamente y permita al usuario mover los números hasta resolver el rompecabezas. Además, se sugiere el uso de pilas y colas para manejar el historial de movimientos y la funcionalidad de deshacer y rehacer.

Cargado por

chicoclon2
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Tarea 2

Samuel López Martínez


Elaborar un programa que permita jugar rompecabezas deslizantes de números con las
siguientes especificaciones:

●​ Se inicia solicitando al usuario un entero positivo N, para generar un tablero de NxN.


●​ Generar el tablero inicial resuelto (llenar de arriba a abajo, izquierda a derecha, menor a
mayor, con valores de 1 a ((N*N)-1).
●​ Revolver automáticamente el tablero utilizando (NxN) movimientos aleatorios válidos.
●​ Permitir que el usuario juegue realizando movimientos individuales a partir de indicar la
coordenada del elemento a mover.
●​ Indicar cuando el usuario gane y terminar el juego.
●​ Ofrecer en todo momento al usuario la opción de resolver el juego automáticamente
mostrando paso por paso.
●​ Debe utilizar sus propias implementaciones de pilas y colas para resolver el problema.

Consejos:

●​ Guardar TODOS los movimientos realizados en una pila y resolver utilizando


Backtracking.
●​ Utilizar pilas para la funcionalidad undo/redo.
●​ https://en.wikipedia.org/wiki/Sliding_puzzle
●​ http://mypuzzle.org/sliding

Punto extra

●​ Un punto extra a aquellos que incluyan la funcionalidad de avanzar y retroceder en el


historial de movimientos (Deshacer / Rehacer).
●​ Implementar el tablero en un arreglo unidimensional.

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MAX_N = 100;


int tablero[MAX_N * MAX_N];

void inicilizar_tablero (int n){


​ int temp = n*n;
​ srand(time(0));

​ for (int i = 0; i < temp - 1; i++) {
tablero[i] = i + 1;

}
tablero[temp - 1] = 0;

​ for (int i = temp - 1; i > 0; i--) {
int j = rand() % (i + 1);
swap(tablero[i], tablero[j]);

void mostrar_tablero(int n){


​ int temp = n*n;
cout << "Tablero:\n";
for (int i = 0; i < temp; i++) {
if (tablero[i] == 0)
cout << " ";
else
cout << (tablero[i] < 10 ? " " : "") << tablero[i] << " ";

if ((i + 1) % n == 0) cout << endl;


}
}

int ubicar_vacio(int n){


​ int temp = n*n;
​ for (int i = 0; i <= temp - 1;i++){
​ ​ if(tablero[i] == 0){
​ ​ ​ return (i);
​ ​ }
​ ​
​ }
}

void mover_arriba(int n, int v){


​ int nuevaposicion = v - n;
​ if (nuevaposicion >= 0){
​ ​ swap(tablero[v], tablero[nuevaposicion]);
​ }

void mover_abajo(int n, int v){


​ int temp = n*n;
​ int nuevaposicion = v + n;
​ if (nuevaposicion < temp){
​ ​ swap(tablero[v], tablero[nuevaposicion]);
​ }

}

void mover_izquierda(int n, int v){


​ int nuevaposicion = v - 1;
​ if (v % n != 0){
​ ​ swap(tablero[v], tablero[nuevaposicion]);
​ }

}

void mover_derecha(int n, int v){


​ int nuevaposicion = v + 1;
​ if (nuevaposicion % n != 0){
​ ​ swap(tablero[v], tablero[nuevaposicion]);
​ }

}

bool tablero_resuelto(int n) {
int total = n * n;
for (int i = 0; i < total - 1; i++) {
if (tablero[i] != i + 1) {
return false;
}
}
return tablero[total - 1] == 0;
}

void jugar(int n){


​ int f = 1;
​ inicilizar_tablero (n);
​ do{
​ ​ system("cls");
​ ​ mostrar_tablero(n);
​ ​ char entrada;
​ ​ int v = ubicar_vacio(n);
​ ​ cin >> entrada;
​ ​ switch(entrada){
​ ​ ​ case 'w': mover_arriba(n, v); break;
​ ​ ​ case 's': mover_abajo(n, v); break;
​ ​ ​ case 'a': mover_izquierda(n, v); break;
​ ​ ​ case 'd': mover_derecha(n, v); break;
​ ​ ​ default: break;
​ ​ }
​ ​
​ }while(!tablero_resuelto(n));
​ cout<<"\nYou Win!!";
}

int main() {
int n = 3;
​ cout<<"Bienvenido, porfavor ingrese la dimension del puzzle que desea reoslver (n*n): ";
​ cin>>n;
jugar(n);
}

También podría gustarte