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

Finite State Machine i prosledjivanje parametara

[es] :: Pascal / Delphi / Kylix :: Finite State Machine i prosledjivanje parametara

[ Pregleda: 1602 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Finite State Machine i prosledjivanje parametara28.11.2011. u 04:25 - pre 151 meseci
Pisem AI koji ce biti u stanju da igra 2x2 soccer, koji je turn-based (http://bubblecup.org/bubblebot.php)

Imam jednu glavnu klasu u kojoj se nalaze sledece podklase:
Ball : TBall - podaci o lopti
Players : Array[0..PLAYER_PER_TEAM * 2 - 1] of TSoccerPlayer - array TSoccerPlayer klasa, sadrzi podatke o igracima

Napisao sam finite state design pattern na kome je TSoccerPlayer klasa zasnovana.
Dakle, TSoccerPlayer nasledjuje TMovingEntity, ona nasledjuje TBaseGameEntity, a ona nasledjuje TAIEntity klasu, koja je u stvari finite state machine.
Cela poenta ovoga je da mogu da menjam ponasanje igraca, recimo, kazem:

Players[0].ChangeState(TAIState_SoccerPlayer_DefendGoal)

i taj igrac ce preuzeti ulogu golmana.

Sve ovo radi, dakle setovani Enter(), Execute() i Exit() eventi se izvrsavaju, ali kako da prosledim ostale parametre tim eventima?
Recimo, ako je za igraca 0 setovan DefendGoal state, kada pozovem Players[0].Update, izvrsi se TAIState_SoccerPlayer_DefendGoal.Execute() event, kome se prosledi referenca ka Players[0].
Dakle, ja u tom eventu imam referencu ka igracu koji poziva taj event, ali kako da dodjem do podataka koji se nalaze u glavnoj klasi (podaci o lopti, ostalim igracima itd itd...) ?
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Finite State Machine i prosledjivanje parametara28.11.2011. u 20:10 - pre 150 meseci
Nisam bas siguran da sam te najbolje razumeo, ali po meni je ovde osnovno pitanje sta jos znas o klasama koje si nabrojao...? Koje su njihove osobine (atributi, properties), kako su metode deklarisane, a kako implementirane, i sta je od osobina/metoda oznaceno kao private/protected/public/published? Kako se instanciraju objekti "glavne" klase? Sta su "podklase", jesu li to atributi (properties) "glavne" klase?
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Finite State Machine i prosledjivanje parametara28.11.2011. u 22:25 - pre 150 meseci
Pitanje se svodi na ovo:

Recimo da imam A klasu i B klasu koja nasledjuje klasu A. Kako da prosledim referencu A klase B klasi, tj da mogu iz B klase da pozivam metode A klase ?

Recimo:

Code:

TKlasaA = class
private
public
  procedure NekiMetod;
end;

TKlasaB = class(TKlasaA)
end;

...

TKlasaB.Metod()
begin
  A.NekiMetod; // <<< ?
end;
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Finite State Machine i prosledjivanje parametara28.11.2011. u 23:52 - pre 150 meseci
Pa tako kazi :)

E sad, ako je metoda public kao sto si naveo u primeru, onda ne znam sta te buni, nema potrebe za bilo kakvim prosledjivanjem referenci, to bi jednostavno odradio pozivom B.NekiMetod() (gde je B objekat tipa TKlasaB), zato sto TKlasaB nasledjuje sve od TKlasaA, pa je B.NekiMetod() isto sto i A.NekiMetod() (nema potrebe da pozivas B.Metod() kojim ces pozvati A.NekiMetod()).

Medjutim, ako tvoja TKlasaB ima svoju implementaciju metode NekiMetod() koja se razlikuje od implementacije klase roditelja metode NekiMetod(), onda bi metodu roditelja pozvao npr. na ovaj nacin:
Code:
TKlasaB.NekiMetod()
begin
  inherited NekiMetod(); // <<<  ovde pozivas metodu roditelja, u tvom slucaju TKlasaA.NekiMetod()
end;

Ovo se najcesce koristi kod konstruktora klase (ili destruktora), gde unutar svog konstruktora npr. prvo pozivas konstruktor klase roditelja (kako bi bio siguran da ce sve neophodno objektu te klase biti odradjeno kako treba), a zatim odradjujes dodatna podesavanja nephodna samo za klasu naslednika.
Primer:
Code:
// Create a fruit object - parameterless version
 constructor TFruit.Create;
 begin
  // Execute the parent (TObject) constructor first
  Inherited;  // Call the parent Create method

  // Now set a default fruit name
   self.name := 'Fruit';
 end;

Ali kao sto rekoh, ako je u pitanju nasledjivanje public metoda, nema potrebe ni za kakvim vratolomijama, klasa naslednik nasledjuje sve metode klase roditelja. Cak i da imas ovu situaciju:
Code:
TKlasaC = class
public
  procedure NekiMetod();
end;

TKlasaB = class(TKlasaC);

TKlasaA = class(TKlasaB);

A: TKlasaA;

... opet bi mogao jednostavno da pozoves A.NekiMetod(), u tome i jeste lepota nasledjivanja ;) Ali, uzmimo da ja jos uvek nemam neko preterano iskustvo, sacekaj da vidis moze li ti neko iskusniji vise pomoci.

