bild
Skolan för
elektroteknik
och datavetenskap
 

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 förstå hur man kan använda flera 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.

Serverprogrammet kör just nu (2014-04-20 kl 13.10) på datorn u-shell.csc.kth.se, port 4713. Om ni misstänker att programmet inte är igång så meddela kursledaren! Det går att använda ett lokalt serverprogram då, se nedan!

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

På en föreläsning (troligen nr 7 eller 8) 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. På webbsidan Rock, paper, scissors, kan man bland annat hitta tre gif-bilder att använda i sitt program. Bilderna finns längre ner här i labblydelsen också.

Om servern skulle vara nere eller uppvisa något annat problem så går det bra att som nödlösning kopiera server-programmet till den egna datorn och köra det där. Instruktioner finns här: 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("gru-ld03.csc.kth.se",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());
   }
OBS! Koden ovan är ofullständig. Bl.a. saknas catch-del till try 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 ska man skicka något som servern läser som null eller tom sträng. Det fungerar t.ex. med tom sträng (""), Ctrl-D eller Ctrl-Z. Se till att den enkla klienten fungerar innan ni går vidare och ägnar er helt åt det grafiska gränssnittet.

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. Det är inte nödvändigt att använda Gameboard om ni har en egen idé om hur programmet ska se ut, bara det ser snyggt ut och koden inte är onödigt tillkrånglad. 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 kommer att uppdateras under spelets gång. Knapptryckningar i din spelplan ska ha effekt på spelet men inte knapptryckningar i datorns spelplan. Klassen Gameboard kan användas för spelplanen. 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:   RPSSkel.java. Spara båda klasserna och lämpliga bildfiler och provkör! Skelettprogrammet kan sen byggas ut till den färdiga labblösningen. Bygg i små steg!

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. De verkningslösa tryckningarna 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 knappens 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ärmas 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.
  • 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 förslag, titta här.

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.

 

Extrauppgifter för högre betyg

Innehåll: Utvidga det grafiska gränssnittet med mer funktionalitet.

Extrauppgift, alternativ 1: Lägg till ljudeffekter! Det ska gå att välja i det grafiska gränssnittet om man vill ha ljud eller ej. Om "Ljud på" är valt ska det komma tre olika ljud beroende på om spelaren vann eller förlorade eller det blev oavgjort. Det måste vara möjligt att stänga av ljudet när som helst under spelet.

Extrauppgift, alternativ 2: Bygg ut det grafiska gränssnittet så att uppkopplingen till servern styrs därifrån. Låt användaren välja serverdator och portnummer, antingen genom att det finns några explicita att välja på eller genom att skriva in namnet (t.ex. "u3.csc.kth.se") och portnumret i inmatningsfält. Om uppkopplingen misslyckas ska programmet meddela detta och inte kracsha.

Copyright © Sidansvarig: Ann Bengtsson <ann@nada.kth.se>
Uppdaterad 2014-04-20