// Comequesos en C
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// Declaro aqui
// Todos los elementos usados
#define WIDTH 40
#define HEIGHT 20
#define PACMAN 'C'
#define WALL '#'
#define FOOD '.'
#define EMPTY ' '
#define DEMON 'X'

// Declaro las variables globales
// aqui
int res = 0;
int score = 0;
int pacman_x, pacman_y;
char board[HEIGHT][WIDTH];
int food = 0;
int curr = 0;
void initialize()
{
    // Putting Walls as boundary in the Game
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            if (i == 0 || j == WIDTH - 1 || j == 0
                || i == HEIGHT - 1) {
                board[i][j] = WALL;
            }
            else
                board[i][j] = EMPTY;
        }
    }

    // Pone paredes al juego
    int count = 50;
    while (count != 0) {
        int i = (rand() % (HEIGHT + 1));
        int j = (rand() % (WIDTH + 1));

        if (board[i][j] != WALL && board[i][j] != PACMAN) {
            board[i][j] = WALL;
            count--;
        }
    }

    int val = 5;
    while (val--) {
        int row = (rand() % (HEIGHT + 1));
        for (int j = 3; j < WIDTH - 3; j++) {
            if (board[row][j] != WALL
                && board[row][j] != PACMAN) {
                board[row][j] = WALL;
            }
        }
    }

    // Pone demonios en el juego
    count = 10;
    while (count != 0) {
        int i = (rand() % (HEIGHT + 1));
        int j = (rand() % (WIDTH + 1));

        if (board[i][j] != WALL && board[i][j] != PACMAN) {
            board[i][j] = DEMON;
            count--;
        }
    }

    // Cursor en el centro
    pacman_x = WIDTH / 2;
    pacman_y = HEIGHT / 2;
    board[pacman_y][pacman_x] = PACMAN;

    // Points Placed
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            if (i % 2 == 0 && j % 2 == 0
                && board[i][j] != WALL
                && board[i][j] != DEMON
                && board[i][j] != PACMAN) {

                board[i][j] = FOOD;
                food++;
            }
        }
    }
}

void draw()
{
    // Borra pantalla
    system("cls");

    // Dibuja todos los elementos de la pantalla
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf("%c", board[i][j]);
        }
        printf("\n");
    }
    printf("Puntaje: %d\n", score);
}

// Function permite mover el Cursor
void move(int move_x, int move_y)
{
    int x = pacman_x + move_x;
    int y = pacman_y + move_y;

    if (board[y][x] != WALL) {
        if (board[y][x] == FOOD) {
            score++;
            food--;
            curr++;
            if (food == 0) {
                res = 2;
                return;
            }
        }
        else if (board[y][x] == DEMON) {
            res = 1;
        }

        board[pacman_y][pacman_x] = EMPTY;
        pacman_x = x;
        pacman_y = y;
        board[pacman_y][pacman_x] = PACMAN;
    }
}

// Main Function
int main()
{
    initialize();
    char ch;
    food -= 35;
    int totalFood = food;
    // Instructions to Play
    printf(" Usa botnes w(arriba), a(izq) , d(der) y "
           "s(abajo)\nTambien, presiona q para salir\n");

    printf("Ingresa S para continuar: \n");

    ch = getch();
    if (ch != 'S' && ch != 's') {
        printf("Salir del juego! ");
        return 1;
    }

    while (1) {
        draw();
        printf("Total de quesos: %d\n", totalFood);
        printf("Total de quesos comidos: %d\n", curr);
        if (res == 1) {
            // Clear screen
            system("cls");
            printf("Game Over! Te mato un demonio\n Tu puntaje: "
                   "%d\n",
                   score);
            return 1;
        }

        if (res == 2) {
            // borra pantalla
            system("cls");
            printf("Ganaste! \n Tu puntaje: %d\n", score);
            return 1;
        }

        // toma entrada del usuario
        ch = getch();

        // Se mueve de acuerdo
        // ia la entrada del personaje
        switch (ch) {
        case 'w':
            move(0, -1);
            break;
        case 's':
            move(0, 1);
            break;
        case 'a':
            move(-1, 0);
            break;
        case 'd':
            move(1, 0);
            break;
        case 'q':
            printf("Recontra Game Over! Tu puntaje: %d\n", score);
            return 0;
        }
    }

    return 0;
}