Můj projekt - Hledání min v Dev C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Můj projekt - Hledání min v Dev C++ – C / C++ – Fórum – Programujte.comMůj projekt - Hledání min v Dev C++ – C / C++ – Fórum – Programujte.com

 

MiCizek0
Stálý člen
31. 7. 2012   #1
-
0
-

Ahoj, abych tu moc nespamoval, tak jsem pro tohle udělal jedno vlákno. Zde se budu ptát, když budu potřebovat s něčím poradit.

Nechci nějak poškodit práva MicroSoftu, ale snažím se udělat WinApi hru podle již známé windows hry, abych se trochu zdokonalil v programování. Nechci, aby mě tu někdo vodil vysloveně za ručičku, jednak proto že už mám určitou představu, jak by hra měla fungovat, jednak proto, že bych si z toho odnesl houby. Ale je pravda, že můžu občas řešit dilema, jestli to udělat takhle nebo jinak.

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
31. 7. 2012   #2
-
0
-

Takže pár problémů: Zatím lze v programu vybrat obtížnost a když kliknete na new, tak se vytvoří tlačítka. Počet tlačítek závisí na zvolené obtížnosti. Tlačítka se generují ve smyčce pomoci příkazu "CreateWindowEx" a HWND se ukládá do globálního pole "HWND buttonMine[480];". Před každou generací se zníčí tlačítka smyčkou příkazů "DestroyWindow(buttonMine[numButton]);". Program fungoval v pohodě, byl stabilní, ale podle mě by neměl. Protože jsem měl takhle  nastavenou proměnou "HWND buttonMine[81];". A při výběru jedné z vyších obtížností by neměl stačit rozsah pole a program by měl spadnout, ale vše funguje naprosto v pohodě.

Jinak pro ID tlačítka využívám proměnou která se inkrementuje a přičte se k ní 50000.

Nahlásit jako SPAM
IP: 90.180.175.–
KIIV
~ Moderátor
+43
God of flame
31. 7. 2012   #3
-
0
-

kdyz je pole mensi, tak to vesmes nicemu nevadi.. az namalou drobnost - prepisujes promenne co jsou v pameti na tech pozicich... proto to taky nepada - musis se dostat az za posledni blok ktery mas k dispozici pro zapis, aby to padlo (a bloky muzou byt po cca 4kB...)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
31. 7. 2012   #4
-
0
-

Přes tlačítka se to samozřejmě dá dělat taky a pokud to chceš řešit touto cestou, tak samozřejmě nemám nic proti, ale MS verze je dělaná přes kreslení do device contexts (HDC) ... prostě vykreslení čar a obdélníčků.

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
31. 7. 2012   #5
-
0
-

#4 liborb
Chápu, ale asi bych se z toho prozatím zbláznil, chtělo by to nastudovat a pak něco vytvořit. I když chápu, že si pak vzhled "tlačítek" můžu vytvořit podle sebe.

Nahlásit jako SPAM
IP: 90.180.175.–
liborb
~ Redaktor
+18
Guru
31. 7. 2012   #6
-
0
-

Jasně, v pohodě, je to jen na tobě, ale primárně nejde o vzhled, ale o systémové zdroje, protože handlů není nekonečné množství a je zbytečné je takto plýtvat, ale chápu, že se to zdá (přes tlačítka) jako jednoduché řešení. Po pravdě ... ono to řešení přes grafiku je asi tak stejně složité :).

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
31. 7. 2012   #7
-
0
-

#6 liborb
Jasně jen vědět jak. :-) Že bych požádal strýčka googla? :-D

Nahlásit jako SPAM
IP: 90.180.175.–
liborb
~ Redaktor
+18
Guru
31. 7. 2012   #8
-
0
-

Udělej si verzi s tlačítky a až se tím prokoušeš, tak máš námět na pokračování. Jinak tady na fóru je plno lidí, kteří vědí jak, takže se stačí vhodně ptát a hlavně ukázat svojí snahu :).

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
2. 9. 2012   #9
-
0
-

