Labb3_H20

Laboration 3 - SSP-klient (STEN, SAX, PÅSE)

Mål

  • Att förstå principerna för ett serverprogram som fungerar för flera klienter samtidigt i Java.
  • Att kunna programmera både en textklient och en grafisk klient som kopplas upp mot servern, kommunicerar med den och kopplar ner.
  • Att använda olika lyssnare för olika uppgifter.

Dessutom ger uppgiften ytterligare övning på att strukturera den logiska delen av ett program samt på att göra grafiska gränssnitt.

 

Ett grafiskt klientprogram där en användare spelar mot en server

På en föreläsning visas ett serverprogram som spelar sten, sax och påse med alla villiga klienter. Koden finns här: Server4713.java. Uppgiften i labb3 är att skriva ett grafiskt klientprogram som låter en användare spela sten, sax och påse mot serverprogrammet. Spelet är känt över hela världen. Här är en webbsida: Wikipedia about rock-paper-scissors. Links to an external site.

Serverprogrammet kör vanligen på datorn faculty-shell.sys.kth.se, port 4713. Om ni misstänker att  programmet inte är igång så meddela någon kursledarna. Programmet kan stoppas utan att vi vet om det. Det går att som nödlösning använda ett lokalt serverprogram.

Tyvärr går det just nu inte att koppla upp sig mot programmet ovan från datorer utanför KTH, det har gått bra under flera år tidigare! Vi vet inte om vi kan fixa detta under kursens gång. Två alternativ finns då:

  • Från egen dator, logga in på student-shell.sys.kth.se, t.ex. genom   ssh  -X  student-shell.sys.kth.se 
    och kör era program därifrån. -X behövs för att grafiken ska fungera vid fjärrinloggning.
  • Starta serverprogrammet Server4713 på er egen dator och ange localhost istället för extern IP-adress vid uppkoppling. Se lokalserver.html

 

En text–klient

