Kezdőoldal » Számítástechnika » Programozás » Várakozás eseményre C# környez...

Várakozás eseményre C# környezetben, hogyan?

Figyelt kérdés

Sziasztok!

A következő problémába kérném segítségeteket:

Az egyszerűség kedvéért egy "itt a piros-hol a piros"-on keresztül vezetem le a kérdésem.

Adott egy gép előtt ülő játékos és egy gépi játékos(ai). A pálya egész egyszerűen három PictureBox-ból áll, amik OnClick eseményre reagálnak.

Először a játékos választhatja ki a három PictureBox egyikét. Egérgomb kattintás esetén beindul az OnClick eseményre létrehozott metódus és kiderül, hogy eltalálta e a vörös dáma hollétét vagy sem. Ezek után a, nem túl bonyolult mesterséges intelligencia választhat, mondjuk generál egy számot egytől háromig és ennek megfelelő OnClick metódusra mutat és folyik a játék tovább.

Ezt összefogva létrehozok egy Fogyseg() metódust, ami eldönti egy egyszerű feltétellel, hogy éppen ki következik és mondjuk addig fut a játék amíg valaki el nem ér 20 pontot.(körönként egy kapható)

Kérdésem a következő lenne ezzel kapcsolatban:

A számítógép esetén értelemszerűen a vezérlést átadom egy metódusnak és ő szépen levezényli az egész műveletet, de a játékos esetén nekem arra kell várakoznom, hogy egy OnClick esemény megtörténjen, hogyan tudom ezt megtenni?


Az OnClick-eket nem tudom mozgatni, a Form hívja meg őket.



#intelligencia #Visual C# #vezérlés #várakozás eseményre #várakozás esemény bekövetkezésére #feladatok kiosztása
2013. aug. 27. 12:50
 1/9 anonim ***** válasza:

Nem kell semmit tenned. PictureBox-ra kattint igaz?


Ha Visual Studioban fejesztesz: Kattints duplán a PictureBox-ra a Designer nézetben és 2 kódort hoz létre:


az egyik a Form.Designer.cs fájlban lesz a másik a Form.cs-ben. Amit neked mutatni fog az az "OnClick" metódus picturebox1_Click (object sender, EventArgse e){}.


Ide írod be, hogy mi történtjen a kattintás után. A másik kódsorral különösebben nem kell foglalkoznod, az szimplán annyi, hogy a Form osztályod regisztrál a PictureBox object Click eseményére.Miután a 3 PictureBox-od mindegyik esetén nagyjából ugyanaz történik, hozd létre az összes Click eventhandlert majd innen irányítsd át a programod egy közös metódusba, pl. calculateGameResult(); Ebben a metódusban, amire mint három PictureBox Click eventhandlerében hivatkozol, implementálja a véletlenszám generálást, stb.


Lehet persze ezt még bonyolítani, de szerintem ennyivel is meg lehet oldani,

2013. aug. 27. 13:00
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:
Ha nem a Form osztályban szeretnéd kezelni az eseményt, akkor tedd publikussá a PictureBox objecteket és így abban az osztályban is elérhetöek lesznek a Click eventek, amelyikben példányosítod (lehet, hogy nem ez a magyar szó rá) a Form objectjét. De tudsz saját eventeket is definiálni, ahhoz egy kicsit több kód kell. A C# eventhandlingje alapvetöen az Observer patternnel müködik, a te esetedben a Form osztály regisztál a 3 PictureBox Click eventjére és "értesítést" kap, ha az bekövetkezik.
2013. aug. 27. 13:04
Hasznos számodra ez a válasz?
 3/9 A kérdező kommentje:

Először is köszönöm a választ!

Igen a problémám nem is ezzel a részével van. Hanem a Foegyseg() metódussal. Ha a Játékos jon akkor nem tudom mit kezdjek vele, mert a program ebben a szakaszban arra vár, hogy egy OnClick esemény bekövetkezzen, de ezt nem tudom hogy megírni.

A gép esetén ugye egyértelmű:

Foegyseg()

{

if(valtozo % 2 == 1)

Generálj számot, nézzük jó e

else //most jön a játékos

várj Onclick eseményre--> na ezt nem tudom, hogy írjam meg

}

