Néhány példaprogram, mely bemutatja a Pawn programozási nyelv elemeit.
Alapvető nyelvi elemek
Az alábbi egyszerű mintaprogram a Pawn nyelv alapvető elemeit mutatja be.
Az alkalmazás egy magyar kártyacsomagból képez adott számú kisebb csomagokat,
oly módon mintha játékosoknak kerülnének a lapok kiosztásra.
Az alkalmazás konstans értékeket tartalmaz a lapok színeinek és értékeinek
tekintetében. Az ezekből következő lapszám is egy konstans, illetve a kiosztandó
lapokat is konstansnak tekintjük. Ezek definiálását a main függvény előtt találhatjuk.
A programozás egy szimbolikus indexű tömböt is tartalmaz ami a kártyalapot
megvalósító struktúrát reprezentálja. Ennek három "tulajdonsága" van, melyből kettő
a lap színére és értékére vonatkozik és egy a kiírandó kártyalap nevére. Erre
optimalizációs célból van szükség. Ezt a csomag létrehozásakor töltjük ki, hivatkozva
a konstans tömbelemek értékeire.
Az alkalmazás három fő részből áll. Elsőként létrehozzunk a kártyacsomagot. Két
iteráció egymásba ágyazásával készül. A külső iteráció a színeken megy végig, a belső
meg az értékeken. Az egyes iterációkban állítjuk be a kártyára vonatkozo értékeket
köztük a nevet is.
A második fázis a csomag összekeverése, mivel egy sorba rendezett csomagot generáltunk.
A módszer egyszerű: 1000-szer kiválasztunk két kártyát, melyet felcserélünk a csomagban.
A cserét egy külső függvényben hajtjuk végre, reprezentálva a függvényhívási módszert is.
A harmadik fázis a kis csomagok képzése. Ez is két iterációban történik szimulálva az
egy lapos osztás módszerét. A külső iteráció a csomagbeli lapszámon megy végig, míg a
belső a kis csomagok számán (egy ide, egy oda elv).
Miután ezekkel megvagyunk kiírjuk a kis csomagokban megtalálható lapok neveit.
Mintaprogram a PAWN nyelv legtöbb elemének bemutatására.
Akik programoztak már C-ben azok sok újat nem fognak találni, egyedül a szintaktikai egyszerűséget, amiket a gyors kódolás és átláthatóság végett vezettek be.
Több egyedi elem is bemutatásra kerül, többek között:
Statek kezelése
Eseményvezérlés
Timerek
Leginkább a state-ek, s a vele jaró egyszerűsítések lesznek itt a szokatlan dolgok.
A minta alkalmazás útkereszteződésben lévő közlekedési lámpák működését mutatja be.
Az alkalmazással nyomon követhető, mikor milyen állapotban vannak a lámpák, illetve a gyalogosok megnyomhatják az átkeléshez szükséges gombot (space).
Kezdetben az autósoknak zöld, míg a gyalogosoknak piros a lámpája.
A gyalogosok a gomb megnyomásával megváltoztathatják kis időre a forgalmat.
Ekkor a szokványos lámpaváltások történnek, konkrétabban:
Zöld-Piros => Sárga-Piros => Piros-Piros => Piros-Zöld (Első az autósoknak, míg a másik a gyalogosoknak a lámpájának állapotát jelzi)
Ebben az állapotba tudnak átkelni a gyalogosok, erre 5 másodpercük van.
Annak elteltével Piros-Villogó Zöld állapotba jutunk.
A gomb újboli megnyomásával mindig visszatérünk a Piros-Zöld állapotba, s újraindul az 5 másodperc.
Amennyiben nem nyomjuk le kellő időben a gombot, akkor az alábbi váltások zajlanak le a lámpákon:
Piros-Piros => Piros és Sárga- Piros => Zöld-Piros.
Ezek alapján az alábbi állapotokat veheti fel a program:
zold_piros
sarga_piros
piros_piros1
piros_piros2
piros_zold
piros_villogo_zold
piros_es_sarga_piros
Az állapotváltásokat timerrel oldjuk meg. Alapjáraton a zold_piros állapotban vagyunk, ez reprezentálja a Zöld-Piros állapotot.
Ekkor az autósoknak szabad az út.
A gomb (space) megnyomásával elindul a körforgás: Minden állapotváltást automatikusan újabb álapotváltás követ, emiatt minden állapot változáshoz rendelünk egy entry függvényt. Ez mindig akkor fut le ha állapotváltozás történik.
Állapotonként vesszük fel, így minden egyes állapotban más állapotváltozást kezdeményez.
Ezt úgy lehet elképzelni, mint egy rekurzív függvényhívás történne.
gomb megnyomásakor egy timer állítódik be, ami lefutáskor újabb időzítőt és állapotot állít be. Ez addig tart, amíg vissza nem térünk a kezdeti állapothoz.
// ------------------------------------------------------------------
// PAWN Mintaprogram - Keszitette: Kereszti Krisztián
// ------------------------------------------------------------------
//
// Mintaprogram a PAWN nyelv legtobb elemenek bemutatasara.
// Akik programoztak mar C-ben azok sok ujat nem fognak talalni, egyedul a szintaktikai egyszeruseget,
// amiket a gyors kodolas es atlathatosag vegett vezettek be.
//
// Tobb egyedi elem is bemutatasra kerul, tobbek kozott:
// - Statek kezelese
// - Esemenyvezerles
// - Timerek
//
// Leginkabb a state-ek, s a vele jaro egyszerusitesek lesznek itt a szokatlan dolgok.
//
// A minta alkalmazas utkeresztezodesben levo kozlekedesi lampak mukodeset mutatja be.
// Az alkalmazassal nyomon kovetheto, mikor milyen allapotban vannak a lampak, illetve a gyalogosok megnyomhatjak az atkeleshez szukseges gombot (space).
// Kezdetben az autosoknak zold, mig a gyalogosoknak piros a lampaja.
// A gyalogosok a gomb megnyomasaval megvaltoztathatjak kis idore a forgalmat.
// Ekkor a szokvanyos lampavaltasok tortennek, konkretabban:
// Zold-Piros => Sarga-Piros => Piros-Piros => Piros-Zold (Elso az autosoknak, mig a masik a gyalogosoknak a lampajanak allapotat jelzi)
// Ebben az allapotba tudnak atkelni a gyalogosok, erre 5 masodpercuk van.
// Annak elteltevel Piros-Villogo Zold allapotba jutunk.
// A gomb ujboli megnyomasaval mindig visszaterunk a Piros-Zold allapotba, s ujraindul az 5 masodperc.
// Amennyiben nem nyomjuk le kello idoben a gombot, akkor az alabbi valtasok zajlanak le a lampakon:
// Piros-Piros => Piros es Sarga- Piros => Zold-Piros.
//
// Ezek alapjan az alabbi allapotokat veheti fel a program:
// zold_piros
// sarga_piros
// piros_piros1
// piros_piros2
// piros_zold
// piros_villogo_zold
// piros_es_sarga_piros
//
// Az allapotvaltasokat timerrel oldjuk meg. Alapjaraton a zold_piros allapotban vagyunk, ez reprezentalja a Zold-Piros allapotot.
// Ekkor az autosoknak szabad az ut.
// A gomb (space) megnyomasaval elindul a korforgas:
// Minden allapotvaltast automatikusan ujabb alapotvaltas kovet, emiatt minden allapot valtozashoz rendelunk egy entry fuggvenyt.
// Ez mindig akkor fut le ha allapotvaltozas tortenik.
// Allapotonkent vesszuk fel, igy minden egyes allapotban mas allapotvaltozast kezdemenyez.
// Ezt ugy lehet elkepzelni, mint egy rekurziv fuggvenyhivas tortenne.
// Gomb megnyomasakor egy timer allitodik be, ami lefutaskor ujabb idozitot es allapotot allit be.
// Ez addig tart, amig vissza nem terunk a kezdeti allapothoz.
#include