Programming Contest Nieuwe Stijl: Contest I
Inhoudsopgave
- 1: Inhoudsopgave
- 2: Inleiding
- 3: De opdracht
- 4: Details
- 5: De regels en andere afspraken
- 6: Wat kan ik eigenlijk winnen?
- 7: Om je op weg te helpen
- 8: Tot slot...
Inleiding
In het verleden zijn er, zoals jullie wellicht wel weten, een aantal pogingen geweest om in dit subforum een contest van de grond te krijgen. Helaas strandden die topics meestal vroeg, of in het geval van de meest recente poging laat. Naar aanleiding van een opleving in interesse onder de gebruikers hebben we vanuit de crew besloten om zelf eens een contest op te gaan zetten. We hopen door het zaakje wat strakker te regelen te kunnen zorgen dat iedereen geïnteresseerd blijft.
De opdracht
Goed, nu ik je interesse gewekt heb wil je natuurlijk graag weten wat de bedoeling is. Lees gerust verder.
Het is de bedoeling dat jullie een soort van Tetris-AI gaan maken. Eén voor één komen er blokjes voorbij, en het is de bedoeling dat jouw programma die op de meest geschikte plaats neerzet. Dit is verder niet tijdsgebonden; elke speler krijgt een vooraf bepaalde set met blokjes in een vooraf bepaalde volgorde.
Hoe kunnnen we dan zien wie er het beste programmeert? Simpel: bij het laten vallen van de stenen kun je punten uitdelen. Om het eerlijk te houden moet iedereen daarvoor wel dezelfde scoretabel hanteren. We hanteren de volgende puntenlijst:
- Het plaatsen van een blokje: 10 punten
- 1 lijn: 50 punten
- 2 lijnen: 150 punten
- 3 lijnen: 300 punten
- 4 lijnen: 500 punten
- 5 lijnen: 750 punten
Uiteraard gelden de punten voor het wegspelen van lijnen slechts wanneer je het genoemde aantal lijnen tegelijk wegspeelt. De 10 punten voor het plaatsen van een blok komen nog bovenop de lijnbonussen.
Een lijn die je wegspeelt wordt verwijderd uit het speelveld; eventuele "zwevende blokjes" vallen niet naar beneden maar blijven "zweven":
De score zal bijgehouden worden door een parser die we zelf schrijven, maar je kan natuurlijk zelf ook de score bijhouden in je eigen programma. Let wel; de score die jouw programma aangeeft zal door ons niet bekeken en/of vertrouwd worden.
Details
Om te voorkomen dat jullie simpelweg een willekeurige Tetris-AI van het internet plukken, maken we de uiteindelijke set met blokken iets exotischer dan de standaardset. Bovendien zullen we de exacte set blokken pas vrijgeven na de sluitingsdatum van de contest, om het zo wat spannender te houden.
De blokken zullen aangeleverd worden in tekstbestanden, met een numerieke naam, oplopend van 0.txt tot en met 9.txt. In deze bestanden kunnen blokken op de volgende manier gedefinëerd worden:
010
1X1
Een 1 geeft, uiteraard, aan dat op die plaats een deel van het blokje zit, en een 0 dat er op die plaats niets zit. De X geeft, naast het feit dat er op die plaats een deel van het blokje zit, ook het rotatiepunt aan waaromheen een blokje geroteerd kan worden. De maximale grootte van de blokjes die wij aanleveren is 5 bij 5, en de verschillende rijen die het blokje vormen worden gescheiden door enters. "Enters" definiëren we zoals dat in Windows gebruikelijk is, dus een carriage return, gevolgd door een linefeed.
Naast de 10 blokjes krijg je nog een ander tekstbestand van ons aangeleverd met de naam game.txt. In dit bestand staan in een willekeurige - maar door ons bepaalde - volgorde de nummers van de blokjes die een voor een voorbij komen. Deze getallen zijn verder nergens door gescheiden; aangezien er maar 10 blokjes zijn betekent één getal gewoon één blokje. Het aantal blokjes in dit bestand is in principe variabel, maar hou er rekening mee dat er een sequentie van wel 100.000 blokjes voor zou kunnen komen.
Natuurlijk zijn er ook details nodig voor het speelveld. Het speelveld is 15 vakjes breed en 40 regels hoog. Wanneer je een blokje niet kwijt kan zonder boven die 40 regels uit te komen, verlies je het spel en leveren de resterende blokjes in onze invoerfile je geen punten meer op. Om blokjes te laten passen mag je ze roteren, maar niet spiegelen.
Om een en ander uit de speelsituatie wat te verduidelijken:
Bewegen (LEFT/RIGHT) en roteren (CW/CCW) doe je in het grijze vlak. Je bent tijdens het roteren en move-en dus vrij van alle onderliggende blokken. Drop je je blokje naast het speelveld (dus "op" de rand, het gearceerde gedeelte) dan is het spel voorbij en krijg je geen punten meer. Komt je blokje na het droppen boven het speelveld uit (dus hoger dan 40) dan is het eveneens afgelopen. Je bent vrij om "buiten het speelveld" left/right te gaan maar veel nut heeft het niet gezien je toch weer terug moet als je je blokje in het speelveld wil droppen.
Wij zullen natuurlijk je inzending moeten kunnen controleren op valide zetten. Daarom zal je programma de volgende commando's, gescheiden door enters, moeten opslaan in een bestand genaamd output.txt:
- MOVE LEFT
- MOVE RIGHT
- ROTATE CW
- ROTATE CCW
- DROP
- NEW BLOCK
- DISCARD
De move-commando's lijken me duidelijk: die worden gebruikt om een blokje één positie naar links te verplaatsen. Rotate CW en CCW zijn respectievelijk nodig voor het rechtsom of linksom roteren van een blok. Het drop-commando laat een blokje naar beneden vallen, en ook het commando om aan te geven dat het volgende blok aangevraagd wordt lijkt me duidelijk. Het is in onze Tetris-implementatie niet mogelijk om een blok langzaam naar beneden te laten zakken. Je plaatst en roteert je blokje dus boven het speelveld en dropt het als het in de juiste positie is in het speelveld.
Het DISCARD commando komt je waarschijnlijk wat onbekend voor. Dat kan kloppen, we hebben het namelijk zelf verzonnen. Je kan het DISCARD commando gedurende je programma 5 keer gebruiken om een blokje in de "prullenbak" te gooien. Het zal dan niet geplaatst worden. Je kan na het geven van een discard commando vervolgens gewoon om een nieuw blokje vragen. Het is raadzaam om zuinig met je discards om te gaan, als ze op zijn, zijn ze op.
Wees echt zuinig op je discards. Het niet gebruiken van een discard levert je wanneer je game over bent 400 bonuspunten per ongebruikte discard op. Er zijn dus situaties denkbaar waarin een discard iets is waar je van kunt profiteren, maar in de meeste gevallen zul je moeten kijken voor een andere oplossing, als je tenminste het hoogst mogelijke aantal punten wilt halen.
Wanneer een blokje geïntroduceerd wordt in het veld na een NEW BLOCK commando dient het in de standaardrotatie te staan zoals in de files gedefiniëerd is. Het rotatiepunt van het blokje wordt precies in het midden van het speelveld geplaatst, dus de X uit de blokjesfile wordt gepositioneerd op de achtste kolom.
Samengevat dient jouw uitvoer er dus altijd als volgt uit te zien:
NEW BLOCK
MOVE LEFT/RIGHT of ROTATE CW/CCW
MOVE LEFT/RIGHT of ROTATE CW/CCW
MOVE LEFT/RIGHT of ROTATE CW/CCW
...
DROP
NEW BLOCK
MOVE LEFT/RIGHT of ROTATE CW/CCW
...
DROP
NEW BLOCK
DROP
NEW BLOCK
DISCARD
NEW BLOCK
MOVE LEFT/RIGHT of ROTATE CW/CCW
...
DROP
En omdat diagrammen meestal duidelijker zijn dan teksten:
De regels en andere afspraken
Uiteraard zijn er aan deze contest wat regeltjes verbonden. Om alles eerlijk te laten verlopen hebben we de volgende spelregels in gedachten:
- Inzendingen voor de contest stuur je naar prgmods@tweakers.net; neem daarbij in de subjectregel de tekst "Inzending PRG Contest" op en vernoem in de email zelf je nickname. Zet de bestanden niet ergens publiek neer voordat de sluitingsdatum is bereikt, om het zo voor iedereen leuk te houden. Stuur bovendien geen code op waar je niet 100% achter staat. Je eerste inzending is de enige inzending die telt, een tweede inzending zullen we niet in ogenschouw nemen.
- De sluitingsdatum van de contest is 1 februari 2007. Elke inzending die binnenkomt ná 31 januari om 23:59:59 is helaas uitgesloten van deelneming, zonder uitzondering.
We hebben bewust een datum gekozen die nog redelijk ver in de toekomst ligt, zodat niemand echt tijdsdruk zal ondervinden en zoveel mogelijk mensen mee kunnen doen, dus ik denk niet dat een strakke deadline een probleem zal zijn.
- Neem in je mailtje een zip- of rar-file op met daarin een uitvoerbare versie van je programma én je programmacode. In het geval van scripttalen zoals PHP is één bestand uiteraard voldoende.
- Je mag elke programmeertaal gebruiken die je wilt, met uitzondering van Brainfuck.
- Samenwerken mag, maar meld het wel even als je dit doet. Neem in je inzendingsmailtje de nicknames van alle programmeurs op.
- De ingestuurde zipfiles worden na de contest publiek gemaakt, inclusief je sourcecode. Als je hiertegen bezwaar hebt, dan kun je beter niet meedoen.
Uiteraard staat het je vrij om elke willekeurige opensource licentie aan je code te verbinden en de credits liggen uiteraard gewoon bij jou.
- Het geven van foute uitvoer betekent sowieso dat je game over bent en je na dat punt geen punten meer krijgt, en zal in een zwaar geval zelfs leiden tot diskwalificatie en foltering door zeef.
Een NEW BLOCK commando mag bijvoorbeeld pas na een DROP commando gegeven worden, en niet eerder. Verplaatsingen door de "muren" heen zijn natuurlijk ook niet goed.
- Alle genoemde tekstbestanden bevinden zich in dezelfde directory als het uitvoerbare bestand van je programma.
- Als je programma langer dan twee uur nodig heeft om te runnen op de pc die je score berekent, dan heb je pech. Na twee uur wordt je applicatie gestopt en alleen de uitvoer die op dat moment in je output.txt bestand zit wordt gebruikt voor het berekenen van je score. Je kan ervan uit gaan dat de pc waarop je programma gerund wordt sneller is dan de gemiddelde consumentenpc, maar probeer je programma zo snel mogelijk te houden.
- Het heeft geen zin om bij moderators te gaan vragen naar de lijst met blokjes en de volgorde in welke deze voor gaan komen. Deze files worden namelijk pas ná de sluitingsdatum überhaupt gemaakt, dus we kúnnen je die files niet geven, zelfs al zouden we het willen.
Natuurlijk geven we uiteindelijk wel de precieze files vrij, samen met de uitslag van de contest, en niet eerder dan dat om zo een beetje de spanning erin te houden.
Behalve de winnaar in de categorie "hoogste score" zullen er nog winnaars zijn in de categoriën "kortste code" (waarbij uiteraard wel aan de eisen aan de opdracht voldaan dient te worden) en een derde categorie die we nog even geheim houden. Hierbij is het mogelijk dat één persoon in meerdere categoriën de winnaar is.
Wat kan ik eigenlijk winnen?
Nou, dat is vrij simpel: niks. Het enige dat je mogelijk aan deze contest overhoudt is eeuwige roem en de eer om de eerste contest in dit nieuwe format gewonnen te hebben.
Om je op weg te helpen
Om te zorgen dat jullie alvast van start kunnen gaan bieden we jullie graag twee testsets aan van invoerbestanden. Bedenk wel dat de uiteindelijke bestanden anders zullen zijn!
Uiteraard kunnen game.txt's eventueel nog op andere blokkensets losgelaten worden. Ook kun je voor testdoeleinden (aanbevolen zelfs!) je eigen blokkensets en game.txt bestanden maken. Helemaal leuk wordt het als de deelnemers onderling blokkensets en game.txt bestanden gaan delen en kijken wie het best scoort totdat de deadline gekomen is. Zo zijn je tests niet al te eentonig met altijd dezelfde blokjes en game.txt.
Tot slot...
...willen we jullie natuurlijk heel veel succes wensen. We hopen dat je er plezier in gaat hebben om aan deze contest mee te doen, en natuurlijk hopen we dat je niet de enige bent. Hoe meer competitie, hoe beter!
Als jullie nog vragen hebben, stel ze dan maar gewoon in dit topic.
[ Voor 255% gewijzigd door RobIII op 20-02-2007 01:53 ]
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.