Abril 22, 2018, 04:40:43 am

Autor Tema: Juego Lights Out hecho en Winapi C  (Leído 1693 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nano20sm

  • Me das tu password?
  • **
  • Mensajes: 283
  • Sexo: Masculino
  • Solo C que nada C
    • Ver Perfil
Juego Lights Out hecho en Winapi C
« en: Diciembre 14, 2013, 11:05:55 pm »
Estimados foruvidentes:

Acá les dejo un juego electrónico llamado Light Outs. En cualquier parte del mundo de internet, podrán encontrar las reglas de dicho juego.

Este juego lo hice para la asignatura de POHw.


Les dejo una breve idea de como es el juego en si con un gif. Como podrán darse cuenta, aparece un menuitem que dice SOLVE, esta sirve para resolver el puzzle mediante el álgebra lineal. You are not allowed to view links. Register or Login podrán encontrar el algoritmo para poder entender la implementación.

You are not allowed to view links. Register or Login

main.c

Código: You are not allowed to view links. Register or Login
#include <windows.h>
#include <stdio.h>
#include "Lights_Out.h"
#include <string.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DialogoI (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);

/* Declaraciones de tipos */
typedef struct stDatos {
   char Item[20];
}DATOS;


/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc; /* A properties struct of our window */
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
MSG Msg; /* A temporary location for all messages */

/* zero out the struct and set the stuff we want to modify */
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);

/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}

hwnd = CreateWindowEx (
        WS_EX_CLIENTEDGE,"WindowClass",
        "Ligths Out",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, /* x */
CW_USEDEFAULT, /* y */
ANCHO, /* width */
ALTO, /* height */
NULL,LoadMenu(hInstance, "Menu"),
        hInstance,NULL
    );

if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}

    UpdateWindow(hwnd);
/*
This is the heart of our program where all input is processed and
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
this loop will not produre unreasonably CPU usage
*/
while(GetMessage(&Msg, NULL, 0, 0) == TRUE) { /* If no error is received... */
TranslateMessage(&Msg); /* Translate keycodes to chars if present */
DispatchMessage(&Msg); /* Send it to WndProc */
}

return Msg.wParam;
}

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    static Coords __coords[5][5];
    static int minutos, contadorJugadas, activar, tablero[5][5];
    int i, j, salir;
    static char str[100], str1[100], str2[100];
    static int b[N], x[N], A[N][N], Ampliada[N][N+1], Mx[5][5];//Mx matriz solucion
    static DATOS Datos; //para el listBox
    HDC hdc;
    PAINTSTRUCT ps;
    static HBRUSH pincel[2];
    HPEN pen[2];
    static POINTS punto;
    POINT lpunto;
    RECT re;
    MINMAXINFO *MMI;

    srand ((unsigned)time(NULL));

switch(Message) {
       
case WM_CREATE: {
           /* Inicialización de los datos de la aplicación */
            strcpy(Datos.Item , "7 minutos");
           
    llenar_coords (__coords);
    contadorJugadas = activar = FALSE;
    memset (str, 0, 100);
           
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5; j++)
            __coords[i][j].status = 0;
           
    pincel[0] = CreateSolidBrush(RGB(0, 255, 0));//verde
    pincel[1] = CreateSolidBrush(RGB(255, 255, 220));//color crema

        }

        case WM_TIMER: {
            switch(wParam)
            {
                case TM_TIMER: {
                    //Beep(200, 20); // just tick every time the WM_TIMER message is passed
                    MessageBeep(1);
                    MessageBox (hwnd, "JA! eres un maldito perdedor! xd", "LOSER", MB_OK);
                    activar = FALSE;
                    break;
                }
            }
            break;
        }
        //indica las dimensiones maximas y minimas de la ventana
        case WM_GETMINMAXINFO:
        {
            MMI = (MINMAXINFO *)lParam;
            MMI->ptMinTrackSize.x = ANCHO;
            MMI->ptMinTrackSize.y = ALTO;
            MMI->ptMaxTrackSize.x = ANCHO;
            MMI->ptMaxTrackSize.y = ALTO;
        }
       
        case WM_SYSCOMMAND: {
            switch(LOWORD(wParam))
            {
                case SC_CLOSE: {
                    SendMessage (hwnd, WM_DESTROY, 0, 0);
                    break;
                }
               
                default:
                    return DefWindowProc (hwnd, Message, wParam, lParam);
            }
            break;
        }
       
        case WM_LBUTTONDOWN: {
            int fil, col;

            fil = col = 0;

            hdc = GetDC (hwnd);
            punto = MAKEPOINTS(lParam);
            POINTSTOPOINT(lpunto, punto);
           
            if (activar == FALSE)
                break;
           
            if (punto.x >= 0 && punto.y >= 0)
            {
                if (cursor_to_tablero(lpunto))
                {
                    buscarIndicesToTablero (__coords, lpunto, &fil, &col);
                    modificar_tablero (tablero, fil, col);
                    intcpy (__coords, tablero);//update
                    if (SoyGanador (tablero) == FALSE )
                        contadorJugadas++;
                    else
                        activar = WINNER;
                }
            }
            // Repaint the window after the update
InvalidateRect(hwnd, 0, TRUE);
ReleaseDC(hwnd,hdc);
        }
       