Ahoj, dlouho jsem tu nebyl, měl jsem jiné starosti. Trochu jsem pokročil, v aplikaci můžete nyní zvolit obtížnost, vytvořit novou hru, vkládat miny a okolní políčka vám ukazují s kolika minami sousedí. Při vytvoření nové miny hra na vyšších obtížnostech padá.

http://www.4shared.com/…12_1522.html

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
2. 9. 2012   #10
-
0
-
Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
3. 9. 2012   #11
-
0
-

Ahoj zase jsem pokročil. Hlavní funkčnost už mám v podstatě hotovou. V režimu nejtěžší obtížnosti program stále padá, asi nedostatek paměti. Je asi na čase, abych pokročil dál, takže bych potřeboval zjistit, jak se vytvářejí vlastní tlačítka(HDC) a jak upravit vzhled?

http://czshare.com/…VereMini.exe

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
3. 9. 2012   #12
-
0
-

Tohle je v podstatě můj první program, předtím jsem se to jenom učil a trénoval programy běžící v příkazovém řádku.

Nahlásit jako SPAM
IP: 90.180.175.–
liborb
~ Redaktor
+18
Guru
4. 9. 2012   #13
-
0
-

Vykreslení se dělá v reakci na WM_PAINT, vymazání pozadí v reakci na WM_ERASEBKGND (aby to neblikalo, tak se dělá tzv. double buffering, tj. vykreslíš si to do paměťového DC a ve WM_PAINT uděláš pouze BitBlt, ale to si můžeš nechat na později :)).

Tady je seznam funkcí, které by ti mohl pomoci při kreslení. Pro vykreslení tlačítka můžeš využít například DrawFrameControl.

Funkce pro práci s textem jsou zde. DrawText nebo TextOut, ale před tím si musíš nastavit font. Vytvoření fontu je CreateFont a nastavení fontu je přes SelectObject (tím se nastavuje "všechno", tj. font, pero, štětec ...). Nezapomeň si uložit to, co ti funkce SelectObject vrátí a když na konci vykreslení to tam zase vrátit. Transparentní pozadí textu nastavíš přes SetBkMode.

Pro práci s bitmapami jsou tu tyto funkce. To kdyby si chtěl třeba zobrazovat symbol miny. Potřebuješ si bitmapu nahrát (LoadImage nebo LoadBitmap nejlépe z resource). Vytvořit si kompatibilní DC (CreateCompatibleDC), přiřadit mu tu bitmapu a pak už můžeš jenom vykreslit bitmapu přes BitBlt nebo pokud budeš chtít transparentní nějakou barvu, tak TransparentBlt atd.

Pro začátek asi stačí, ne? :) Když tak se ptej.

Nahlásit jako SPAM
IP: 78.80.52.–
KIIV
~ Moderátor
+43
God of flame
4. 9. 2012   #14
-
0
-

#11 MiCizek
a zjisti taky kvuli cemu to pada .. a silne pochybuju ze na nedostatek pameti.. spis spatna prace s ni (a zasahy nekam, kam nemas)  - od toho je debuger (a na linuxu je to jeste lepsi - spousta nastroju na hlidani operaci s pameti a tak)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
4. 9. 2012   #15
-
0
-

KIIV má pravdu a ještě bych přidal - přejdi z Dev-C++ na něco jiného, nejlépe na Visual Studio. Zkusil jsem si to u sebe na stroji přeložit ve VS a kupodivu to zahlásilo jen 2 warningy, ale jsou výživný (možná mám starý zdroják):

// takto to mas definovane
SQUARE *pSquare[16][30];

// ale takto se to samozrejme mazat neda
delete [] pSquare;


no a pak ve void SQUARE::SetDangerOfMine () pracuješ s neinicializovanou proměnnou j.

