Feladat: S.42 Korcsoport: - Nehézségi fok: -
Füzet: 2009/február, 106 - 107. oldal  PDF  |  MathML 
Témakör(ök): Nehezebb feladat

A szöveg csak Firefox böngészőben jelenik meg helyesen. Használja a fenti PDF file-ra mutató link-et a letöltésre.

Írjunk programot, mely képes a ,,Tetris'' játék következő változatával játszani.
A játéktér egy egységnyi oldalhosszúságú cellákból felépített négyzetrács, melyet oldalról és alulról falak határolnak, felülről azonban nyitott. A játékos a végtelen magasságból véletlenszerűen, egyesével érkező, különféle alakú, egységnégyzetekből összeállított alakzatok egymásra helyezésével egy tornyot épít. Célja, hogy az alakzatokat úgy helyezze el, hogy az idő múlásával ‐ az elemek érkezésével ‐ a torony magassága a lehető legkisebb legyen.
Egy alakzat akkor számít szabályosan elhelyezettnek, ha egyetlen másik alakzatba sem lóg bele, az őt alkotó egységnégyzetek közül viszont legalább egy alulról érintkezik egy korábban elhelyezett alakzattal vagy az alsó fallal, valamint az alakzat elhelyezése megvalósítható egy végtelen magasságban végzett elforgatás és vízszintes eltolás, majd egy függőleges leeresztés egymásutánjaként anélkül, hogy e művelet közben az alakzat bármely más alakzattal átfedésbe kerülne.
A lehetséges hatféle alakzatot az ábécé kisbetűivel azonosítjuk:

 
 

A program futása során a standard be- és kimenetén keresztül, újsorral elválasztott szöveges üzenetek formájában interaktívan kommunikál egy főalkalmazással, mely az alakzatok sorsolását és a lépések ellenőrzését végzi. A főalkalmazás különféle események bekövetkezéséről a játékos programját a standard bemenetre küldött egy-egy üzenet formájában értesíti. Ezek szintaxisa:
start <W>
Egyetlen egyszer, a futtatás legelején érkezik, a játéktér 3W32 szélességét adja meg. Erre a játékosnak nem kell válaszolnia.

item [ojlszi]
Egy új elem érkezését jelzi. Paramétere a felsoroltak közül egyetlen karakter. A várt válasz egy pos üzenet.
A játékos programja egyetlen típusú üzenetet írhat a standard kimenetre, ennek szintaxisa:
pos<bal oldal pozíciója az elforgatás után> <OJE elforgatás, fok>
Az item üzenetre várt válasz az új elem kívánt elhelyezését írja le: az elforgatás után melyik oszlopban legyen a bal széle (1 és W-s+1 közötti egész, ahol s az alakzat szélessége az elforgatás után), és mennyivel forgassuk el az elemet (értéke 0, 90, 180 vagy 270, az óramutató járásával ellentétesen, fokban).

A program a következő elemet leíró üzenetet a standard bemenetére csak azután kapja, hogy az előző elem elhelyezését leíró választ a standard kimenetre kiírta. Figyeljünk arra, hogy valóban a standard be- és kimenetet használjuk, ne a billentyűzetet és/vagy a képernyőt. Az üzenetek végén ne feledjük az újsort, a kimeneti puffert mindig ürítsük az adott válasz kiírása után. Pascal esetén ne használjuk a "Crt" modult, C/C++ esetén a conio.h állományt.
Példaképp tekintsük a mellékelt párbeszédet (dőlttel szedtük a program válaszait).