case WM_PAINT: {
    InvalidateRect(hwnd, 0, FALSE);
    hdc = BeginPaint(hwnd, &ps);
    GetClientRect(hwnd, &re);
           
    pen[0] = CreatePen(PS_SOLID, 5, RGB(0,0,0));//negro
            pen[1] = CreatePen(PS_DASH, 0, RGB(0,240,0));
           
            trazarTablero (hwnd, hdc, pincel[1], pen[0]);
           
            if (activar == TRUE)
            {
                memset (str, 0, 100);//limpia la cadena con ceros
                sprintf (str, "jugadas: %d", contadorJugadas);
        TextOut(hdc, 550, 25, str, strlen(str));
        memset (str, 0, 100);//limpia la cadena con ceros
       
                for (i = 0; i < 5; i++)
                {
                    for (j = 0; j < 5; j++)
                    {
                        if (__coords[i][j].status == 1)
                            SelectObject(hdc, pincel[0]);//verde
                        else
                            SelectObject(hdc, pincel[1]);//semitransparente

                        Rectangle (
                            hdc, __coords[i][j].sup_iz.x, __coords[i][j].sup_iz.y,
                            __coords[i][j].inf_der.x, __coords[i][j].inf_der.y
                        );
                    }
                }
            }
            else
            {
                if (activar == WINNER)
                {
                    memset (str, 0, 100);
                    sprintf (str, "Congratulations! ha sido ganador\nHa hecho %d Jugadas", contadorJugadas);
                    MessageBox (hwnd, str, "Winner", MB_OK);
                    activar = FALSE;
                    KillTimer (hwnd, TM_TIMER);//elimino el temporizador
                }
    }
           
            ReleaseDC(hwnd,hdc);
    DeleteObject(pen[0]);
    DeleteObject(pen[1]);
    EndPaint(hwnd, &ps);
    break;
        }

        case WM_COMMAND: {
            switch(LOWORD(wParam)) {
               
                case CM_SOLVE: {
                    //MessageBox (hwnd, "wena", "msg", MB_OK);
                    if (activar == FALSE)
                        break;
                   
                    update_tablero (__coords, tablero);
                   
                    configInicial_to_b(tablero, b);
                    crearA (A);
                    CrearMatrizAmpliada (Ampliada, A, b);
                    triangularInferior (Ampliada);
                    triangularSuperior (Ampliada);
                    Ampliada_to_x (Ampliada, x);//x es la solucion
                    x_to_MatrizSolucion (x, Mx);
                   
                    memset (str1, 0, 100);
                    memset (str2, 0, 100);
                   
                    for (i = 0; i < N/5; i++)
                    {
                        for (j = 0; j < N/5; j++)
                        {
                            sprintf (str1, "%d  ", Mx[i][j]);
                            strcat (str2, str1);
                        }
                        sprintf (str1, "\n");
                        strcat (str2, str1);
                    }
                   
                    MessageBox (NULL, str2, "Solucion", MB_OK|MB_APPLMODAL);
                    break;
                }
               
                case CM_DIALOGO: {// DIALOGO para listBox
                    DialogBoxParam(0, "DialogoDefinirTiempo", hwnd, DlgProc, (LPARAM)&Datos);
                    break;
                }

                case CM_NUEVO: {//nueva jugada
                    minutos = atoi (Datos.Item);
                    minutos *= 60000;//los convierte a minutos
                    SetTimer (hwnd, TM_TIMER, (UINT)minutos, NULL);
                   
                    for (i = 0; i < 5; i++)
                for (j = 0; j < 5; j++)
                    __coords[i][j].status = tablero[i][j] = 0;
                   
                    do
                    {
                        crear_config_inicial (tablero);
                      //  MessageBox (hwnd, "dentro buncle", "configuracion inicial", MB_OK);
                    }while(verificarPatron (tablero) == FALSE);
                   
            //MessageBox (hwnd, "fuera buncle", "configuracion inicial", MB_OK);
            intcpy (__coords, tablero);//copia el estado del tablero a la estructura
                    activar = TRUE;//activa la config inicial
                    contadorJugadas = 0;
                    InvalidateRect(hwnd, 0, TRUE);
                    break;
                }
               
                case CM_INSTRUC: {
                    DialogBox (0, "DialogoInstr", hwnd, DialogoI);
                    break;
                }
               
                case CM_SALIR: {
                    //envia un mensaje a WM_DESTROY para finalizar la aplicacion
                    SendMessage (hwnd, WM_DESTROY, 0, 0);
                   
                    break;
                }
               
                default:
        return DefWindowProc(hwnd, Message, wParam, lParam);
            }
            break;
        }

/* trap the WM_CLOSE (clicking X) message, and actually tell the window to close */
case WM_CLOSE: {
DestroyWindow(hwnd);
break;
}

