-
1. Data: 2009-07-27 10:58:47
Temat: IL (rozważania o fail)
Od: "fiR" <p...@p...onet.pl>
drobne rozwazania o fail, skryptach / IL (intermediate language) itp
(bardziej w sumie o fail niz o IL)
Onegdaj wspominalem o regule (próbnej bo nie przemyslanej)
aby argumenty funkcji sprawdzac wewnatrz funkcji juz
po wywolaniu nie przed i ogolniej zeby jak najwięcej
mechaniki programu obslugiwać wewnatrz funkcji.
Względnie ostatnio wspominalem tu o użyteczności faila
- juz nie pamietam wszystkiego dokladnie ale było tam
m in o tym ze o ile trzymac w tablicy szereg instancji
roznych typow to wywolanie jakiejś metody którą obsługuje
część tych instancji powinno sie cicho niepowiesć -
nie być errorem a dać faila - bylo tam dokladniej opisane.
Wczoraj jezdząc na rowerze (moze z tym przesadzam bo boli
mnie mocno serce po boreliozie) rozmyślałem o ew
zaimplementowaniu jezyka skryptowego w grze roguelike
(nic ta skrypterka to w porownaniu z kodem w c
nie wnosi ale byloby to bardzo ciekawe ze wzgledu
na UZYTKOWNIKA) i tez ogolnie o idei skryptów
(bo temat obslugi dzialan postaci na mapie w
grze roguelike daje naprawde ciekawy punkt wyjsciowy do
obmyslania tematu skryptów/IL) i ew mozliwosci
przynajmniej czesciowego pozbycia sie ifów w
takim jezyku skryptowym, czy spostrzezenie
ze w kazdym programie wykonuje sie jakby ruch
dwukierunkowy 'w przód' gdy kod cos wykonuje i 'w
tył' gdy kod coś odczytuje, na przykład każdy if
jest jakby takim krokiem w tył ('readem')
Nie mam tu za wiele do powiedzenia ale z zastanawiania
sie nad tym wyniknela mozliwosc jakby elementow
nieco nowej techniki programowania do rozwazenia
ktora tu moge przedstawić.
Postac jest odpalana cyklicznie w petli i to co sie
dzieje w tej metodzie .onUpdate() moze juz byc
tematem skryptu - postac moze na przykład wypic
potion odnowy zdrowia, uciekac z pola o ile stoi w
ogniu, podniesc przedmiot o ile ma pod nogami jakis
przedmiot itd generalnie jest to realnie lista setek
mozliwych zachowań z okresloną rozumowo kolejnoscią/
hierarchią tych wywołań (bo kolejnośc tych wywolan
swiadczy o inteligencji postaci - jesli stoi w ogniu
to nie powinna jesc chleba ani czytac ksiazki)
normalnie w c kod wyglada w schemacie jakos tak
if(...) uciekaj(...);
if(...) pickUp(...);
if(...) rest(...);
if(...) drink(...);
[[[[[[[[
moj stary zaczatkowy kod (napisany z 7 lat temu)
realnie wyglada tak (moge w sumie tu wkleic jako
ciekawostke, jest to sam elementarny zaczątek - w sumie
niestety o ile teraz mam wiecej doswiadczen z roboty
w programowaniu to co do * skupienia * na kodzie bylem
w lepszej formie i teraz nieustannie boje sie czy
uda mi sie do takiej dobrej (co do skupienia i myslenia
jak CodeManiac) wrócić :-/
void PoruszBota(int i) // no tu sie objawia glownie inteligencja bota
{
int angr=postac[i].postac_cel; // po pierwsze uciekaj
albo gon
if(angr==NIEMA)
{
angr=RozejrzyjSieBocieZaWrogiemWOkolicy(i, 10);
if(angr!=NIEMA) UczynWrogim(i, angr);
}
if (angr!=NIEMA && postac[i].ustos==wrogi)
{
if(typpostaci[postac[i].typ].czymiotacz) TryThrowWKogosPierwszymCoMasz
(i, angr);
IdzKu(i, postac[angr].pozx, postac[angr].pozy); return;
}
if (angr!=NIEMA && postac[i].ustos==przestraszony) { IdzOd(i, postac
[angr].pozx, postac[angr].pozy); return; }
int nro = RozejrzyjSieBocieZaJakasPostaciaWOkolicy(i, 5);
if (nro!=NIEMA)
if(AnimozjaTest(i, nro)) {postac[i].postac_cel=nro; return;}
int nrp = RozejrzyjSieBocieZaJakimsPrzedmiotemNaZiemiiWOkolicy
(i, 5);
if (nrp!=NIEMA)
if (przedmiot[nrp].pozx==postac[i].pozx && przedmiot[nrp].pozy==postac
[i].pozy)
PickUpItem(i, nrp);
else
IdzKu(i, przedmiot[nrp].pozx, przedmiot[nrp].pozy);
else
SlaniajSie(i);
}
]]]]]]]]
pominawszy te dygresje w swietle owego zastanawiania sie w
temacie faila wydaje mi sie ze takie kody mozna by uproscić
(zauwazalna jest akurat wlasnie wielka ilosc ifów) jesli by
dac jako normalna mozliwosc wywolywania funkcji ktore mogą
failnąć o ile nie zajdą specyficzne okreslone warunki
uciekaj(); // jesli trzeba
idz_woda
idz_trawa
pickUp(); // jesli mozna
podnies_ciezkie
podnies_lekkie
drink(); // jesli trzeba
rest(); //jesli trzeba
attack(); //jesli costam
nie przemyslem tego specjalnie poza ogolnym pomyslem ale
pomysl jest w zarysie taki ze implementuje i wypisuje sie
hierarchicznie liste kolejnych mozliwych czynnosci i w
zaleznosci od okreslonej kondycji/sytuacji wiekszosc
z nich da faile a okreslone sie wywolaja, np jesli zadziala
uciekaj to w zaleznosci od typu przeleglego pola
wykona sie idz_woda albo idz_trawa a reszta nizej sie
tez wywola albo nie wywola - np w zaleznosci od wolnego czasu
w turze i innych warunkow, przeniesienie mechaniki ('logiki'
jak niektorzy mowia) z poziomu wywolan na sprawdzanie
kondycji i obslugę faili mogloby chyba znacznie uproscić
tu sprawy - choc nie obmyslalem tego do konca jest to
taki pomysl - raczej do zaimplementowania w skrypcie choć
moze i jako mechanizm w c2. Ew mozna jeszcze pomyslec
o mechanizmie takiego automatycznego łączenia wywoalan
onUpdate()
{
eat() | drink();
pickup() | jump() | sleep();
}
("|" znaczy wywolaj tylko jedną z szeregu - pierwsza ktora
nie da faila)
co przeniosloby troche roboty z wewnwtrznego sprawdzania
kondycji i być moze przydaloby sie jako ogolny mechanizm
pzry kodowaniu z failowanymi funkcjami, choć tutaj w tym
kontekscie (wewnetrzne kondycje na faile)
onUpdate()
{
eat();
drink();
pickup();
jump();
sleep();
}
byloby chyba lepsze
fiR
--
odliczanie do 10 wg fana gwiezdnych wojen:
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 01
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
2. Data: 2009-07-27 21:47:35
Temat: Re: IL (rozważania o fail)
Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>
fiR <p...@p...onet.pl> napisał(a):
>
> drobne rozwazania o fail, skryptach / IL (intermediate language) itp
> (bardziej w sumie o fail niz o IL)
A może tak:
class Akcja {
bool test() = 0;
void wykonaj() = 0;
};
class Bieg : Akcja {
bool test() { ... };
void wykonaj() { ... };
}
class Drink : Akcja {
bool test() { ... };
void wykonaj() { ... };
}
..........
Akcja *a[10] = { new Bieg, new Drink, .... };
for( i=0 ; i<10 ; i++ )
if( a[i]->test() )
a[i]->wykonaj();
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
3. Data: 2009-07-28 08:46:09
Temat: Re: IL (rozważania o fail)
Od: "fiR" <p...@p...onet.pl>
> fiR <p...@p...onet.pl> napisał(a):
>
> >
> > drobne rozwazania o fail, skryptach / IL (intermediate language) itp
> > (bardziej w sumie o fail niz o IL)
>
> A może tak:
>
> class Akcja {
> bool test() = 0;
> void wykonaj() = 0;
> };
>
> class Bieg : Akcja {
> bool test() { ... };
> void wykonaj() { ... };
> }
>
> class Drink : Akcja {
> bool test() { ... };
> void wykonaj() { ... };
> }
>
> ..........
>
> Akcja *a[10] = { new Bieg, new Drink, .... };
>
> for( i=0 ; i<10 ; i++ )
> if( a[i]->test() )
> a[i]->wykonaj();
>
>
> Pozdrawiam
Ładny kod ("jak na c++") i faktycnie implementuje to o czym mówiłem :) -
nie wiem jednak czy probowac implementowac "ową technikę" w swojej gierce czy
programach - na ile jest ona użyteczna i czy nie lepsza niż gąszcz ifów (?)
Ktoś moze coś sądzi na ten temat?
Wogole jednak zaciekawił mnie temat tych "faili" Wie ktoś czy jest
jakis język który wspiera takie "programowanie z failami" (?)
fiR
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
4. Data: 2009-07-28 10:02:42
Temat: Re: IL (rozważania o fail)
Od: Paweł Kierski <n...@p...net>
fiR wrote:
[...]
> onUpdate()
> {
> eat() | drink();
> pickup() | jump() | sleep();
> }
>
> ("|" znaczy wywolaj tylko jedną z szeregu - pierwsza ktora
> nie da faila)
Dokładnie to możesz zrobić za pomocą ||. Operator || jest obliczany od
lewej do prawej, dopóki któryś z członów wyrażenia nie da true w wyniku.
--
Paweł Kierski
n...@p...net
-
5. Data: 2009-07-28 10:20:20
Temat: Re: IL (rozwaĹźania o fail)
Od: "fiR" <p...@p...onet.pl>
> fiR wrote:
> [...]
> > onUpdate()
> > {
> > eat() | drink();
> > pickup() | jump() | sleep();
> > }
> >
> > ("|" znaczy wywolaj tylko jednÄ z szeregu - pierwsza ktora
> > nie da faila)
>
> Dokladnie to mozesz zrobic za pomoca ||. Operator || jest obliczany od
> lewej do prawej, dopoki ktorys z czlonow wyrazenia nie da true w wyniku.
>
No to swietnie nie wiedzilem w ogole o takiej mozliwosci
programowania - wydawalo mi sie ze te sprawy nie są dobrze ustalone.
Czyli z tego co mowisz mozna spokojnie pisac kody w stylu
"( (Pobiegnij() || PobiegnijSzybko() || Idz() ) && ( WyciagnijPistolet() ||
WyciagnijRevolver() ) ) || ChronSie();"
I wszystko bedzie ok?
Pominawszy temat samego "faila" to by dawalo duze uproszczenia
w gąszczu ifów.
fiR
> --
> Pawel Kierski
> n...@p...net
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
6. Data: 2009-07-28 12:06:50
Temat: Re: IL (rozważania o fail)
Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>
fiR <p...@p...onet.pl> napisał(a):
> programach - na ile jest ona użyteczna i czy nie lepsza niż gąszcz ifów (?)
> Ktoś moze coś sądzi na ten temat?
Co tu sądzić... gąszcz if-ów też może być zrobiony przejrzyście i
czytelnie, ale przez wyspecjalizowane funkcje zawsze będzie trochę
lepiej.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
7. Data: 2009-07-28 12:36:24
Temat: Re: IL (rozważania o fail)
Od: A.L. <a...@a...com>
On Mon, 27 Jul 2009 12:58:47 +0200, "fiR"
<p...@p...onet.pl> wrote:
>
>drobne rozwazania o fail, skryptach / IL (intermediate language) itp
>(bardziej w sumie o fail niz o IL)
>
>Onegdaj wspominalem o regule (próbnej bo nie przemyslanej)
>aby argumenty funkcji sprawdzac wewnatrz funkcji juz
>po wywolaniu nie przed i ogolniej zeby jak najwięcej
>mechaniki programu obslugiwać wewnatrz funkcji.
>
Zdaje sei ze odkrywasz zarowke. Czy slyszales o programming by
contract?... Jak nei to se poczytaj
A.L.
-
8. Data: 2009-07-28 13:34:43
Temat: Re: IL (rozwa o fail)
Od: Michal Kleczek <k...@g...com>
fiR wrote:
[ciach]
>
> pominawszy te dygresje w swietle owego zastanawiania sie w
> temacie faila wydaje mi sie ze takie kody mozna by uproscić
> (zauwazalna jest akurat wlasnie wielka ilosc ifów) jesli by
> dac jako normalna mozliwosc wywolywania funkcji ktore mogą
> failnąć o ile nie zajdą specyficzne okreslone warunki
>
> uciekaj(); // jesli trzeba
> idz_woda
> idz_trawa
> pickUp(); // jesli mozna
> podnies_ciezkie
> podnies_lekkie
> drink(); // jesli trzeba
> rest(); //jesli trzeba
> attack(); //jesli costam
Mnie sie zdaje, ze nie ma co tutaj wymyslac, bo od opisywania takich rzeczy
jest:
http://en.wikipedia.org/wiki/Finite-state_machine
--
Michal