El siguiente programa simula el juego del puzzle 8, el cual consiste en una matriz de 3x3 con los números del 1 al 8 los cuales deben ordenar moviendo los números con las teclas w,a,s,d en un máximo de 40 movimientos. El programa se divide en 2 archivos, el main (puzzle.c) y el header (puzzle.h) que contendrá todas las funciones.
/*
Puzzle.
[1][2][3]
[4][5][6]
[7][8][ ]
w Arriba.
a Izquierda.
s Abajo.
d Derecha
*/
Puzzle.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "puzzle.h"
int main(){
int c = 40, fila, col;
char m;
puzzle p;
generarPuzzle(p);
do{
system("cls");
fila = encuentaFila(p);
col = encuentaCol(p);
imprime(p);
printf("Movimientos restantes: %d\n", c);
c--;
if(win(p)){
printf("\nYOU WON!\n");
break;
}else{
printf("Movimiento: ");
m = getchar();
getchar();
mover(p, fila, col, m);
}
}while(c != 0);
if(c == 0) printf("\nYOU LOSE!\n");
system("PAUSE");
}
Puzzle.h
#define F 3
#define C 3
typedef int puzzle[F][C];
bool verificar(puzzle p, int n){
for(int f = 0; f < F; f++){
for(int c = 0; c < C; c++){
if(n == p[f][c]) return false;
}
}
return true;
}
void generarPuzzle(puzzle p){
int n;
for(int f = 0; f < F; f++){
for(int c = 0; c < C; c++){
srand(time(0));
n = rand()%9;
while(!verificar(p, n)){
n = rand()%9;
}
p[f][c] = n;
}
}
}
void imprime(puzzle p){
for(int f = 0; f < F; f++){
for(int c = 0; c < C; c++){
if(p[f][c] != 0){
printf("[%2d]", p[f][c]);
}else{
printf("[ ]");
}
}
printf("\n");
}
}
void mover(puzzle p, int f, int c, char m){
switch(m){
case 'w': //up
if(f != F-1){
p[f][c] = p[f+1][c];
p[f+1][c] = 0;
}else{
printf("ERROR!\n");
getchar();
}
break;
case 'a': //left
if(c != C-1){
p[f][c] = p[f][c+1];
p[f][c+1] = 0;
}else{
printf("ERROR!\n");
getchar();
}
break;
case 's': //down
if(f != 0){
p[f][c] = p[f-1][c];
p[f-1][c] = 0;
}else{
printf("ERROR!\n");
getchar();
}
break;
case 'd': //right
if(c != 0){
p[f][c] = p[f][c-1];
p[f][c-1] = 0;
}else{
printf("ERROR!\n");
getchar();
}
break;
default:
printf("ERROR!! ERROR!!\n");
getchar();
break;
}
}
int encuentaFila(puzzle p){
int fila;
for(int f = 0; f < F; f++){
for(int c = 0; c < C; c++){
if(p[f][c] == 0){
fila = f;
}
}
}
return fila;
}
int encuentaCol(puzzle p){
int col;
for(int f = 0; f < F; f++){
for(int c = 0; c < C; c++){
if(p[f][c] == 0){
col = c;
}
}
}
return col;
}
bool win(puzzle p){
int w[9] = {1,2,3,4,5,6,7,8,0};
if(p[0][0] == w[0] && p[0][1] == w[1] && p[0][2] == w[2] && p[1][0] == w[3] && p[1][1] == w[4] && p[1][2] == w[5] && p[2][0] == w[6] && p[2][1] == w[7] && p[2][2] == w[8]){
return true;
}
return false;
}