/* Upon destruction, tell the main thread to stop */
case WM_DESTROY: {
    salir = MessageBox(hwnd, "¿Está seguro que desea salir del juego?", "Lights Outs", MB_OKCANCEL);
                   
            if (salir == IDOK)
            {
                DeleteObject(pincel[0]);
                DeleteObject(pincel[1]);
                PostQuitMessage(0);    /* envía un mensaje WM_QUIT a la cola de mensajes */
            }
           
break;
}

/* All other messages (a lot of them) are processed using default procedures */
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}

BOOL CALLBACK DialogoI (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_INITDIALOG: {
            SetFocus(GetDlgItem(hDlg, IDOK));
            return FALSE;
        }
       
        case WM_COMMAND:
           EndDialog(hDlg, FALSE);
           return TRUE;
    }
    return FALSE;
}

BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    UINT indice;
    static DATOS *Datos;


    switch (msg)                  /* manipulador del mensaje */
    {
        case WM_INITDIALOG: {
           Datos = (DATOS *)lParam;
           // Añadir cadenas. Mensaje: LB_ADDSTRING
           SendDlgItemMessage(hDlg, ID_LISTA, LB_ADDSTRING, 0, (LPARAM)"3 minutos");
           SendDlgItemMessage(hDlg, ID_LISTA, LB_ADDSTRING, 0, (LPARAM)"5 minutos");
           SendDlgItemMessage(hDlg, ID_LISTA, LB_ADDSTRING, 0, (LPARAM)"7 minutos");
           
           SendDlgItemMessage(hDlg, ID_LISTA, LB_SELECTSTRING, (UINT)-1, (LPARAM)Datos->Item);
           SetFocus(GetDlgItem(hDlg, IDOK));
           return FALSE;
        }
       
        case WM_COMMAND: {
           switch(LOWORD(wParam)) {
              case IDOK:
                 indice = SendDlgItemMessage(hDlg, ID_LISTA, LB_GETCURSEL, 0, 0);
                 SendDlgItemMessage(hDlg, ID_LISTA, LB_GETTEXT, indice, (LPARAM)Datos->Item);
                 EndDialog(hDlg, FALSE);
                 break;
              case IDCANCEL:
                 EndDialog(hDlg, FALSE);
                 break;
           }
           return TRUE;
       }
    }
    return FALSE;
}


Lights_Out.h

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include "solve.h"


#define MAX        100
#define FALSE      0
#define TRUE       1
#define WINNER     2
#define CM_NUEVO   100
#define CM_SALIR   103
#define CM_INSTRUC 104
#define CM_SOLVE   105
#define TM_TIMER   106
#define ANCHO      670
#define ALTO       620
#define CC_XLI     3
#define ID_LISTA   110 /* Identificadores de diálogo */
#define CM_DIALOGO 111

struct _coords
{
    int status;
    POINTS sup_iz;
    POINTS sup_der;
    POINTS inf_iz;
    POINTS inf_der;
};

typedef struct _coords Coords;

int patrones (int patron[5][5], int tablero[5][5]);
int verificarPatron (int tablero[5][5]);
void ver_tablero (int tablero[5][5]);
void crear_config_inicial (int tablero[5][5]);
int cambiar_estados (int tablero[5][5], int fil, int col);
int modificar_tablero (int tablero[5][5], int fil, int col);
int SoyGanador (int tablero[5][5]);
void llenar_coords (Coords coord[5][5]);
void trazarTablero (HWND hwnd, HDC hdc, HBRUSH pincel, HPEN pen);
void llenar_coords (Coords coord[5][5]);
void intcpy (Coords coords[5][5], int tablero[5][5]);;
void buscarIndicesToTablero (Coords coords[5][5], POINT punto, int *fil, int *col);
BOOL cursor_to_tablero (POINT coords);
void print_tableroWnd(HWND hwnd, int tablero[5][5]);
void print_tableroWnd2(HWND hwnd, Coords coords[5][5]);
void update_tablero (Coords coord[5][5], int tablero[5][5]);

Lights_Out.c

Código: You are not allowed to view links. Register or Login
#include "Lights_Out.h"

int SoyGanador (int tablero[5][5])
{
    int i, j;
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            //si hay almenos un solo uno, significa que no he ganado
            if (tablero[i][j] == 1)
                return FALSE;
        }
    }
   
    return TRUE;
}

int modificar_tablero (int tablero[5][5], int fil, int col)
{
    int status;
   
    if ((status = cambiar_estados (tablero, fil, col)) != ERROR)
    {
        cambiar_estados (tablero, fil, (col + 1));
        cambiar_estados (tablero, fil, (col - 1));
        cambiar_estados (tablero, (fil + 1), col);
        cambiar_estados (tablero, (fil - 1), col);
       
        return TRUE;
    }
    else
        return ERROR;
}

