Informatika gyűjtemény

Egy szinttel feljebb Megoldás

2004050607080910

NézetNyomtat

A Klickety megvalósítása

tervezés felülről lefelé

Megadjuk a játékprogram fő szerkezetét, majd folyamatosan finomítjuk az eljárásokat. Első nekifutásra a következő tervet fogalmazhatjuk meg:
Kezdeti állás létrehozása
Ciklus amíg lehet_lépni
    Be( következő_lépés )
    Lép( következő_lépés )
Ciklus vége
Végeredmény kiírása
A játék tábláját egy 16x10-es tömbben tároljuk, a tömbelemek értéke az adott pozíción lévő négyzet színe, vagy nulla, ha üres a pozíció. A lehet_lépni függvény akkor ad igaz értéket, ha van két élszomszédos, azonos színű mező a táblán. Ez egy egyszerű dupla ciklusban ellenőrizhető. A lépés egy (sor,oszlop) párral írható le, tehát ezeket az adatokat kell beolvasni a következő_lépés olvasásakor. Következzen tehát a Lép(s,o) eljárás finomítása:
Lép(s,o):

Ha tartomány(s,o)
akkor 
    sz := tábla[s,o]
    kijelöl(s,o,sz)
    potyogtat
    eltol
Elágazás vége
A tartomány(s,o) függvényben megnézzük, hogy a "klikkelt" mezőnek van-e azonos színű szomszédja. Ha igen, akkor egy rekurzív eljárás segítségével "kinullázzuk" az eltűnő négyzetek helyét. Ezután a potyogtat eljárás minden oszlopra lefele potyogtatja a négyzeteket, ha keletkeztek üres mezők, végül az eltol balra tolja az oszlopokat, ha vannak üres oszlopok. Lássuk a részleteket:
kijelöl(s,o,sz):

tábla[s,o] := ÜRES
Ha s + 1 <= 16 és tábla[+ 1, o] = sz 
    akkor kijelöl(s+1,o,sz)
Elágazás vége
Ha s - 1 >= 1 és tábla[- 1, o] = sz 
    akkor kijelöl(s-1,o,sz)
Elágazás vége
Ha o + 1 <= 10 és tábla[s, o + 1] = sz 
    akkor kijelöl(s,o+1,sz)
Elágazás vége
Ha o - 1 >= 1 és tábla[s, o - 1] = sz 
    akkor kijelöl(s,o-1,sz)
Elágazás vége
Miután megjelöltük az eltűnő négyzeteket (ÜRES-re állítva értéküket), lefelé léptetjük a "lepotyogó" elemeket. A potyogtat eljárás minden oszlopra meghívja a le eljárást. Ennek lényege az, hogy egy oszlop aljától indul, és egyesével haladva felfelé, számolja az üres helyeket. Ha nemüres mezőhöz ér, lefele lépteti annyival, amennyi az eddig megtalált üres mezők száma, és "kinullázza" ezt a mezőt. ((c) Treszkai László)
le(oszlop):

darab := 0
Ciklus j := 16-tól 1-ig
    Ha tábla[j,oszlop] <> ÜRES akkor
        Ha darab > 0 akkor
          tábla[+ darab, oszlop] := tábla[j, oszlop]
          tábla[j, oszlop] := ÜRES
        Elágazás vége
    különben
        darab := darab + 1
    Elágazás vége
Ciklus vége
Az eltol eljárás teljesen hasonló elv alapján működik. A legalsó sorban ÜRES mezőket keresünk balról jobbra haladva, számoljuk az üres helyeket, és a nemüres oszlopokat balra léptetjük annyival, ahány üres oszlopunk volt eddig.

Megoldások


További megoldások