Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

5 in rows (win32gui)

[es] :: C/C++ programiranje :: C/C++ za početnike :: 5 in rows (win32gui)

[ Pregleda: 1384 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kondenzator
Studiram
BiH

Član broj: 273610
Poruke: 22
*.PPPoE-8022.sa.bih.net.ba.

Sajt: www.rodjendanskecestitke...


Profil

icon 5 in rows (win32gui)11.12.2010. u 13:08 - pre 162 meseci
Da li neko ima code za ovu igru pisan u win32gui-u...?


 
Odgovor na temu

Kondenzator
Studiram
BiH

Član broj: 273610
Poruke: 22
*.PPPoE-8022.sa.bih.net.ba.

Sajt: www.rodjendanskecestitke...


Profil

icon Re: 5 in rows (win32gui)11.12.2010. u 14:40 - pre 162 meseci
Napravio sam polje 10x10.

Uspio sam napravit da mi prozore boji prilikom klikanja na crvenu/plavu boju (naizmjenicno), ali nisam uspio rjesit da mi "zastiti" polje koje obojeno. Dakle kad kliknem na neko polje koje je obojeno npr u crveno promjeni mu boju u plavu ili bijelu koja je default boja.

Code:

//5 in a Row
#include <windows.h>
#define BR 10

LRESULT CALLBACK WndOtac (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndDijete (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        PSTR szCmdLine, int iCmdShow)
{
    HWND         hwnd;
    MSG          msg;
    WNDCLASS     wc;

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndOtac;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "Otac";
    RegisterClass (&wc);

    wc.lpfnWndProc   = WndDijete;
    wc.cbWndExtra    = sizeof (long);
    wc.hIcon         = NULL;
    wc.lpszClassName = "Dijete";
    RegisterClass (&wc);

    hwnd = CreateWindow ("Otac",              // ime windows klase
                         "5 in a Row",        // tekst u Window title bar-u
                         WS_OVERLAPPEDWINDOW, // stil prozora
                         112,                 // inicijalna x koordinata
                         84,                  // inicijalna y koordinata
                         800,                 // inicijalna sirina prozora
                         600,                 // inicijalna visina prozora
                         NULL,                // handle na vlasnika (parent) prozora
                         NULL,                // window menu handle
                         hInstance,           // handle na instancu aplikacije
                         NULL);               // dodatni kreacioni parametri
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}

LRESULT CALLBACK WndOtac (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND djeca [BR];
    int i, j, cx, cy;
    switch (message)
    {
        case WM_CREATE:
            for (i = 0; i < BR * BR; i++) // kreiranje zadatog broja prozora
            {
                djeca [i] = CreateWindow ("Dijete", NULL, WS_CHILD | WS_VISIBLE,
                                          0, 0, 0, 0, hwnd, NULL,
                                          (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
            }
        case WM_SIZE:
            cx = LOWORD (lParam) / (1.25 * BR);
            cy = HIWORD (lParam) / (1.25 * BR);
            for (i = 0; i < BR; i++) // pomjeranje i skaliranje svih prozora radi dobijanja polja
            {
                for (j = 0; j < BR; j++)
                    MoveWindow (djeca [i * BR + j], i * cx + 1.25 * cx, j * cy + 1.50 * cy,
                                cx, cy, TRUE);
            }
            return 0;
        case WM_DESTROY:
            PostQuitMessage (0);
            return 0;
    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}
LRESULT CALLBACK WndDijete(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    HBRUSH brush;
    static BOOL fFlipFlop = FALSE;
    switch (message)
    {
        case WM_CREATE:
            SetWindowLong (hwnd, 0, 0);
            return 0;
        case WM_LBUTTONDOWN:
            SetWindowLong (hwnd, 0, !GetWindowLong (hwnd, 0));
            InvalidateRect (hwnd, NULL, FALSE);
            return 0;
        case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps);
            GetClientRect (hwnd, &rect);
            Rectangle (hdc, 0, 0, rect.right, rect.bottom);
            brush = CreateSolidBrush (fFlipFlop ? RGB (255, 0, 0) : RGB(0, 0, 255));
            if (!GetWindowLong (hwnd, 0)) // aktivacija dvije boje naizmjenicno
            {
                fFlipFlop = !fFlipFlop;
                FillRect (hdc, &rect, brush);
            }
            EndPaint (hwnd, &ps);
            DeleteObject (brush);
            return 0;
    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}


 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: 5 in rows (win32gui)11.12.2010. u 15:21 - pre 162 meseci
Ovaj bFlipFlop mi je totalno sumnjiv. Obrati pažnju da se WM_PAINT okida na svakojake događaje. Pomeri pola prozora izvan ekrana, pa ga polako vraćaj nazad u ekran. Ako se ne varam zbog ove flip-flop logike deca koja su na ivici ekrana će početi da menjaju boje. Taj flip-flop treba da se flipuje u WM_LBUTTONDOWN a ne u WM_PAINT, i to ne uvek nego pod uslovom da je GetWindowLong 0 (jer to znači da je polje slobodno). Zapravo sve u WM_LBUTTONDOWN se radi isključivo ako je GetWindowLong == 0, inače klik treba da se ignoriše.

Dodatni problemi: U WndOtac napravio si niz static HWND djeca [ BR], ali treba zapravo BR * BR. Bezrazložno opterećenje s resursima: u detetovom WM_PAINT stalno kreiraš brush koji odmah tu i brišeš, a bolje je da na početku napraviš oba brusha koja ti trebaju i samo ih biraš po potrebi.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: 5 in rows (win32gui)11.12.2010. u 15:26 - pre 162 meseci
Ko pre sastavi 5 u nizu?

http://www.elitesecurity.org/p1430501
 
Odgovor na temu

Kondenzator
Studiram
BiH

Član broj: 273610
Poruke: 22
*.PPPoE-4368.sa.bih.net.ba.

Sajt: www.rodjendanskecestitke...


Profil

icon Re: 5 in rows (win32gui)18.12.2010. u 14:00 - pre 162 meseci
Poz,
Evo promjenili smo pristup i ne radimo vise preko childova, jer smo ograniceni sa vremenom, a i nemamo dovoljno znanja ni iskustva.
Mozes pogledat ovaj kod kojim smo rjesili precrtavanje, al smo zapeli kod funkcije za pobjedu. Svaka pomoc nam je dobrodošla!

Code:
//5 in a Row v 0.1
#include <windows.h>
#define BR 15

enum Marker {blank, X, O};

HINSTANCE hInst;
Marker Turn = X;
Marker MBoard [15][15] = {{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank},
                         {blank, blank, blank, blank, blank, blank, blank, blank, blank, blank,                          blank, blank, blank ,blank ,blank}};
const int sqSize = 30;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
void DBoard (HDC);
void CrtajX (HDC, int, int);
void CrtajO (HDC, int, int);
bool PostaviX (LPARAM);
bool PostaviO (LPARAM);
bool Win ();
bool Full ();
bool Reset ();


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        PSTR szCmdLine, int iCmdShow)
{
    HWND         hwnd;
    MSG          msg;
    WNDCLASS     wc;

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "Class";
    RegisterClass (&wc);

    hwnd = CreateWindow ("Class",              // ime windows klase
                         "5 in a Row",        // tekst u Window title bar-u
                         WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX,
                         112,                 // inicijalna x koordinata
                         84,                  // inicijalna y koordinata
                         800,                 // inicijalna sirina prozora
                         600,                 // inicijalna visina prozora
                         NULL,                // handle na vlasnika (parent) prozora
                         NULL,                // window menu handle
                         hInstance,           // handle na instancu aplikacije
                         NULL);               // dodatni kreacioni parametri
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}

/*void DBoard (HDC hdc)
{
    HPEN Pen1;
    HPEN Pen2;
    COLORREF LineColor;
    int iX, iY;
    LineColor = RGB (0, 0, 0);
    Pen2 = CreatePen (PS_SOLID, 2, LineColor);
    Pen1 = (HPEN) SelectObject (hdc, Pen2);
    for (iX = sqSize; iX < 15 * sqSize; iX += sqSize)
    {
        MoveToEx (hdc, 176 + iX, 81, NULL);
        LineTo (hdc, 176 + iX, 81 + (15 * sqSize));
    }
    for (iY = sqSize; iY < 15 * sqSize; iY += sqSize)
    {
        MoveToEx (hdc, 176, 81 + iY, NULL);
        LineTo (hdc, 176 + (15 * sqSize), 81 + iY);
    }
    SelectObject (hdc, Pen1);
    DeleteObject (Pen2);
}*/

void DBoard (HDC hdc)
{
    HPEN Pen1;
    HPEN Pen2;
    COLORREF LineColor;
    int iX, iY;
    LineColor = RGB (0, 0, 0);
    Pen2 = CreatePen (PS_SOLID, 2, LineColor);
    Pen1 = (HPEN) SelectObject (hdc, Pen2);
    for (iX = sqSize; iX < 16 * sqSize; iX += sqSize)
    {
        MoveToEx (hdc, iX, 0, NULL);
        LineTo (hdc, iX, 15 * sqSize);
    }
    for (iY = sqSize; iY < 16 * sqSize; iY += sqSize)
    {
        MoveToEx (hdc, 0, iY, NULL);
        LineTo (hdc, 15 * sqSize, iY);
    }
    SelectObject (hdc, Pen1);
    DeleteObject (Pen2);
}
void CrtajX (HDC hdc, int iX, int iY)
{
    HPEN Pen1;
    HPEN Pen2;
    COLORREF LineColor;
    const int SirinaP = 2;
    const int PocX = iX * sqSize + 2 * SirinaP;
    const int KrajX = (iX + 1) * sqSize - 2 * SirinaP;
    const int PocY = iY * sqSize + 2 * SirinaP;
    const int KrajY = (iY + 1) * sqSize - 2 * SirinaP;
    LineColor = RGB (255, 0, 0);
    Pen2 = CreatePen (PS_SOLID, SirinaP, LineColor);
    Pen1 = (HPEN) SelectObject (hdc, Pen2);
    MoveToEx (hdc, PocX, PocY, NULL);
    LineTo (hdc, KrajX, KrajY);
    MoveToEx (hdc, PocX, KrajY, NULL);
    LineTo (hdc, KrajX, PocY);
    SelectObject (hdc, Pen1);
    DeleteObject (Pen2);
}

void CrtajO (HDC hdc, int iX, int iY)
{
    HPEN Pen1;
    HPEN Pen2;
    COLORREF LineColor;
    const int SirinaP = 2;
    const int PocX = iX * sqSize + 2 * SirinaP;
    const int KrajX = (iX + 1) * sqSize - 2 * SirinaP;
    const int PocY = iY * sqSize + 2 * SirinaP;
    const int KrajY = (iY + 1) * sqSize - 2 * SirinaP;
    LineColor = RGB (0, 0, 255);
    Pen2 = CreatePen (PS_SOLID, SirinaP, LineColor);
    Pen1 = (HPEN) SelectObject (hdc, Pen2);
    Arc (hdc, PocX, PocY, KrajX, KrajY, 0, 0, 0, 0);
    SelectObject (hdc, Pen1);
    DeleteObject (Pen2);
}
bool PostaviX(LPARAM lParam)
{
    int iPozX = LOWORD(lParam);
    int iPozY = HIWORD (lParam);
    int iKvadratX = (iPozX/sqSize);
    int iKvadratY = (iPozY/sqSize);
    if((Turn==X)&&(iKvadratX<15)&&(iKvadratY<15)&&(MBoard[iKvadratY][iKvadratX])==blank)
    {
        MBoard[iKvadratY][iKvadratX]=X;
        return true;
    }
    return false;
}

bool PostaviO(LPARAM lParam)
{
    int iPozX = LOWORD(lParam);
    int iPozY = HIWORD (lParam);
    int iKvadratX = (iPozX/sqSize);
    int iKvadratY = (iPozY/sqSize);
    if((Turn==O)&&(iKvadratX<15)&&(iKvadratY<15)&&(MBoard[iKvadratY][iKvadratX])==blank)
    {
        MBoard[iKvadratY][iKvadratX]=O;
        return true;
    }
    return false;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    int iX,iY;
    bool Potez;
    switch (message)
    {
        case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps);
            DBoard (hdc);
            for(iX=0 ; iX<15 ; ++iX)
            {
                for(iY=0 ; iY<15 ; ++iY)
                {
                    if(MBoard[iY][iX]==X)
                    {
                        CrtajX(hdc, iX, iY);
                    }
                    else if (MBoard[iY][iX]==O)
                    {
                        CrtajO(hdc, iX, iY);
                    }
                }
            }
            return 0;
        case WM_DESTROY:
            PostQuitMessage (0);
            return 0;
        case WM_LBUTTONDOWN:
        {
            bool Potez=PostaviX(lParam);
            if(Potez)
            {
                Turn=O;
            }
            InvalidateRect(hwnd, 0, TRUE);
            break;
        }
        case WM_RBUTTONDOWN:
        {
            bool Potez=PostaviO(lParam);
            if(Potez)
            {
                Turn=X;
            }
            InvalidateRect(hwnd, 0, TRUE);
            break;
        }

    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}

 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: 5 in rows (win32gui)

[ Pregleda: 1384 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.