//cambia el estado actual y los adyacentes
int cambiar_estados (int tablero[5][5], int fil, int col)
{
    if (fil >= 0 && col >= 0 && fil < 5 && col < 5)
    {
        if (tablero[fil][col] == 1)
            tablero[fil][col] = 0;
        else
            tablero[fil][col] = 1;
       
        return TRUE;
    }
    else
        return ERROR;
}


int patrones (int patron[5][5], int tablero[5][5])
{
    int i, j, contador = 0;
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (patron[i][j] == 1 && tablero[i][j] == 1)
                contador++;
        }
    }
    //es par
    if ((contador % 2) == 0)
        return TRUE;
    else
        return FALSE;//es impar
}

int verificarPatron (int tablero[5][5])
{
    int p1[5][5] = {
        {1, 0, 1, 0, 1},
        {1, 0, 1, 0, 1},
        {0, 0, 0, 0, 0},
        {1, 0, 1, 0, 1},
        {1, 0, 1, 0, 1}
    };
   
    int p2[5][5] = {
        {1, 1, 0, 1, 1},
        {0, 0, 0, 0, 0},
        {1, 1, 0, 1, 1},
        {0, 0, 0, 0, 0},
        {1, 1, 0, 1, 1}
    };
   
    if (patrones(p1, tablero) == TRUE && patrones(p2, tablero) == TRUE)
        return TRUE;
    else
        return FALSE;
}

void ver_tablero (int tablero[5][5])
{
    int i, j;
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
            printf ("%d   ", tablero[i][j]);
       
        printf ("\n\n\n");
    }
   
    return ;
}

void buscarIndicesToTablero (Coords coords[5][5], POINT punto, int *fil, int *col)
{
    int i, j;
    RECT rec;
    //BOOL status;
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            rec.left = coords[i][j].sup_iz.x;
            rec.top = coords[i][j].sup_iz.y;
            rec.right = coords[i][j].inf_der.x;
            rec.bottom = coords[i][j].inf_der.y;
           
            if (PtInRect (&rec, punto))
            {
                *fil = i;
                *col = j;
                return ;
            }
        }
    }
   
    return ;
}


void trazarTablero (HWND hwnd, HDC hdc, HBRUSH pincel, HPEN pen)
{
    int i;
   
    SelectObject(hdc, pincel);
    //FillRect (hdc, &rec, pincel);
    Rectangle (hdc, 25, 25, 525, 525);//tablero completo
    SelectObject(hdc, pen);
    //traza lineas verticales a la ventana padre
    for (i = 25; i <= 525; i+=100 )
    {
        MoveToEx (hdc, i, 25, NULL);
        LineTo(hdc, i, 525);
    }
   
    //traza lineas horizontales a la ventana padre
    for (i = 25; i <= 525; i+=100 )
    {
        MoveToEx (hdc, 25, i, NULL);
        LineTo(hdc, 525, i);
    }
   
    return ;
}

BOOL cursor_to_tablero (POINT coords)
{
    RECT rec;
    BOOL status;
   
    rec.left = 25;
    rec.top = 25;
    rec.right = 525;
    rec.bottom = 525;
   
    status = PtInRect (&rec, coords);
   
    return status;
}

void intcpy (Coords coords[5][5], int tablero[5][5])
{
    int i, j;
   
    for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++)
    coords[i][j].status = tablero[i][j];
   
    return ;
}

void print_tableroWnd(HWND hwnd, int tablero[5][5])
{
    char str[MAX],str2[MAX];
    int i, j;
   
    memset (str, 0, 20);
    memset (str2, 0, 20);
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            sprintf (str,"%d  ", tablero[i][j]);
            strcat (str2, str);
        }
        sprintf (str, "\n");
        strcat (str2, str);
    }
   
    MessageBox (hwnd, str2, "matriz inicial tablero", MB_OK);
   
    return ;
}

void print_tableroWnd2(HWND hwnd, Coords coords[5][5])
{
    char str4[MAX],str3[MAX];
    int i, j;
   
    memset (str3, 0, 20);
    memset (str4, 0, 20);
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            sprintf (str3,"%d  ", coords[i][j].status);
            strcat (str4, str3);
        }
        sprintf (str3, "\n");
        strcat (str4, str3);
    }
   
    MessageBox (hwnd, str4, "matriz Coords", MB_OK);
   
    return ;
}

void update_tablero (Coords coord[5][5], int tablero[5][5])
{
    int i, j;
   
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5; j++)
            tablero[i][j] = coord[i][j].status;
   
    return ;
}

void crear_config_inicial (int tablero[5][5])
{
    int i, j;
    //matriz inicializada
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5; j++)
            tablero[i][j] = rand() % 2;//asignamos un random entre 0 y 1
   
    return ;
}