Zanima me, u primeru koji si dao, sta je problem da pozoves B.NekiMetod() (sto je isto kao da si pozvao A.NekiMetod())?

p.s. Postoji i mogucnost da uradis nesto tipa (B as TKlasaA).NekiMetod(), cime ces kroz objekat B pozvati NekiMetod() ne klase TKlasaB, vec klase roditelja TKlasaA. Medjutim, ako je unutar TKlasaB metod NekiMetod() obelezen sa override, onda ces svejedno opet pozvati (samo) metod NekiMetod() klase TKlasaB.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Finite State Machine i prosledjivanje parametara29.11.2011. u 00:09 - pre 150 meseci
Ja se izvinjavam, opet nisam objasnio dobro problem.. Pisao sam AI bota danas do 6 ujutru, spavao do 10, i opet ceo dan pisao.. :) Elem, aj opet da pokusam da objasnim sta mi treba:

Code:

TKlasaA = class
public
  klasaB : TKlasaB;
end

TKlasaB = class
private
public
end

...

TKlasaB.NekaMetoda()
begin
  // kako ovde dobiti referencu ka klasi A ?
end;


Napominjem da klasa A i B nisu u istom unitu, dakle imam UnitA i UnitB. U UnitA moram da stavim uses UnitB, kako bih mogao ta deklarisem klasaB : TKlasaB, ali onda u unitu B ne mogu da stavim uses A i deklarisem referencu ka klasi A, jer onda dobijam circular reference.
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Finite State Machine i prosledjivanje parametara29.11.2011. u 01:42 - pre 150 meseci
Kada dodjes u situaciju da imas ovakav problem to obicno znaci da nisi dobro zamislio resenje svog problema :) Na primer - stavi obe klase u jedan (treci) unit, koji ces zatim staviti u uses prva dva unit-a. Mada, mislim da svoj problem mozes resiti ako u UnitB stavis UnitA ali ne u prvom uses delu, vec u drugom, odmah nakon reci implementation. Primer:
Code:
unit UnitB;

interface 

uses ...; // ovi unit-i ce biti dostupni svim unit-ima koji koriste UnitB

type ...;

var ...;

implementation

{$R *.dfm} // ovo imas ako unit ima formu

uses UnitA, ...; // ovi unit-i ce biti dostupni samo unit-u UnitB, pa nema problema sa circular reference

Svejedno razmisli o preispitivanju svoje logike vezane za konkretan problem.

Vezano za tvoj primer, koliko sam shvatio, TKlasaA i TKlasaB ipak nemaju veze jedna sa drugom (sto se nasledjivanja tice), osim sto TKlasaA poseduje atribut tipa TKlasaB, a ti bi hteo da metoda objekta klase TKlasaB radi nesto sa metodom objekta TKlasaA. Opet se postavlja pitanje logicnosti ovoga sto zelis da postignes, ali resenje deluje prosto:
Code:
TKlasaB.NekaMetoda(Apom: TKlasaA);
begin
  Apom.NekaDrugaMetoda();
end;

Ako je B objekat klase TKlasaB, a A objekat klase TKlasaA, metodu pozivas sa B.NekaMetoda(A). Obrati samo paznju da je ime objekta zapravo samo referenca objekta, sto znaci da objekat Apom unutar B.NekaMetoda() procedure jeste isti onaj objekat A koji si prineo kao parametar, a ne njegova lokalna kopija. Sta god da uradis sa objektom Apom unutar svoje procedure B.NekaMetoda() odrazice se na sam objekat A (koji i dalje postoji i van te procedure).

Eto, ne znam jesmo li se ovog puta razumeli, ali ako nismo, slobodno objasnjavaj dalje :)) Mozda ti je vec ono drugo uses sa pocetka posta resilo problem, ili ti zapravo nemas referencu objekta A (ne znas gde se kreira), pa pokusavas da kroz property B objekta A nadjes referencu samog objekta A ciji je objekat B property...?
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Finite State Machine i prosledjivanje parametara29.11.2011. u 13:45 - pre 150 meseci
Problem je u tome sto imam deadline to petka 8:00AM da predam AI bota, pa nemam bas vremena da realizujem sve "po propisu". Ja imam klasu TBot i TPlayer, gde TBot poseduje TPlayer unutar sebe, tj ima je deklarisanu kao

Code:

TBot = class
private
  FPlayers : Array[0..PLAYERS_PER_TEAM * 2 - 1] of TPlayer;
...


Resio sam ovo tako sto sam napravio novi unit samo kako bih deklarisao bot : TBot promenljivu tu, i onda sam includovao taj unit u TPlayer unitu. Znam da nije najelegantnije resenje, ali jbga :)
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Finite State Machine i prosledjivanje parametara

[ Pregleda: 1602 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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