Ett av de första 'tv-spel' som kom var det som ibland kallas
"Pong", eller "Tennis" (som väl egentligen är ett bättre namn). Det
utspelar sig i ett DotWindow
-liknande fönster, där en
boll slås fram och tillbaka mellan två racketar:
Man kan även skriva ett Pong-spel i
ett GraphicsWindow
.
De båda racketarna styrs av spelare som har vardera två tangenter (du får själv välja vilka tangenter). Bollen studsar mot fönstrets underkant och överkant, och då bollen träffar ett racket får den en ny, slumpmässig vinkel (åt andra hållet).
Din uppgift blir att implementera spelet.
Programmet måste fungera.
Ditt huvudprogram måste brytas ner i underprogram och operationer på lämpligt sätt.
Programmet måste vara skrivet enligt Javas kodkonventioner, dvs alla indragningar och klamrar skall vara rätt placerade, och variabler och klasser ha rättskrivna namn (exempelvis tydliga namn, liten begynnelsebokstav för variabler, stor begynnelsebokstav för klasser, etc). Se här för en kort sammanställning av reglerna.
Efterhand som jag får in frågor, och ser vad som ställer till problem på uppgiften, kommer jag att lägga ut tips på denna sida. Det kan därför vara en god idé att titta in då och då.
Det finns i klasserna GraphicsWindow
och DotWindow
ett antal operationer som är gjorda
för att göra det lättare att skriva spelprogram av detta slag,
de finns beskrivna i klassen GameEvent
(för
respektive fönster). Klassen DotWindow
uppdateras
snabbare på skärmen, så om du inte har en tillräckligt snabb
dator blir pong-spelet bättre i
ett DotWindow
.
För att hålla reda på boll och spelare kan du göra på olika
sätt - oavsett hur du gör bör du låta bollens koordinater vara
reella tal (så att inte små förflyttningar avrundas bort), medan
spelarnas koordinater kan vara heltal. När du ritar bollen i
ett DotWindow
måste du avrunda koordinaterna till
heltal.
Ett alternativ är att använda klasser för att beskriva
bollen och spelarna. För att ge dem tillgång till varandra och
det fönster som allt ritas i kan du låta boll- och
spelar-klasserna vara inre klasser
till Pong
-klassen.
Vi skulle exempelvis kunna skriva:
class Pong { ... DotWindow w = ... Player left = new Player(...) Player right = new Player(...) Ball ball = new Ball(...) class Ball { // här inne kan vi komma åt fönstret (w) och // de båda spelarna (left och right) } class Player { // här inne kan vi komma åt fönstret (w) och // de bollen (ball) } void run() { ... } }
Boll-klassen skulle kunna ha en operation som flyttar bollen ett litet steg, och som tar hand om eventuella studsar (och racket-träffar).
Ett annat förslag är att du deklarerar en
klass Pong
med attribut för exempelvis:
I denna klass kan du ha en operation som spelar en boll. Denna operation kan i sin tur anropa ett antal andra operationer, exempelvis:
en operation som flyttar bollen efter ett tidssteg, denna operation kan se till att bollen studsar på rätt sätt
en operation som tar hand om tangenttryckningar, och flyttar spelarnas racketar på lämpligt sätt
Du behöver inte lagra hela spelplanen i någon matris, det räcker att du håller reda på var bollen och spelarna befinner sig. Du behöver aldrig ändra mer än högst sex prickar på skärmen i varje tidssteg (om bollen flyttat sig till en ny ruta, och båda spelarna flyttat sitt racket ett steg åt endera hållet -- i regel skall bara två prickar ).
Be gärna en övningsassistent kontrollera så att du inte gör en onödigt krånglig lösning, det behövs mindre än 150 rader programkod (cirka 100 rader om vi räknar bort rader med bara klamrar, och tomma rader) för en enkel lösning, och en normal lösning innehåller ca 250 rader programkod. Om du börjar närma dig 400 rader kod så kan det bero på att du försöker lösa uppgiften på ett lite för krångligt sätt.