void llenar_coords (Coords coord[5][5])
{
    //fila 0
    coord[0][0].sup_iz.x = 25;
    coord[0][0].sup_iz.y = 25;
    coord[0][0].sup_der.x = 125;
    coord[0][0].sup_der.y = 25;
    coord[0][0].inf_iz.x = 25;
    coord[0][0].inf_iz.y = 125;
    coord[0][0].inf_der.x = 125;
    coord[0][0].inf_der.y = 125;
   
    coord[0][1].sup_iz.x = 125;
    coord[0][1].sup_iz.y = 25;
    coord[0][1].sup_der.x = 225;
    coord[0][1].sup_der.y = 25;
    coord[0][1].inf_iz.x = 125;
    coord[0][1].inf_iz.y = 125;
    coord[0][1].inf_der.x = 225;
    coord[0][1].inf_der.y = 125;
   
    coord[0][2].sup_iz.x = 225;
    coord[0][2].sup_iz.y = 25;
    coord[0][2].sup_der.x = 325;
    coord[0][2].sup_der.y = 25;
    coord[0][2].inf_iz.x = 225;
    coord[0][2].inf_iz.y = 125;
    coord[0][2].inf_der.x = 325;
    coord[0][2].inf_der.y = 125;
   
    coord[0][3].sup_iz.x = 325;
    coord[0][3].sup_iz.y = 25;
    coord[0][3].sup_der.x = 425;
    coord[0][3].sup_der.y = 25;
    coord[0][3].inf_iz.x = 325;
    coord[0][3].inf_iz.y = 125;
    coord[0][3].inf_der.x = 425;
    coord[0][3].inf_der.y = 125;
   
    coord[0][4].sup_iz.x = 425;
    coord[0][4].sup_iz.y = 25;
    coord[0][4].sup_der.x = 525;
    coord[0][4].sup_der.y = 25;
    coord[0][4].inf_iz.x = 425;
    coord[0][4].inf_iz.y = 125;
    coord[0][4].inf_der.x = 525;
    coord[0][4].inf_der.y = 125;
   
    //fila 1
    coord[1][0].sup_iz.x = 25;
    coord[1][0].sup_iz.y = 125;
    coord[1][0].sup_der.x = 125;
    coord[1][0].sup_der.y = 125;
    coord[1][0].inf_iz.x = 25;
    coord[1][0].inf_iz.y = 225;
    coord[1][0].inf_der.x = 125;
    coord[1][0].inf_der.y = 225;
   
    coord[1][1].sup_iz.x = 125;
    coord[1][1].sup_iz.y = 125;
    coord[1][1].sup_der.x = 225;
    coord[1][1].sup_der.y = 125;
    coord[1][1].inf_iz.x = 125;
    coord[1][1].inf_iz.y = 225;
    coord[1][1].inf_der.x = 225;
    coord[1][1].inf_der.y = 225;
   
    coord[1][2].sup_iz.x = 225;
    coord[1][2].sup_iz.y = 125;
    coord[1][2].sup_der.x = 325;
    coord[1][2].sup_der.y = 125;
    coord[1][2].inf_iz.x = 225;
    coord[1][2].inf_iz.y = 225;
    coord[1][2].inf_der.x = 325;
    coord[1][2].inf_der.y = 225;
   
    coord[1][3].sup_iz.x = 325;
    coord[1][3].sup_iz.y = 125;
    coord[1][3].sup_der.x = 425;
    coord[1][3].sup_der.y = 125;
    coord[1][3].inf_iz.x = 325;
    coord[1][3].inf_iz.y = 225;
    coord[1][3].inf_der.x = 425;
    coord[1][3].inf_der.y = 225;
   
    coord[1][4].sup_iz.x = 425;
    coord[1][4].sup_iz.y = 125;
    coord[1][4].sup_der.x = 525;
    coord[1][4].sup_der.y = 125;
    coord[1][4].inf_iz.x = 425;
    coord[1][4].inf_iz.y = 225;
    coord[1][4].inf_der.x = 525;
    coord[1][4].inf_der.y = 225;
   
    //fila 2
    coord[2][0].sup_iz.x = 25;
    coord[2][0].sup_iz.y = 225;
    coord[2][0].sup_der.x = 125;
    coord[2][0].sup_der.y = 225;
    coord[2][0].inf_iz.x = 25;
    coord[2][0].inf_iz.y = 325;
    coord[2][0].inf_der.x = 125;
    coord[2][0].inf_der.y = 325;
   
    coord[2][1].sup_iz.x = 125;
    coord[2][1].sup_iz.y = 225;
    coord[2][1].sup_der.x = 225;
    coord[2][1].sup_der.y = 225;
    coord[2][1].inf_iz.x = 125;
    coord[2][1].inf_iz.y = 325;
    coord[2][1].inf_der.x = 225;
    coord[2][1].inf_der.y = 325;
   
    coord[2][2].sup_iz.x = 225;
    coord[2][2].sup_iz.y = 225;
    coord[2][2].sup_der.x = 325;
    coord[2][2].sup_der.y = 225;
    coord[2][2].inf_iz.x = 225;
    coord[2][2].inf_iz.y = 325;
    coord[2][2].inf_der.x = 325;
    coord[2][2].inf_der.y = 325;
   
    coord[2][3].sup_iz.x = 325;
    coord[2][3].sup_iz.y = 225;
    coord[2][3].sup_der.x = 425;
    coord[2][3].sup_der.y = 225;
    coord[2][3].inf_iz.x = 325;
    coord[2][3].inf_iz.y = 325;
    coord[2][3].inf_der.x = 425;
    coord[2][3].inf_der.y = 325;
   
    coord[2][4].sup_iz.x = 425;
    coord[2][4].sup_iz.y = 225;
    coord[2][4].sup_der.x = 525;
    coord[2][4].sup_der.y = 225;
    coord[2][4].inf_iz.x = 425;
    coord[2][4].inf_iz.y = 325;
    coord[2][4].inf_der.x = 525;
    coord[2][4].inf_der.y = 325;
   
    //fila 3
    coord[3][0].sup_iz.x = 25;
    coord[3][0].sup_iz.y = 325;
    coord[3][0].sup_der.x = 125;
    coord[3][0].sup_der.y = 325;
    coord[3][0].inf_iz.x = 25;
    coord[3][0].inf_iz.y = 425;
    coord[3][0].inf_der.x = 125;
    coord[3][0].inf_der.y = 425;
   
    coord[3][1].sup_iz.x = 125;
    coord[3][1].sup_iz.y = 325;
    coord[3][1].sup_der.x = 225;
    coord[3][1].sup_der.y = 325;
    coord[3][1].inf_iz.x = 125;
    coord[3][1].inf_iz.y = 425;
    coord[3][1].inf_der.x = 225;
    coord[3][1].inf_der.y = 425;
   
    coord[3][2].sup_iz.x = 225;
    coord[3][2].sup_iz.y = 325;
    coord[3][2].sup_der.x = 325;
    coord[3][2].sup_der.y = 325;
    coord[3][2].inf_iz.x = 225;
    coord[3][2].inf_iz.y = 425;
    coord[3][2].inf_der.x = 325;
    coord[3][2].inf_der.y = 425;
   
    coord[3][3].sup_iz.x = 325;
    coord[3][3].sup_iz.y = 325;
    coord[3][3].sup_der.x = 425;
    coord[3][3].sup_der.y = 325;
    coord[3][3].inf_iz.x = 325;
    coord[3][3].inf_iz.y = 425;
    coord[3][3].inf_der.x = 425;
    coord[3][3].inf_der.y = 425;
   
    coord[3][4].sup_iz.x = 425;
    coord[3][4].sup_iz.y = 325;
    coord[3][4].sup_der.x = 525;
    coord[3][4].sup_der.y = 325;
    coord[3][4].inf_iz.x = 425;
    coord[3][4].inf_iz.y = 425;
    coord[3][4].inf_der.x = 525;
    coord[3][4].inf_der.y = 425;
   
    //fila 4
    coord[4][0].sup_iz.x = 25;
    coord[4][0].sup_iz.y = 425;
    coord[4][0].sup_der.x = 125;
    coord[4][0].sup_der.y = 425;
    coord[4][0].inf_iz.x = 25;
    coord[4][0].inf_iz.y = 525;
    coord[4][0].inf_der.x = 125;
    coord[4][0].inf_der.y = 525;
   
    coord[4][1].sup_iz.x = 125;
    coord[4][1].sup_iz.y = 425;
    coord[4][1].sup_der.x = 225;
    coord[4][1].sup_der.y = 425;
    coord[4][1].inf_iz.x = 125;
    coord[4][1].inf_iz.y = 525;
    coord[4][1].inf_der.x = 225;
    coord[4][1].inf_der.y = 525;
   
    coord[4][2].sup_iz.x = 225;
    coord[4][2].sup_iz.y = 425;
    coord[4][2].sup_der.x = 325;
    coord[4][2].sup_der.y = 425;
    coord[4][2].inf_iz.x = 225;
    coord[4][2].inf_iz.y = 525;
    coord[4][2].inf_der.x = 325;
    coord[4][2].inf_der.y = 525;
   
    coord[4][3].sup_iz.x = 325;
    coord[4][3].sup_iz.y = 425;
    coord[4][3].sup_der.x = 425;
    coord[4][3].sup_der.y = 425;
    coord[4][3].inf_iz.x = 325;
    coord[4][3].inf_iz.y = 525;
    coord[4][3].inf_der.x = 425;
    coord[4][3].inf_der.y = 525;
   
    coord[4][4].sup_iz.x = 425;
    coord[4][4].sup_iz.y = 425;
    coord[4][4].sup_der.x = 525;
    coord[4][4].sup_der.y = 425;
    coord[4][4].inf_iz.x = 425;
    coord[4][4].inf_iz.y = 525;
    coord[4][4].inf_der.x = 525;
    coord[4][4].inf_der.y = 525;
   
    return ;
}

