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

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

1. NZH, NHF

Jelentkeztél NZH-ra? Biztos? Ellenőrizted?! Ez az utolsó lehetőség.

Nézted a nagy házik listáját? Választottál feladatot?

Ne feledd, ezek határidős feladatok!

2. 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.

3. 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!

4. 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.
  • Dolgozhatsz a nagy házi feladatodon is.