Börja med att testa en enkel klient utan grafik, som öppnar en förbindelse med

   try {
       Socket socket=new Socket("faculty-shell.sys.kth.se",4713);
// Socket socket=new Socket("localhost", 4713); BufferedReader in=new BufferedReader (new InputStreamReader(socket.getInputStream())); PrintWriter ut=new PrintWriter(socket.getOutputStream()); ut.println("Charlotta"); ut.flush(); System.out.println(in.readLine()); }

Om ni måste köra Server4713 på egen dator, byt första raden mot den bortkommenterade.

OBS! Koden ovan är ofullständig. Bl.a. saknas catch-del till try - blocket och import-satser. 

Klienten ska sända ett namn (här sänds Charlotta) till den server som lyssnar på port 4713 och skriva ut det svar den får. Kom ihåg ut.flush(); annars sänds inte namnet iväg. Koden ovan behöver kompletteras en hel del för att gå att köra överhuvudtaget men även för att testa servern. Bland annat bör man skicka ytterligare några meddelanden till servern och som svar få "STEN", "SAX" eller "PÅSE". För att avsluta förbindelsen, skicka en tom sträng, alltså "". Se till att den enkla klienten fungerar innan ni går vidare och ägnar er  åt det grafiska.

 

Det grafiska programmet

Programmet ska bestå av minst två klasser där den ena är en spelplansklass. Följande detaljerade anvisningar bygger på att ni använder en färdig klass för spelplanen, den givna klassen Gameboard som tillhandahålls för att underlätta för er. Vi kräver dock inte att ni använder Gameboard. Det är tillåtet att skriva något eget men koden måste vara tydlig och sakna onödiga upprepningar. Det kan vara lärorikt att förstå Gameboard, särskilt de två olika konstruktorerna och möjligheten att ge lyssnare i konstruktorn.

 

Spelplansklass

Det ska finnas en spelplan för dig själv och en för datorn och dessa ska vara objekt av samma klass. Spelplanen ska innehålla sju fält: Spelarens namn, senast utförda drag, tre knappar för STEN, SAX, PÅSE, en ruta där det visas om spelaren vann, förlorade eller spelade oavgjort och till sist aktuell poängställning. Alla rutorna utom den översta ska att uppdateras under spelets gång. Knapptryckningar i din spelplan ska ha effekt på spelet men knapptryckningar i datorns spelplan har ingen verkan. Klassen Gameboard kan användas för spelplanen och finns för nedladdning här:  Download Gameboard.java

Gameboard innehåller de metoder som behövs för uppdateringar av spelplanen under spelets gång. Observera att bildfiler måste finnas när man vill köra ett program med objekt av Gameboard. Använd t.ex. dessa bilder eller hitta egna!


STEN PÅSE SAX

 

Huvudklassen

För att snabbt få en uppfattning om hur programmet kan se ut vid körning så finns här också ett "skelettprogram" för det hela:  Download RPSSkel.java

Spara båda klasserna och lämpliga bildfiler och provkör!  Då ser ni hur det färdiga programmet ska se ut, oavsett om ni väljer att använda de givna klasserna eller ej. Skelettprogrammet kan byggas ut till den färdiga labblösningen. Bygg i små steg!  Skriv gärna metoder för lösningar av delproblem.

Klassen Gameboard behöver inte ändras. Det är tillåtet att ändra i Gameboard, eller skriva en ny, men det får inte leda till ett sämre strukturerat program. Inte heller RPSSkel måste användas, den tillhandahålls bara för att underlätta.  Det är också tillåtet att lägga till en klass, om ni tycker det behövs.

 

Spelet

Spelet går till så att användaren trycker på sten, sax och påse-knapparna och vid tredje trycket läser programmet av vilken knapp som tryckts på och draget STEN, SAX eller PÅSE registreras. Det spelar ingen roll vilka knappar man trycker på de två första gångerna men texten "ETT..." respektive "TVÅ..." ska visas i resultatrutan (under bilderna). Detta ska efterlikna att man i det manuella spelet slår med en knuten hand i luften två gånger (räknar ett, två) och därefter (på tredje slaget) visar sitt drag. I samband med användarens tredje tryck ger också datorn sitt drag (dvs programmet läser av draget från servern). Programmet avgör om det är oavgjort eller vem som vunnit samt uppdaterar Resultat-rutan och Poäng-rutan på varje spelplan.

 

Krav på programmet

  • När användaren och datorn spelar (alltså på var tredje knapptryckning) ska det markeras på spelplanerna hur man har valt, dels genom att knapparnas (din och datorns) färg ändras och dels genom att STEN, SAX eller PASE skrivs i textrutan närmast ovanför knapparna. Färgen ändras tillbaka vid nästa tryck "ETT ...".
  • I rutan närmast under knapparna på var spelplan skrivs texterna "ETT ...", "TVÅ ..." och på tre skrivs om spelaren vann eller förlorade eller om det blev oavgjort.
  • Poängställningen ska uppdateras längst ned på vinnande spelpan.
  • För varje spel måste programmet avgöra vem som vann. Se till att detta görs på ett snyggt och tydligt sätt! Det är inte nödvändigt att testa alla kombinationer av STEN/SAX/PÅSE. Man klara sig med ett par if-satser (och några && och ||) eller helt utan if, om man skapat en lämplig datastruktur för de möjliga utfallen.
  • Det ska finnas en "avsluta"-knapp. Tryck på den ska ge nedkoppling från servern och avsluta programmet. Finns redan förberedd i skelett-programmet.
  • Låt olika lyssnare ta hand om avsluta-knappen och spel-knapparna. De har ju helt olika uppgifter. För tips, titta här.
  • Gör en enda uppkoppling till servern som behålls under hela spelet. Koppla inte upp på nytt för varje drag.

Redovisning

  • Demonstrera körning av programmet. Kraven i listan ovan ska uppfyllas.
  • Ni ska kunna redogöra för och förstå programmets alla delar, alltså även den givna klassen Gameboard, om ni väljer att använda den.
  • Visa UML-klassdiagram för programmet. Diagrammet ska innehålla de viktigaste klasserna samt publika metoder. Variabler behövs inte.

 

Extrauppgift för högre betyg

Det blir ingen extrauppgift på denna labb.