Clovece nezlob se - Semstralka z VTP2

Tak tady mame novou obludnost v podobe my novy semetralky. Boze div se je to Clovece nezlob se !!!! . A verte ze sem se pri tom nazlobil :-) . Takze si to nahrajte a pak mi reknete jak je to blby.

 
 
download (210  Kb )
 
 

Nebo pro fansmekry tady mam  i zdrojaky pro Delphi4   TOHLE (42 Kb)

 

Pripadne jestli se fakt hodne nudite tak si muze precist to dole , to ma bejt jako dokumentace k tomu.

 

Ukolem bylo vytvorit program simulujici hru clovece nezlob se , kde bude moci hrat jak clovek , tak i nekolik typu pocitacovych hracu.

Nevim jestli se mi povedlo vystihnout spravna pravidla clovece , protoze jsem se vecinul ridil vzpominkama ze svych mladsich let a tomu taky viceme odpovidaji strategie jednotlivych hracu.

Puvodni predstava struktury programu spocivala zhruba v tom , ze krome nejakych stadartnich komponentu Delphi z kterych sem vytvoril uzivatelske rozhrani , bude program obsahovat nejakou instanci nazvanou spravce hry , ktera se bude starat o to kolik hraje hracu , kdo je na tahu a o provadeni tahu na hraci plose. Potom jsem se snazil vytvorit instance pro jednotlive hrace a to podle typu jejich taktiky , takze konkretne mam instanci clovek (necekane zastupujici ziveho hrace klikajiciho mysi) , potom pocitac - lidumil (mensi asociace z detstvi kdyz me maminka za kazdou cenu nechavala vyhrat , takze se proste za kazdou cenu snazi nevzit cizi figurku) , dale pocitac - flegmatik (je mu proste vsechno jedno a tahy provadi naprosto nahodne bez ladu a skladu) a konecne pocitac - svine (jeho nejvetsi prioritou je mordovat souperovy figurky). Jak jiz sem zminil tohle byl puvodny zamer , v realu to ale dopadlo tak ,ze sem se nakonec ridil pravidlem "ucel sveti prostredky" a i pres to ,ze jiz vyse zminene instance existuji a snazi se plnit dane funnkce , tak misty muselo byt jejich pole pusobnosti vyrazne rozsireno nebo naopak zuzeno .

Abych se dostal ke konkretnimu provedeni programu.

1) Za prve sem v Delphi 4 vytvoril jakesi uzivatelske rohrani ,ktere obsahuje bitmapu hraci plochy a jednotlivych figurek , standartni menu , jedno okno umoznujici nastaveni programu a jedno reprezentujici hazeci kostku.

2)Vytvoril sem istanci spravce hry ,ktera pri sve inicializaci vytvori instance jednotlivych hracu podle zadaneho nastaveni.

3)Pri spusteni nove hry se tedy vytvori spravce + vsichni prislusni hraci a potom je po urcitych casovych okamzicich pomoci metody casovace volana metoda spravce.hra , ktera vzdy provede tah jednoho hrace .To znamena ze zavola metodu hraj hrace ,ktery je zrovna na tahu, ta vrati cislo figurky se kterou se bude tahnout a o kolik policek se bude tahnuot. Spravce potom zajisti aby se tah provedl .

4)Pokud je zavolana metoda hraj jednotlyvych hracu , tak ta nejpve zavola svoji metodu hazej ,ktera podle typu hrace bud hodi sama kostkou nebo necha hodit cloveka. Podle typu hrace nasleduje vyber figurky ,kterou se bude tahnout.

To by tak v kostce bylo zhruba princip funkce programu (nedelam si iluze ,ze by se nekdo vyznal v mojem zapisu kodu). Ted bych jeste zminil problemi se kterymi sem se byl nucen potykat.

