Laboration 3 - Sten, sax, påseEtt grafiskt klientprogram där en användare spelar mot en serverPå föreläsning 5 eller 6 visas ett serverprogram som spelar sten, sax,
påse med alla villiga klienter. Koden finns här:
Server4712.java. Nu ska du skriva ett
grafiskt klientprogram och du ska använda idel swingkomponenter, nämligen
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 Server utan svenska bokstäver En version av serverprogrammet som är helt fri från åäöÅÄÖ kör genom port 4713, koden finns här: Server4713.java. Den spelar STEN, SAX och PASE.
En enkel klientBörja med att testa en enkel klient utan grafik, som öppnar en förbindelse medtry { Socket socket=new Socket("p6-ray.nada.kth.se",4712); BufferedReader in=new BufferedReader (new InputStreamReader(socket.getInputStream())); PrintWriter ut=new PrintWriter(socket.getOutputStream()); ut.println("Charlotta"); ut.flush(); System.out.println(in.readLine()); }Klienten ska sända ett namn (här sänds Charlotta) till den server som lyssnar på port 4712 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.
SwingkomponenternaDitt program kan (men behöver inte) vara enpublic class Klient extends JFrame implements ActionListener{där vänstra halvan av fönstret är din spelplan och högra halvan är datorns spelplan. De två halvorna är tillräckligt lika för att kunna representeras av objekt av samma klass. När klassen skrivs, använd gärna BoxLayout ,
den är någorlunda flexibel men ändå enkel och blir oftast bra!
Om du är helt ovan vid Javas grafik så kan det vara bättre att välja
den mer grundläggande GridLayout . Se nästa avsnitt!
Med BoxLayout så bör varje spelplan vara en vertikal
Box som uppifrån och ner inneåller
JLabel för alla de små textfälten ovan men i
vissa sammanhang är det lättare med JTextField när man
måste ha fält som är tomma från början.
En egen klass för Spelplan bör definieras. Den kan gärna
vara subklass till Box och i sin konstruktor anropa
super(BoxLayout.Y_AXIS); för att markera att den är
vertikal. Två objekt av den skapas och läggs bredvid varandra i
t.ex. en horisontell box.
En av fördelarna med en box är att man kan lägga in fasta mellanrum
mellan komponenterna Om man deklarerat Box box=Box.createHorizontalBox();kan man göra så här. Spelplan jag = new Spelplan("Jag:"); Spelplan du = new Spelplan("Datorn:"); box.add(jag); box.add(Box.createHorizontalStrut(20)); //Ett mellanrum box.add(du); Box-objektet läggs därefter in i JFrame-objektet med metoden add. Alternativ till Box för spelplanernaOm du är ovan vid Javas grafik kan det vara lika bra att använda enJPanel med
GridLayout för spelplanerna.
Det går att få riktigt snyggt det också!
Varje spelplan kan delas in i 5 lika stora fält där knapparna
läggs i de tre mittersta. Översta och nedersta fälten får var sin
JPanel som i sin tur delas in
flera fält. Om man lägger in en tom
JPanel så fungerar det som ett
mellanrum. Inte fullt så flexibelt som i en
Box men helt OK.
Om du väljer detta alternativ för spelplanerna så använd även en
SpeletSpelet 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 och de knapparna behöver inte markeras med färgskifte 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.
Några tips
Redovisning och krav på programmet
Som extrauppgift väljes en av följandeExtrauppgift, alternativ 1: Lägg till ljudeffekter! Kan kräva hörlurar. Det bör vara minst tre olika ljud (spel, vinst, förlust). Ljudet ska kunna slås av och på interaktivt medan man kör programmet.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 skriva in namnet (t.ex. "p6-ray.nada.kth.se") och portnumret i inmatningsfält.
|