[ Kondenzator @ 11.12.2010. 13:08 ] @
Da li neko ima code za ovu igru pisan u win32gui-u...? |
[ Kondenzator @ 11.12.2010. 13:08 ] @
[ Kondenzator @ 11.12.2010. 14:40 ] @
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); } [ Mihajlo Cvetanović @ 11.12.2010. 15:21 ] @
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. [ X Files @ 11.12.2010. 15:26 ] @
[ Kondenzator @ 18.12.2010. 14:00 ] @
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); } Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|