Prvni a hlavni problem byl v tom , ze sem s Delphi a vubec ve windows programoval poprve. Podle toho to take dopadlo. Nejvetsi obtiz byla adaptovat se na absenci "mainline" a to tim spis ,ze sem potreboval aby muj program neco delal i kdyz se zrovna na nic neklika. Nevim jestli moje reseni je programatorsky korektni ( osobne si myslim,ze je to pekna prasarna) , ale pouzil jsem k tomu jiz vise zmineneho casovace a take hojny vyskyt smycky while podminka do udelejneco; application.processmessage;.

Dalsi a nemensi problem sem mel s tim jak vlastne nejak rozumne reprezentovat hraci plochu. Oproti sachum ,ktere sem delal minuly semestr , to bylo znacne slozitejsi.

Sachy maji vsechny policka ekvivalentni , kdyzto clovece ma spoustu zvlastnosti jako jsou treba startovni pole nebo zajizdeni do domecku. Nakonec jsem se rozhodl pro dvoji interpretaci. Pro potreby vykreslovani figurek na obrazovku mam pole 11x11

,ktere geometricky odpovida hraci plose. Potom , kazdy hrac si drzi informaci o tom , ktere je jeho startovni policko a jednotlive figurky si zase pamatuji kolik urazili od pocatku sve strastiplne cesty (tedy konkretne pokud hrac cislo dve zacina napolicku cislo 11 , tak jeho figurka po urazeni 4 policek ma hodnotu 15) . Aby toho jeste nebylo malo tak mam jedno pole o 56 prvcich z nichz prvnich 40 odpovida normalnim hracim polickum a zbylich 16 startovnim polickum ( 4 hraci x 4 figurky pro kazdyho), ve kterym jsou cisla jednotlivych figurek podle sve plohy. Nevim jestli je to videt z teto struktury , ale neustale jen nutne transformovat geometrickou pozici na pozici "kolik se urazilo od zacatku" a naopak , coz je trochu neprijemne , protoze se mi pro to nepodarilo najit zadnou zavislost , ktera by se dala vyjadrit vzorcem , takze se to deje velmi manualni metodou stylu "kdyz je tvoje pozice [x,y] tak si urazil z od zacatku" a naopak.

To je tak vse co muzu rict k potizim. Jen bych se snad jeste trochu zminil o zpusobu jakym pocitac vybira svuj tah. Jelikoz sem si praci casove spatne rozvrhnul , tak to tato partio odnesla nejvic a je proste dost odbyta a ma podle meho zkromneho nazoru spoustu der ,ktere vyplavou v ten nejnevhodnejsi okamzik. Ono zase na druhou stranu , co se da vymyslet za strategii ve hre , kde skoro vsechno zavisi na nahodnym hodu kostkou. Cele kouzlo tkvi v tom , ze se nejdrive vyhodnoti , kteryma figurkama se vlastne da tahnout a potom se simuluje jako ze se snima tahlo a nasleduje vyhodnoceni situace. Pokud je hrac v modu lidumil ,tak dostava nekrestansky zaporny body za to kdyz vezme cizi figurku. Dalsi zaporny body dostava za to kdyz je v pozici , ze ho nekdo jinej muze vzit (tedy pokud se do sesti policek za nim nachazeji nepratelske figurky). Kladny body dostane pouze pokud si nasadi novou figurku. Na zaver se vyhodnoti kterej tah ma nejvic bodu a ten se provede. Pro hrace flegmatika se tahy proste vybiraj uplne nahodne generatorem nahodnejch cisel. Pokud pocitac hraje jako svine ,tak zase oproti lidumilovy ma kladny body za pleneni souperovych figurek a za to kdyz se dostane do potencionalni pozice , ze by ji v pristim tahu mohl vzit neci figurku (konkretne pokud se nazhazi do 6 policek za nepritelem). Potom ma stejne jako lidumil zaporny body ,kdyz ho nekdo muze vzit.

 

Tot vse a doufam ,ze to bude fungovat po dlouhe leta.