A pak se VS nelíbí ani běh na nízkou obtížnost. Vřele ti doporučuji přechod na něco lepšího - Dev-C++ je mrtvé.

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
4. 9. 2012   #16
-
0
-

Díky, ještě by mě napadlo, jaké mám použít funkce a reakce při práci s myší? Možná tlačítka najdu, ale nevím jak zjistím polohu cursoru... A taky bych rád věděl, jak mám udělat okno, aby se v programu nemohla měnit jeho velikos...

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
4. 9. 2012   #17
-
0
-

Já Dev C++ používal proto, že se to tam dělalo ručně (tlacitka a tak.) a taky ze to bylo ke knize "Naučte se C++ za 21 dní"  Hele a jak to mám mazat v Dev C++ to akorát takhle fungovalo?

Nahlásit jako SPAM
IP: 90.180.175.–
liborb
~ Redaktor
+18
Guru
4. 9. 2012   #18
-
0
-

Myš -> WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP ...

Omezení velikosti -> asi nejuniverzálnější je obsloužit WM_GETMINMAXINFO.

Ve VS můžeš dělat to samé, co v Dev-C++ a ještě mnohem víc, tj. i tlačítka ručně :). Jak jsem psal, přeložil jsem to ve VS poměrně snadno (jenom jsem ANSII řetězce nahradil UNICODE a smazal jednou zbytečný rc soubor).

A k tomu mazání, asi nejlépe takto: co alokuješ přes new, tak to mažeš přes delete. Nic víc (chybný přístup do paměti) a nic míň (memory leak). Takže v tvém případě mažeš jednotlivé instance třídy SQUARE, které někde alokuješ (ano, bude to v cyklu, dokonce budou 2 :))).

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
4. 9. 2012   #19
-
0
-

Počkat s tou pamětí to nechápu?? A taky mám problém s touto funkcí u druhého a třetího parametru mě to háže chybu:


						buttonMine[i][j] = CreateWindowEx(
															NULL,
															"BUTTON",
															"",
															WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
															posXBUTTON,
															posYBUTTON,
															25,
															25,
															hWnd,
															(HMENU)IDBUTTON,
															NULL,
															NULL
															);
Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
4. 9. 2012   #20
-
0
-

Jako že delete mám před new?

Nahlásit jako SPAM
IP: 90.180.175.–
liborb
~ Redaktor
+18
Guru
4. 9. 2012   #21
-
0
-

Chybu? Jakou? ANSII -> UNICODE? Tak tam dej:

... ,L"BUTTON", L"", ...

Najdi mi, kde alokuješ přes new paměť pro pSquare (nemyslím pro jednotlivé buňky pSquare[] :)).

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
4. 9. 2012   #22
-
0
-

Pak mi VS hlasí ještě tyhle chyby