2013. aug. 27. 13:17
 4/9 anonim ***** válasza:
Nem kell az Click eseményre való várakozást külön kóddal defininiálni, ha duplán klikkelsz a Designer nézetben a PictureBoxra, akkor létrehozza a szükséges kódot. Neked már csak definiálnod kell, hogy mi történjen a Click esemény esetén.
2013. aug. 27. 13:23
Hasznos számodra ez a válasz?
 5/9 A kérdező kommentje:

Kicsit kibővítem a metódust, mert így nem sok értelme lenne:


Foegyseg()

{

do{

if(valtozo % 2 == 1)

Generálj számot, nézzük jó e

else //most jön a játékos

várj Onclick eseményre--> na ezt nem tudom, hogy írjam meg

while(amíg valaki el nem éri a 20 pontot);

}


és itt látszik, ha nem írom meg a várakozás eseményre részét akkor a gép jól eljátszik magával vagy végtelen ciklust készítek

2013. aug. 27. 13:26
 6/9 anonim ***** válasza:
Tkp. mindegy, hogy a Click esemény elött számítod ki, hogy melyikben legyen a "piros", vagy a játék indításakor. a Click eventhandlerében is megtehedted ezt vagy egyszerüen tárolod egy változóban és kiolvasod a változó tartalmát a Click esemény után. A Foegyseg()-ben (nem teljesen helyes fonevvel illetni egy metodust, mert ez object vagy osztály látszatát kelti) nem kell "várakoznod", a Form automatikusan értesítést kap a PictureBox objecttól, ha bekövetkezik a Click.
2013. aug. 27. 13:27
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:
Ne egy végtelenített looppal dolgoz, ennek semmi értelme. Várd meg a Click eventröl kapott értesítést és csak utána számold ki az eredményt. A C# event-driven. Nem kell egy végtelenített ciklusban "szaladgáltatnod" a programot és egy "interrupt"-ra várni.
2013. aug. 27. 13:30
Hasznos számodra ez a válasz?
 8/9 A kérdező kommentje:

Azt hiszem értem mire gondolsz, hagyjam a vezérlés dolgot és inkább az ellenőrzés részt írjam úgy meg, ha a játékos van soron ellenőrizzen, ha pedig nem akkor ne.

Köszi a választ!

2013. aug. 27. 13:33
 9/9 anonim ***** válasza:

A programot a játékos irányítja, mert tkp. ö indítja el a Click eventet, azzal, hogy a képre kattint. Neked csak kezelned kell ezt az eseményt. Ha éppen nem csinál a játékos semmit, akkor a programod se csinál semmit (ez persze nem igaz, de nem kell egy végtelenített ciklusban másodpercenként kétmilliószor körbe-körbe futkorásznia, abban reménykedve, hogy valamikor hátha becsúszik egy klikk). Amíg nem történik semmi, addig tkp. Az Application.Run(...) részében vagy a kódnak. Ez nyit meg egy message pump-ot (ami számodra lényegtelen, de kb. ez a programod "ütöere"), létrehoz egy ablakot, rápakolja a control elemeket, ezek akkor is jól "elvannak", ha éppen a felhasználó az orrát piszkálja. Ha csinál valamit, akkor a control elemek jelentik a Form (vagy bármilyen más object) felé, hogy "Apafej, megböktek, csináljál valamit!". A Form (vagy más osztály objectje) pedig megkeresi azt a metódust, ami kezeli az eseményt, ennek az elöfeltétele csupán annyi, hogy a Form osztály "feliratkozik" az eseményre és így értesítést kap. A control elem maga fogja "elkurjantani" magát, ha bekövetkezik valamilyen esemény és ezzel értesít minden más objectet, amelyiknek tudnia kell róla. (Ezt a kódot nem látod, mert ez a System.dll-ben (vagy akármelyikben) van és ennek a kódja nem nyilvános. A neked lényeg annyi, hogy definiáld melyik control elem melyik eseményére akarsz feliratkozni és ha bekövetkezik mit szeretnél csinálni.


Tudsz saját eventeket is defininálni, ebben az esetben az összes kódot neked kell írnod. Kiindulásnak ez jó: [link]

2013. aug. 27. 13:45
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!