Python program rengeteg "if" nélkül?
Ez lenne a feladat :
Írjon egy programot, amiben több, különböző színű labda mozog, amik egymásról és az oldalfalakról
visszapattannak.
A kérdés az, hogy a labdák egymásról való visszapattanását hogy lehetne megfogalmazni ?
Muszáj rengeteg if használatával, vagy van rövidebb megoldás ?
Mit értesz rengeteg IF alatt?
A labdákat egy listában tárolod és két for ciklussal végigmégy a listán és megnézed, hogy a labdák milyen távol vannak egymástól. Ha a távolság egyenlő v. kisebb mint a két vizsgált labda sugara, akkor számolsz egy ütközést az épp aktuális irányokból és kiszámolod az új irányvektorokat.
Gérard Swinnen könyve alapján haladok, és abban még nem volt szükség for ciklusra.
for-nélkül megoldható esetleg ?
Vagy ha összefoglalnád a működését, azt megköszönném.
Ha tudod, hogy hány tested van, akkor igen. Ha nem tudod, akkor nem tudod for nélkül megoldani.
Érdekesnek találom, hogy ilyen szintű feladatot kell megcsinálni és a ciklusokról még nem volt szó.
Azért a for-t javasoltam, mert tömbökön tipikusan ezzel a számlás ciklussal szoktunk végigmenni.
Mindhárom ciklussal (for, while, do-while) ugyan azokat lehet megcsinálni, csak valamelyikkel bizonyos feladatok elegánsabbak, könnyebben olvashatóak.
A while-ciklus-t már ismerem, a for-t még nem.
Tudom, hogy hány test van (3). Írna valaki egy ciklust, ami legalább eligazít ?
For ciklus kell hozzá, mégpedig egy speciális nested-loop.
A nested-loop azt jelenti, hogy a két ciklus egymásba van ágyazva. Példa:
for i in range(0, n):
for j in range(0, n):
doStuff()
A példában szereplő 'doStuff()' összesem n^2-szer fog lefutni.
Ami neked kell azért speciális mert nem kell minden elemet vizsgálni, mivel ütközést vizsgálsz. Magyarán ha a 12. labdáról kiderül, hogy ütközött a 76. labdával, akkor nem kell megvizsgálni a 76.-12. párost. Sőt egy labda önmagával nem ütközhet. Mindezt figyelembe véve a vizsgálatok száma:
(n^2 - n) / 2
Kódban valahogy így festhet a dolog:
for i in range(0, n):
for j in range(0, n):
collosionData = detectCollosion(labdak, i, j)
labdak[i].collide(collosionData)
labdak[j].collide(collosionData)
Feltételezve, hogy létezik olyan 'detectCollosion()' függvény, ami ütközést vizsgál egy 'labdak' tömb , i és j eleme között, majd visszatér az eredménnyel. Az eredmény lehet komplexebb is (logikai eredmény, normális tangenciális komponens, erő, csillapítás, stb...). Valamint a 'labdak' elemei olyan osztályok, ahol létezik a 'collide()' metódus, ami a 'detectCollosion()' eredményét felhasználva megvalósítja a labda pályagörbéjének módosítását.
Ki kell javítanom magamat, a második programrész hibádzik. A második range, csak i-ig megy, ez adja a labdak páros elemek mátrixának a háromszög alakot.
for i in range(0, n):
for j in range(0, i):
collosionData = detectCollosion(labdak, i, j)
labdak[i].collide(collosionData)
labdak[j].collide(collosionData)
A "kell" az erős túlzás.
Alapvetés, hogy ami for ciklussal megvalósítható, az while ciklussal is.
A for ciklustól kényelmesebb és átláthatóbb lesz a kód, de egyáltalán nem nélkülözhetetlen.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!