1>stdafx.obj : error LNK2005: "public: __thiscall SQUARE::SQUARE(void)" (??0SQUARE@@QAE@XZ) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "public: void __thiscall SQUARE::SetDangerOfMine(void)" (?SetDangerOfMine@SQUARE@@QAEXXZ) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "public: void __thiscall SQUARE::SetMultiple(void)" (?SetMultiple@SQUARE@@QAEXXZ) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "void __cdecl ClicToButton(int,int)" (?ClicToButton@@YAXHH@Z) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "void __cdecl SetLinkNode(int,int)" (?SetLinkNode@@YAXHH@Z) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "void __cdecl GenerateOfMine(void)" (?GenerateOfMine@@YAXXZ) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "class SQUARE * firstSquare" (?firstSquare@@3PAVSQUARE@@A) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int widthHwnd" (?widthHwnd@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "struct HWND__ * (* buttonMine)[30]" (?buttonMine@@3PAY0BO@PAUHWND__@@A) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "struct HMENU__ * hMenu" (?hMenu@@3PAUHMENU__@@A) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "long IDBUTTON" (?IDBUTTON@@3JA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "struct tagRECT hRectHwnd" (?hRectHwnd@@3UtagRECT@@A) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "class SQUARE * (* pSquare)[30]" (?pSquare@@3PAY0BO@PAVSQUARE@@A) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int heightHwnd" (?heightHwnd@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int countVerticalButton" (?countVerticalButton@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int countHorizontalButton" (?countHorizontalButton@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "bool firstButton" (?firstButton@@3_NA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "bool gameOver" (?gameOver@@3_NA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int countMine" (?countMine@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int difficulGame" (?difficulGame@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int numButton" (?numButton@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int posXBUTTON" (?posXBUTTON@@3HA) already defined in PonyMine.obj
1>stdafx.obj : error LNK2005: "int posYBUTTON" (?posYBUTTON@@3HA) already defined in PonyMine.obj

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
4. 9. 2012   #23
-
0
-

   

switch (difficulGame)
				{
					case 0:
						countVerticalButton = 9;
						countHorizontalButton = 9;
						pSquare  = new SQUARE[9][9];
						countMine = 10;
						break;
					case 1:
						countVerticalButton = 15;
						countHorizontalButton = 15;
						pSquare  = new SQUARE[15][15];
						countMine = 40;
						break;
					case 2:
						countVerticalButton = 16;
						countHorizontalButton = 30;
						pSquare  = new SQUARE[16][30];
						countMine = 99;
						break;
				}
Nahlásit jako SPAM
IP: 90.180.175.–
liborb
~ Redaktor
+18
Guru
4. 9. 2012   #24
-
+1
-
Zajímavé

Hoď zase někam celý projekt :)

Nahlásit jako SPAM
IP: 78.80.52.–
MiCizek0
Stálý člen
4. 9. 2012   #25
-
0
-

http://czshare.com/…012+1210.rar

Pokusul jsem se opravit problém s alokací a doufám, že jsem tam při tom nenadělal další chyb. Jinak mě to tam háže ty chyby, jak jsem postnul.

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
4. 9. 2012   #26
-
0
-

Teďka když nad tím tak přemýšlím, když jsem z dvojrozměrného pole ukazatelů udělal pole n SQUARE, tak jsem to měl přepočítat takhle 'num = vertical * maxHorizontal + horizontal' a né takhle 'num = vertical * vertical + horizontal'

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
4. 9. 2012   #27
-
0
-
Nahlásit jako SPAM
IP: 90.180.175.–
ingiraxo+15
Grafoman
5. 9. 2012   #28
-
0
-

MiCizek: pokud to je mimo téma tak se omouvám, ale možná bych doporučil to dělat rovnou v C++Qt, jednak to bude multiplatform a taky budeš mít větší prostor pro řešení samotné logiky hry, protože např. samotné tlačítka, okno je už vyřešené a taky (je to sice můj názor) dělat něco přes WinAPI je mimo dobu, není sice na škodu to znát, ale nikdy v tom pravděpodobně dělat nebudes a jen tak mimochodem Qt nativně podporuje openGL, takže vykreslení okna nedělá CPU, takže se ti to mnohonásobně zrychlí (vim, že nevykresluješ, ale děláš to přes tlačítka, ale doporučil bych to vykreslovat)

a rovnou to dát třeba na github a postupně to aktualizovat.. sem pak můžeš jen pastnout odkaz a my uvidíme co si měnil apod.

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
MiCizek0
Stálý člen
5. 9. 2012   #29
-
0
-

#28 ingiraxo
Možná moje příští aplikace v tom bude. :-)

Nahlásit jako SPAM
IP: 88.100.108.–
Martin
~ Anonymní uživatel
1600 příspěvků
12. 12. 2012   #30
-
0
-

Zdravim,

Muzete nekam hodit cely projekt? Czshare to smazal z duvodu, ze v souboru byl warez..

Nahlásit jako SPAM
IP: 188.120.201.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Hledání min (nul) — založil David2563

Řešení hledání min — založil Martin

Min or max v seznamu — založil Karel

Firefox a min-height — založil Petr

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý