Algoritmikus gondolkodás

Amikor az ember programozni tanul, a legnehezebb az algoritmikus gondolkodás elsajátítása. Arról van szó, hogy a programunkat a számítógép lépésről lépésre, betűről betűre hajtja végre, és fogalma sincs az összefüggésekről. A legnehezebben kijavítható programhibák azok, amikor semmilyen hibaüzenetet nem kapunk, a program hibátlanul fut, épp csak nem azt csinálja, amit szeretnénk. Amikor egy ilyen hibát végül megtalálok, azt szoktam mondani: „a gépnek mindig igaza van”, mert az, amit én odaírtam, betű szerint azt jelentette, amit a gép végül is csinált. „Viselkedése” azt jelentette: te ezt mondtad, hát ezt csinálom. Azt nem találhatom ki, hogy mit akartál mondani.

Jó példa erre pályafutásom egyik legelső programja, 1987-ben, C16-oson. Olyan teniszprogramot írtam, amilyen a hetvenes évek tévére köthető kis játékgépeiben volt: két ütő (függőleges vonalka) a képernyő két oldalán, és köztük pattog a labda. A képernyő tetejéről és aljáról visszapattan, de oldalt nem, csak az ütőről, ha ott van. Ha nincsen ott, akkor a túloldali játékos kap egy pontot.
  Mindenekelőtt rá kellett jönnöm, hogyan mozgassam a labdát. Akkor még nem csináltam hasonlót, fogalmam se volt a dolog módjáról. A labdának ferdén kellett haladnia a képernyőn, és a széleken, illetve ütőkön visszapattannia. Négyféle iránya lehetett: északkelet, délkelet, északnyugat, délnyugat. Hogy lehetne ezeket könnyedén váltogatni?
  Valamit valamilyen irányba úgy mozgatunk, hogy elszámolunk valamennyitől valamennyiig, ez a szám legyen mondjuk x. A számlálás mindegyik lépésében kirajzoljuk a tárgyat az x által mutatott helyre, és letöröljük arról a helyről, ahol az előző lépésben volt. Ha ferdén akarunk mozgatni, akkor mindkét koordinátát x fogja mutatni. Ha más irányba akarunk menni, akkor az egyik koordinátánál x-et kivonhatjuk a legnagyobb számból, és a labda az ellenkező irányba fog menni. De hogy csináljam a pattogást? Jó ideig törtem a fejemet, mire rájöttem. Tároljuk a labda két koordinátáját x-ben és y-ban, a két koordináta mentén mért haladási irányát pedig xi-ben és yi-ben. Ez utóbbiak lehetnek +1 vagy -1. Minden lépésben hozzáadjuk x-hez xi-t, y-hoz pedig yi-t, ettől x és y aszerint fog nőni és csökkenni, hogy mi az iránymutatójuk előjele. Ha mindkettő pozitív, akkor a labda jobbra lefelé (délkeletre) halad, ugyanis a bal felső sarok a 0, 0 koordinátájú pont. Ha xi pozitív, de yi negatív, akkor jobbra fölfelé. S így tovább. Így már a pattogás is egyszerű. Ha y eléri a megengedett legkisebb vagy legnagyobb értéket, akkor yi előjelét az ellenkezőjére váltjuk: ekkor a labda y irányban sarkon fordul, fölfelé helyett lefelé megy vagy megfordítva, x irányban viszont ugyanúgy halad tovább. Vagyis 90 fokban megpattan.
  Ez volt a bevezető ahhoz, amit mondani akarok, elnézést, de el kellett mindezt mondanom, hogy a lényeg érthető legyen. Tehát a labdám szépen pattogott, nagyszerűen lehetett vele teniszezni a végtelenségig, szó szerint. A labda útja túlságosan kiszámítható volt, kis szemmértékkel meg lehetett becsülni, hogy akár egy-két pattogás után is hova kerül, és odavinni az ütőt. A játékprogramok írásakor gyakori probléma állt elő: a programozástechnikai feladatot szépen megoldottuk, csak a játék lett unalmas.
  Akkor hát, mondtam magamnak, haladjon a labda más szögekben. Eddig pontosan negyvenöt fokos szöget zárt be a vízszintessel, változtassuk meg ezt. Jó, de hogyan?
  Valaki látta küszködésemet, és megkérdezte, tudok-e változtatni a labda sebességén. Tudok, mondtam, de nekem nem más sebesség kell, hanem más pattanási szög. De akkor más lesz a szög, figyeljem csak meg. Nem lesz más, mondtam, és megváltoztattam a labda sebességét: minden lépésnél betettem egy kis várakozást. Tanácsadóm megszemlélte, ahogy a labda lassabban futja be pontosan ugyanazt a pályát, és azt mondta: jé!

Meg kell tanulnunk, hogy a számítógép számára az nem labda. Még csak nem is egy pötty a képernyőn. Egy csomó összeadás és kivonás eredményeként a memória egyes részeire bizonyos értékek kerülnek, máshova pedig másmilyenek. A labda pedig nem engedelmeskedik a fizika törvényeinek, mert a valóságban az nem labda, és nincsenek fizikai törvények. Ha akarjuk, szimulálhatjuk őket, több-kevesebb hűséggel.

»»»»»»