# 7. hét: vegyes feladatok, gyakorlás

Czirkos Zoltán, Frey Balázs · 2025.10.12.

## 1. Ikerprím

Ikerprímeknek nevezzük azokat a prímszám együtteseket, amelyeknél n és n+2 is prím. Az első 3 ilyen pár (3, 5), (5, 7) és (11, 13). Melyik a 60-adik? Határozd meg Python programban! Használj top-down tervezést, ne duplikáld a prímkereső algoritmust!

Megoldás

    def prim(szam):
        for i in range(2, szam):
            if szam % i == 0:
                return False
        return True

    def main():
        szam = 1
        i = 0
        while i < 60:
            szam += 2
            while not (prim(szam) and prim(szam+2)):
                szam += 2
            i += 1
        print("{}. ikerprim: {} {}".format(i, szam, szam+2))

    main()

Az ikerprímek vizsgálatát lehetne még gyorsítani. A vizsgált számpárok: (5;7), (7;9), (9;11) stb., azaz minden számpár második tagja a következő számpár első tagja. A vizsgálat eredményét el lehetne tárolni egy változóban, és a következő iterációban felhasználni.

Maga a `prim()` függvény is gyorsítható: elég csak a szám gyökéig menni.

## 2. Labirintus játék

A labirintus egy fallal körülvett 10×10-es tábla. A labirintust körülvevő falon egy kijárat található. A labirintusban több kincset rejtettek el. A játékos feladata, hogy összeszedje a kincseket és eljusson a kijáratig.

    XXXXXX XXX
    X*   X   X
    XXXX XXX X
    X        X
    X XXXX XXX
    X X    X*X
    X XX*X X X
    X@ XXX X X
    X   *X   X
    XXXXXXXXXX

A labirintust a fenti formában kell megjeleníteni. A falakat `X` jelzi, a járható részeket szóköz, az elrejtett kincseket a `*` karakter, a játékost pedig a `@`. Ha a játékos felvette, a kincs helyére is szóköz kerül.

Ebben a feladatban az alább látható részfeladatok mind egymásra épülnek, vagyis sorban kell megcsinálnod őket. Minden függvény megírásakor írj egy rövid programrészt a főprogramba, amely meghívja a függvényt – így lépésenként ellenőrizni tudod azt, hogy helyesen működik-e.

### A pálya

Hozz létre egy két dimenziós listát a labirintus tárolására! Tárolja ez a pálya egyes celláit, először sorral, aztán pedig oszloppal indexelve. Alább megadjuk a pályát sztringek listájaként; ezt kell átmásolnod a saját, 10×10-es kétdimenziós listádba úgy, hogy minden listaelem egy karakter legyen:

    kiindulas = [
        "XXXXXX XXX",
        "X*   X   X",
        "XXXX XXX X",
        "X        X",
        "X XXXX XXX",
        "X X    X*X",
        "X XX*X X X",
        "X@ XXX X X",
        "X   *X   X",
        "XXXXXXXXXX",
    ]

### Kirajzolás

Írj függvényt, amely paraméterként veszi a labirintust tároló adatszerkezetet és kirajzolja azt a képernyőre!

### Kincsek száma

Írj függvényt, amelyik megadja, hogy a pályán hány kincs van!

### A játékos mozgása

Írj függvényt, amelyik a játékot vezérli! Ez a következő feladatokat kell végrehajtsa egy ciklusban:

- Kérje be a felhasználótól a mozgási irányt. A felhasználó az A,S,D,W betűk valamelyikét nyomja majd (rendre balra, le, jobbra, fel irányokhoz), utána pedig entert.
- Ellenőrizze ezután, hogy lehet-e arra menni, nem ütközik-e falba a játékos.
- Ha nem, mozgassa, és vegye figyelembe azt is, hogy kincset talált-e, vagy a kijárathoz ért-e.
- Ha üres sort kapott, vagy elérte a kijáratot, akkor vége a játéknak, amúgy rajzolja ki újra a pályát.

### Kincsek száma

Miután vége lett a játéknak, ellenőrizze a program a pályát, és számolja meg, hány kincs maradt!

Megoldás

    def palyat_letrehoz(kiindulas):
        # sztringek listájából pálya. a feladat szerint elég
        # 10×10-esre működnie, de ez működik bármekkorára
        palya = []
        for sztringkent in kiindulas:
            sor = []
            for cella in sztringkent:
                sor.append(cella)
            palya.append(sor)
        return palya

    def kirajzol(palya):
        for sor in palya:
            for cella in sor:
                print(cella, end="")
            print()

    def kincsek(palya):
        db = 0
        for sor in palya:
            for cella in sor:
                if cella == '*':
                    db += 1
        return db

    def jatek(palya):
        # játékos megkeresése. a feladat nem kérte, lehet
        # fix pozícióval is indulni (1 7)
        jx = None
        jy = None
        for y in range(len(palya)):
            for x in range(len(palya[0])):
                if palya[y][x] == '@':
                    jx = x
                    jy = y

        while True:
            be = input("Lépés: ")
            if be == "":
                break
            # új kordináták ezek lesznek
            ux = jx
            uy = jy
            irany = be[0].upper()
            if irany == 'A':
                ux = jx-1
            elif irany == 'S':
                uy = jy+1
            elif irany == 'D':
                ux = jx+1
            elif irany == 'W':
                uy = jy-1
            if palya[uy][ux] != 'X':
                palya[jy][jx] = ' '
                jx = ux
                jy = uy
                palya[jy][jx] = '@'
                kirajzol(palya)
            else:
                print("Nem lehet arra menni")
            # kijárat?
            if uy == 0:
                break

    def main():
        kiindulas = [
            "XXXXXX XXX",
            "X*   X   X",
            "XXXX XXX X",
            "X        X",
            "X XXXX XXX",
            "X X    X*X",
            "X XX*X X X",
            "X@ XXX X X",
            "X   *X   X",
            "XXXXXXXXXX",
        ]

        palya = palyat_letrehoz(kiindulas)
        kirajzol(palya)
        jatek(palya)
        db = kincsek(palya)
        if db == 0:
            print("Megvan az összes kincs!")
        else:
            print("A labirintusban hagytál {} kincset.".format(db))

    main()

A sztringek listává alakítására sok más lehetőség is van. Pl. mivel a sztring iterálható (működik rajta a `for` ciklus is), ezért közvetlenül listává konvertálható:

    def palyat_letrehoz(kiindulas):
        palya = []
        for sor in kiindulas:
            palya.append(list(sor))
        return palya

### Szorgalmi feladat: a kijárat helye

A fenti példában és mintamegoldásban a kijáratot nem jelöli semmilyen karakter; csak a pálya északi részén lehet. Egészítsd ki úgy a programod, hogy a kijáratnak is adsz egy jelet, pl. a `#` karaktert, és oda kell eljutnia a játékosnak!

## 3. További feladatok

- Szorgalmi feladat: a labirintusos játékba építsd be a PyConio modult! Ezzel megoldhatod azt is, hogy színes legyen a kimenet, továbbá hogy ne kelljen minden lépés után entert nyomni.
- Írhatsz további játékokat is.