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