recurso.rc

Código: You are not allowed to view links. Register or Login
#include "Lights_Out.h"

Menu MENU
BEGIN
    POPUP "&Juego"
    BEGIN
        MENUITEM "&Nuevo", CM_NUEVO
        MENUITEM SEPARATOR
        MENUITEM "&Instrucciones", CM_INSTRUC
        MENUITEM SEPARATOR
        MENUITEM "&Limitar Time", CM_DIALOGO
        MENUITEM SEPARATOR
        MENUITEM "&Salir", CM_SALIR
    END
    MENUITEM "&Solve", CM_SOLVE
END

DialogoInstr DIALOG 0,0,200,85
STYLE DS_MODALFRAME|WS_POPUP|WS_VISIBLE|WS_CAPTION
CAPTION "Propiedades"
FONT 12,"Times New Roman"
BEGIN
    CONTROL
        "El juego electrónico Lights Out, fabricado por la compañía"
        "Tiger Toys en 1995, consiste en una matriz de 5x5 de botones"
        "luminosos, los que pueden estar encendidos o apagados."
        "Presionar un botón cambia su estado y también el estado de los"
        " 4 botones adyacentes."
        " El objetivo del juego es, entonces, dado un patrón inicial "
        " de luces encendidas, determinar la secuencia de botones que"
        " deben ser presionados para apagar todas las luces "
        " Suerte!" ,-1,"STATIC",
        SS_LEFT|WS_VISIBLE|WS_CHILD|MB_RIGHT,
        5,5,190,100

    CONTROL "Aceptar",IDOK,"BUTTON",
        BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD|WS_TABSTOP,
        70,70,45,10
