Isaac Andrés

Desarrollador Web / PHP CodeIgniter

Puzzle 8 en C

24 Sep 2017 » C

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;
}