Programmeervuur zeeslag
Helaas is deze programmeervuur afgelopen. Je kunt dus niet meer meedoen.Na een succesvol programmeervuur rummikub van Soultaker is het nu tijd voor een nieuwe programmeervuur. Doordat mijn lokale webserver de Get en Post requests niet altijd netjes afhandelde heeft het eventjes geduurd voordat ik mijn code goed werkend kreeg. Ik heb verschillende spelsituaties getest en gezocht naar een goed spelelement zodat het niet alleen maar op goed geluk aan komt. Verder heb ik deze programmeervuur grotendeels gebaseerd op de vorige programmeervuur zodat jullie voor sommige punten het wiel niet opnieuw uit hoeven te vinden.
Het doel is om een programma te schrijven dat een variant op Zeeslag kan spelen via een webinterface. Dit programma kan dan gebruikt worden om een toernooitje te spelen tegen de andere deelnemers.
Moeilijkheidsgraad
Gemiddeld. Om de basisregels in code om te zetten zal het lastigste deel zijn denk ik. Daarna komt het aan op logica en tactiek. Maar zoals altijd geldt: meedoen is belangrijker dan winnen!.Spelregels
De programmeervuur zeeslag is grotendeels gebaseerd op de papieren versie uit de bekende puzzelboekjes. Eerst wordt door speler 1 de schepen in een 2 dimensionaal veld geplaatst. Daarna moet speler 2 alle geplaatste schepen vinden. Dit gebeurt d.m.v. het selecteren van een vakje, waarna de speler terug krijgt of in dat vlakje een stukje schip lag of niet. Uiteraard is het de bedoeling dat het aantal pogingen hiertoe minimaal is.De server werkt eigenlijk als volgt:
- Ontvang gegevens speler 1 en speler 2.
- Ontvang van speler 1 de posities van de schepen.
- Ontvang van speler 2 een kolom en regelnummer.
- Ga naar de vorige stap als speler 2 nog niet alle schepen van speler 1 heeft gevonden.
- Zend aan speler 1 en speler 2 de uitslag van dit spel.
De opdracht kan je eigenlijk opsplitsen in twee delen:
- Het plaatsen van de schepen in het veld. Hierbij is het doel om de schepen zodanig te positioneren zodat de tegenstander de schepen lastig kan vinden.
- Het vinden van de geplaatste schepen in het veld. Hierbij is het de bedoeling om zo snel mogelijk alle schepen te vinden.
Alle spelers zullen minimaal twee keer tegen elkaar moeten spelen; Namelijk één keer om de schepen te plaatsen, en één keer om de schepen te vinden. Afhankelijk van het totale aantal deelnemers zal dit een aantal malen herhaald worden zodat geluk een kleinere rol gaat spelen, en dat tactiek de winstgevender is.
Het spel zal gespeeld worden op een speelveld van 16x16 vakjes.
De vlakken lopen van A1 t/m P16, waarbij de de kolommen met letters en de regels met cijfers
zijn aangeduid.
Technische regels
Implementeer een Zeeslagspeler met een webinterface, dat een GET of POST request kan ontvangen en het resultaat als plain-text in de body teruggeeft.Request parameters
Hier staan alle mogelijke parameters beschreven die ontvangen kunnen worden. Verderop in deze post is te vinden wanneer je welke parameter kan verwachten.Parameter | Beschrijving | Voorbeeld |
---|---|---|
Action | De actie wat door het programma uitgevoerd moet worden. | De mogelijke waarden zijn “Ships”, “Fire” en “Finished”. |
Opponent | Een unieke identificatie van de tegenstander. Indien je eerder deze tegenstander hebt gehad kan mogelijk de tactiek te verbeteren. | Willekeurige tekenreeks zoals “X6T3” of “94DQ294V3C” |
Shots | De locaties waar al op geschoten is, inclusief het resultaat. Het eerste karakter is een W indien er op die locatie water ligt, of een S indien er een deel van een schip ligt. De volgende karakter is de kolom, en het getal daarna geeft het regelnummer aan. | Een mogelijke waarde is “WC4.WF11.SH5.SH6.SH7” waarbij er al drie scheepsdelen op de H-lijn zijn gevonden. |
Rows | Dit zijn 16 getallen welke gescheiden zijn door een punt. Deze getallen geven aan hoeveel delen van schepen op die regel liggen. | Een mogelijke waarde is “4.0.3.0.4.0.3.1.1.1.2.2.4.0.5.0” |
Cols | Hetzelfde als bij de parameter Rows, maar dan geldt dit voor de kolommen. | Zie hierboven. |
Ships | Hierin staat waar de schepen lagen. | Mogelijke waarde “5HK8.4HH5.4HI2.3HI15.3VP12. 3HE1.2VP1.2VK10.2VA1.2VM11” Dit is het zelfde formaat waarin de schepen geplaatst moesten worden. |
Player | Als dit een 1 is, dan ben je de speler die de schepen hebt geplaatst. Bij een 2 ben je de speler die naar de schepen hebt gezocht. | 1 of 2 |
GameId | Dit is een uniek nummer (timestamp) dat per spel zal verschillen. | 1264703546 |
Het plaatsen van schepen
Indien de parameter Action de waarde “Ships” bevat dienen er schepen geplaatst te worden.De parameters Opponent en GameId worden dan ook meegeven, maar het is niet verplicht om hiervan gebruik te maken.
De volgende schepen dienen allemaal te worden geplaatst:
- 1 schip van 5 vakjes lang (Vliegdekschip)
- 2 schepen van 4 vakjes lang (Slagschip of kruiser)
- 3 schepen van 3 vakjes lang (Onderzeeboot of torpedojager)
- 4 schepen van 2 vakjes lang (Mijnenveger of fregat)
De enige eis is dat de schepen elkaar niet mogen raken of kruisen. Er dient dus minimaal 1 vakje water tussen de schepen te zitten. Schepen mogen elkaar ook niet diagonaal raken.
Het aangeven van een schip gaat op de volgende manier:
- Het eerste teken is een cijfer en geeft de lengte van het schip aan. Dit kan dus alleen de waarden 2 t/m 5 hebben.
- Het tweede teken geeft de richting aan. H = horizontaal en V = verticaal.
- Het derde teken geeft de kolom weer in de vorm van A t/m P.
- Het vierde en eventueel het vijfde karakter geeft het regelnummer weer 1 t/m 16.
2VN14 geeft aan dat er een schip op de vlakken N14 en N15 ligt.
Bij de uitvoer dienen de schepen gescheiden te zijn door een punt.
Voorbeeld:
Bij een request van ?Action=Ships&Opponent=X6T3Kan een mogelijke uitvoer 5HK8.4HH5.4HI2.3HI15.3VP12.3HE1.2VP1.2VK10.2VA1.2VM11 zijn.
Het vinden van de geplaatste schepen
Indien de parameter Action de waarde “Fire” bevat dient er een vakje teruggegeven te worden.De parameter Shots geeft aan waar al geschoten is en wat het resultaat was.
De parameters Rows en Cols geven aan hoeveel scheepsdelen er op die betreffende regel of kolom liggen.
De parameters Opponent en GameId worden dan ook weer meegeven, maar het is niet verplicht om hiervan gebruik te maken.
De uitvoer dient gewoon een vakje te zijn.
Het eerste teken geeft de kolom weer in de vorm van A t/m P.
De rest geeft de regelnummer weer 1 t/m 16.
Het spel eindigt automatisch als het laatste deel van een schip is gevonden.
Voorbeeld:
Bij een request ?Action=Fire&Opponent=Name1&Rows=4.0.3.0.4.0.3.1.1.1.2.2.4.0.5.0&Cols=3.1.2.2.1.7.2.2.2.2.2.1.3.0.0.0&Shots=WM15.SE15.SD15Kan een mogelijke uitvoer C15 zijn.
In dit voorbeeld liggen bijvoorbeeld in de laatste drie kolommen (N, O en P) geen schepen en in kolom E ligt maar één deel van een schip.
Aangezien op E15 al een deel van een schip is gevonden, kunnen er in de rest van deze kolom verder geen andere scheepsdelen voorkomen en hoef je er daar dus ook niet naar te zoeken.
Einde van het spel
Zodra het laatste deel van het laatste schip is gevonden is het spel over.Aan beide deelnemers wordt dan een request gestuurd met in de Action-parameter “Finished” gestuurd. In de parameter Ships is aangegeven hoe de schepen lagen, en in de parameter Shots staan waar de schoten afgevuurd waren. In de parameter Opponent staat wie de tegenstander was.
De parameter Player wordt ook verzonden. Als dit een 1 is, dan ben je de speler die de schepen hebt geplaatst. Bij een 2 ben je de speler die naar de schepen hebt gezocht.
De parameter GameId wordt ook verzonden.
Het is niet verplicht om hier iets mee te doen, maar het kan misschien handig zijn.
Puntentelling
Bij het vinden van de schepen, kost elk schot dat het programma nodig heeft 1 punt.Dit punt wordt bij de tegenstander opgeteld.
Het programma met uiteindelijk de meeste punten is de winnaar.
Uitzonderingen
Bij het plaatsen van schepen krijgt het programma maximaal vijf keer de mogelijkheid om de schepen te plaatsen. Lukt dat niet, dan wordt er vanuit gegaan dat de tegenstander alle schepen heeft gevonden zonder mis te schieten. De score wordt dan maar met 30 verhoogt, en de tegenstander kost het dus maar 30 punten.Bij het vinden van de schepen wordt elke teruggegeven waarde behandeld als een schot. Indien de teruggegeven waarden niet correct is kost dat ook een punt.
Het maximum is 256 pogingen. (16x16)
Voor elk request krijgt het programma vijf seconden de tijd om een waarde terug te geven.
(Intern wordt er een iets hogere request timeout gebruikt vanwege network latency e.d.)
Testen
Je kunt hier je speler testen en zo verifiëren dat je de regels en het protocol goed geïmplementeerd hebt.Competities
Datum | Tijd | Deelnemers | |
---|---|---|---|
Testcompetitie 1 | Zondag 31 januari | Vanaf 19:00 uur | Resultaten |
Testcompetitie 2 | Zondag 7 februari | Vanaf 19:00 uur | Resultaten |
Eindcompetitie | Zondag 14 februari | Vanaf 17:00 uur | Resultaten |
Met dank aan Soultaker waarvan ik zijn post en zijn programma-interface grotendeels heb overgenomen.
En dank aan de moderators van PRG voor de controle en acceptatie van dit topic.
Speel ook Balls Connect en Repeat