END

DialogoDefinirTiempo DIALOG 0, 0, 105, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "Restriccion Lights Out"
FONT 8, "Helv"
BEGIN
 CONTROL "Elija tiempo:", -1, "static",
    SS_LEFT | WS_CHILD | WS_VISIBLE,
    8, 9, 59, 30
 CONTROL "", ID_LISTA, "listbox",
    LBS_STANDARD | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    9, 19, 80, 50
 CONTROL "Aceptar", IDOK, "BUTTON",
    BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    8, 81, 45, 14
 CONTROL "Cancelar", IDCANCEL, "BUTTON",
    BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    54, 81, 45, 14
END

solve.c

Código: You are not allowed to view links. Register or Login
#include "solve.h"
#include "Lights_Out.h"

void triangularInferior (int _A[N][N+1])
{
    int i, k, otra;
   
    for (k = 0; k < N; k++)
    {
        for (i = k; i < N-1; i++)
        {
            if (_A[k][k] == 1)
            {
                if (_A[i+1][k] == 1)
                    mRowAdd (_A, k, i + 1);
            }
            else
            {
                //intercambiamos con la fila que tiene un 1 asociado a cada columna
                for (otra = (i + 1); otra < N; otra++)
                {
                    if (_A[otra][k] == 1)
                    {
                        swap_fila (_A, k, otra);//intercambiamos la fila k por otra
                        break;
                    }
                }
            }
        }
    }
   
    return ;
}

void triangularSuperior (int _A[N][N+1])
{
    int i, k, otra;
   
    for (k = 1; k < N; k++)
    {
        for (i = k; i > 0; i--)
        {
            if (_A[k][k] == 1)
            {
                if (_A[i-1][k] == 1)
                    mRowAdd (_A, k, i - 1);
            }
            else
            {
                //intercambiamos con la fila que tiene un 1 asociado a cada columna
                for (otra = (i - 1); otra >= 0; otra--)
                {
                    if (_A[otra][k] == 1)
                    {
                        swap_fila (_A, k, otra);//intercambiamos la fila k por otra
                        break;
                    }
                }
            }
        }
    }

    return ;
}

int suma_modular2 (int x, int y)
{
    return ((x + y) % 2);
}

void swap_fila (int _A[N][N+1], int fila_1, int fila_2)
{
    int j;
    int vec1[N+1], vec2[N+1];
   
    if (fila_1 == fila_2)
        return ;
   
    for (j = 0; j < N+1; j++)
    {
        vec1[j] = _A[fila_1][j];
        vec2[j] = _A[fila_2][j];
    }
   
    for (j = 0; j < N+1; j++)
    {
        _A[fila_2][j] = vec1[j];
        _A[fila_1][j] = vec2[j];
    }
   
    return ;
}

void mRowAdd (int _A[N][N+1], int fila_1, int fila_2)
{
    int j;
   
    for (j = 0; j < N+1; j++)
        _A[fila_2][j] = suma_modular2 (_A[fila_1][j],_A[fila_2][j]);
   
    return ;
}

void configInicial_to_b(int Mat[5][5], int vect[25])
{
    int i, j, cont = 0;
   
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            vect[cont++] = Mat[i][j];
        }
    }
   
    return ;
}

void CrearMatrizAmpliada (int _A[N][N+1], int A[N][N], int b[N])
{
    int i, j;
   
    for (i = 0; i < N; i++)
        for (j = 0; j < N+1; j++)
            _A[i][j] = A[i][j];
   
    for (i = 0; i < 26; i++)
        _A[i][25] = b[i];
   
    return ;
}

void crearA (int A[N][N])
{
    int i, j;
    int _A[25][25] = {
        {1,1,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {1,1,1,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,1,1,1,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,0,1,1,1, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,0,0,1,1, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
       
        {1,0,0,0,0, 1,1,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,1,0,0,0, 1,1,1,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,0,1,0,0, 0,1,1,1,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,0,0,1,0, 0,0,1,1,1, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0},
        {0,0,0,0,1, 0,0,0,1,1, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0},
       
        {0,0,0,0,0, 1,0,0,0,0, 1,1,0,0,0, 1,0,0,0,0, 0,0,0,0,0},
        {0,0,0,0,0, 0,1,0,0,0, 1,1,1,0,0, 0,1,0,0,0, 0,0,0,0,0},
        {0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,1,0,0, 0,0,0,0,0},
        {0,0,0,0,0, 0,0,0,1,0, 0,0,1,1,1, 0,0,0,1,0, 0,0,0,0,0},
        {0,0,0,0,0, 0,0,0,0,1, 0,0,0,1,1, 0,0,0,0,1, 0,0,0,0,0},
       
        {0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 1,1,0,0,0, 1,0,0,0,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0, 1,1,1,0,0, 0,1,0,0,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,1,0,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,1,1,1, 0,0,0,1,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,1,1, 0,0,0,0,1},
       
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 1,1,0,0,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0, 1,1,1,0,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,1,1,1},
        {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,1,1}
    };
   
    for (i = 0; i < 25; i++)
        for (j = 0; j < 25; j++)
            A[i][j] = _A[i][j];
   
    return ;
}

void Ampliada_to_x (int _A[N][N+1], int x[N])
{
    int i;
   
    for (i = 0; i < N; i++)
    {
        x[i] = _A[i][N];
    }
   
    return ;
}

void x_to_MatrizSolucion (int b[N], int Mx[N/5][N/5])
{
    int i, j, k;
   
    for (i = k = 0; i < N/5; i++)
    {
        for (j = 0; j < N/5; j++)
        {
            Mx[i][j] = b[k++];
        }
    }
   
    return ;
}


solve.h

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <windows.h>
#include <time.h>

#define N          25

int suma_modular2 (int x, int y);
void crearA(int A[N][N]);
void triangularInferior (int _A[N][N+1]);
void triangularSuperior (int _A[N][N+1]);
void swap_fila (int _A[N][N+1], int fila_1, int fila_2);
void mRowAdd (int _A[N][N+1], int fila_1, int fila_2);
void configInicial_to_b(int Mat[5][5], int vect[N]);
void CrearMatrizAmpliada (int _A[N][N+1], int A[N][N], int b[N]);
void Ampliada_to_x (int A[N][N+1], int x[N]);
void x_to_MatrizSolucion (int b[N], int Mx[N/5][N/5]);


PD: Para los que averiguaron las regla de este juego, podrán saber que existen patrones iniciales que no tienen solución, esta implementación fue creada de manera tal que existan configuraciones iniciales con solución. Así que si no pueden darle solución manualmente, no es porque no exista solución, sino por que son malos jugadores xd.

Saludos CPH
« Última modificación: Diciembre 27, 2013, 06:37:07 pm por nano20sm »


xx
alguien tiene un juego....hecho en java... pero que tenga estadisticas matematic

Iniciado por adriel_palomares

2 Respuestas
1919 Vistas
Último mensaje Junio 03, 2008, 02:44:11 pm
por adriel_palomares
xx
WinApi con VB.NET

Iniciado por MoisesE

1 Respuestas
2690 Vistas
Último mensaje Enero 17, 2010, 05:25:48 pm
por mDrinky
exclamation
[C++/C] El winapi y SDL

Iniciado por MoisesE

4 Respuestas
1955 Vistas
Último mensaje Agosto 13, 2010, 11:20:37 am
por MoisesE
xx
WinApi

Iniciado por ardebask

4 Respuestas
1545 Vistas
Último mensaje Junio 08, 2008, 07:22:38 am
por TXS
xx
Inyector dll - WinApi

Iniciado por @Aps

7 Respuestas
2130 Vistas
Último mensaje Diciembre 21, 2011, 11:34:27 pm
por @Aps
xx
Problema con WinAPI

Iniciado por puntop

3 Respuestas
1029 Vistas
Último mensaje Enero 15, 2014, 04:39:45 pm
por nano20sm
xx
Curso WinAPI

Iniciado por Binary_Death

1 Respuestas
1590 Vistas
Último mensaje ſeptiembre 20, 2011, 12:23:07 pm
por Avoidance25
resuelto
Varias ventanas con WinAPI

Iniciado por wally_88

4 Respuestas
2130 Vistas
Último mensaje Diciembre 29, 2010, 11:13:14 pm
por wally_88
question
Duda con arrastrar en winapi

Iniciado por myguestp

5 Respuestas
1314 Vistas
Último mensaje ſeptiembre 05, 2010, 03:06:14 am
por myguestp
exclamation
Ejemplo de listbox winapi

Iniciado por Niko^

3 Respuestas
2388 Vistas
Último mensaje ſeptiembre 07, 2010, 03:05:53 am
por myguestp