PROJEKTRAPPORT EDA095 NÄTVERKSPROGRAMMERI NG STRESS LUNDS TEKNISKA HÖGSKOLA - 2013-05-22 Projektmedlemmar: Emil Apelgren adi10eap@student.lu.se Fredrik Helander gda10fhe@student.lu.se Jonathan Klingberg adi10jkl@student.lu.se Charlotte Leifland adi10cle@student.lu.se Handledare: Björn A Johnsson
Table of Contents Bakgrund...3 Stress...3 Kravspecifikation...3 Modell...4 Klient Klasser:...5 ClientListener extends Thread:...5 ClientMain:...5 Server Klasser:...6 GameServer:...6 GameHandler:...6 GameServerThread extends Thread:...6 Användarhandledning...6 Utvärdering...7 Programlistor...7 To do:...8 Appendix A...8
Bakgrund Det här projektet har varit till för att vi ska applicera den nya kunskapen som vi har fått inom kursen nätverksprogrammering. Projektet ska vara relevant för kursen och den stora delen ska behandla kommunikationen mellan en server och flera klienter. Vi har tillämpat och utnyttjat det vi har lärt oss på laborationerna för att skapa bra kommunikationskanaler för vårt kortspel Stress. En viktig del i projektet har varit att klienterna ska fritt få skriva till servern. Stress Vi har utvecklat kortspelet stress där vi har utvidgat spelet till 2-4 spelare. Spelet börjar med att två kortlekar blandas och två kort dras och läggs ut på en vänster-hög respektive en höger-hög. Resterande kort delas ut mellan spelarna. Spelet går ut på att bli av med sina kort så snabbt som möjligt. Varje spelare lägger ner fyra kort på bordet från sin hand. Man väljer sedan ett kort att lägga på en av högarna. Kortet man lägger måste ha värdet +-1 jämfört med det på högen för att godkännas. Vid samma valör på stacken kan man trycka på knappen Stress och då kommer korten som ligger på bordet delas ut till övriga spelare samtidigt som två nya kort dras till vardera hög. Viktigt är att påpeka att detta kortspel inte är full rättvist utan att spelomgångarna skiljer sig åt. Kravspecifikation Från början av projektet ville vi göra spelet till en Andriod applikation där en mobiltelefon agerade värd och deltog i spelomgången och de övriga spelarna hanteras som enkla klienter. Spelplanen skulle visa alla spelares kort under spelets gång. Stress är ett hetsigt spel där varje spelare ständigt skickar information om deras drag över trådar till servern och förväntar sig snabbt svar för att kunna lägga nästa kort. Krav: 1. 2-4 Spelare ska kunna ansluta sig till servern för att spela mot varandra. En av spelarna agerar server och är värd för en spelomgång.
2. Servern skall blanda korten och delar ut samtliga kort till klienterna i turordning. 3. Servern tar 2 start kort som läggs ut på spelplanen och spelet startas. 4. Spelarna placerar 4 kort framför sig på spelplanen. 5. En spelare ska enkelt kunna välja vilken hög på spelplanen som är aktiv dvs. vilken hög den vill lägga sitt kort på. 6. Servern ska kontrollera giltiga drag. 7. Vid giltigt drag ska kort automatiskt tas från spelarens hand och läggas på bordet. Detta endast om spelaren har kort kvar på handen. 8. Vid ogiltigt drag skall kortet som spelaren försökt lägga läggas tillbaka på bordet. 9. Spelare skall kunna trycka på knappen Stress. Servern ska kontrollera att stressen är godkänd. a. Vid godkänd stress skall korten i högarna blandas och två start kort läggs ut resten av korten delas ut till de spelarna som inte tryckte stress. b. Meddelande om misslyckad stress skickas ut till samtliga spelare. 10. När en spelare är av med alla sina kort ska servern meddela de övriga spelarna att spelet är slut och vem som vann. Kravkommentarer 4. Spelaren skulle från början själv trycka på en knapp för att få ner ett nytt kort på spelbordet från sin korthand. Detta sker automatiskt så länge en spelare har kort kvar. 9b. Har inte blivit implementerad 10. Vi meddelar inte spelarna när spelet är avslutat. Modell Klient Klasser: ClientListener extends Thread: När en ClientListner skapas får den tillgång till en anslutning mot servern. Denna anslutning används för att lyssna efter kommandon från servern samt att skicka kommandon till servern. Den får även åtkomst till Player objektet. Det är här alla kodmeddelanden från servern tyds och behandlas på respektive vis hos klienten. Varje kodmeddelande består utav tre tecken där vi har valt att representera de olika händelserna med siffror. Kod Kommando
0xx Stress 1xx/2xx Stack1/Stack2 uppdaterad 3xx Klient vill stänga ner anslutningen 4yy Starta spelet, varje spelare lägger upp 4 kort på spelplanen 5xx Klienten får ett kort till sin hand från servern där yy representerar vilket kort 1-52 (vid ny runda samt vid Stress) 8xx Stress inte tillåten 9xx Spelarens drag är inte tillåten Tabell 1 visar alla koder samt deras betydelse ClientMain: ClientMain skapar ett Player objekt som håller reda på spelarens egna kort samt de nödvändiga korten på spelplanen som spelaren måste kunna interagera med. Den ansluter sig mot serverns socket med bestämd IP adress och Port nummer. Den skapar en tråd som lyssnar på strömmen från servern samt en tråd som kan skriva till servern och startar dessa två. Server Klasser: GameServer: Här erhålls en ServerSocket som accepterar anslutningar på port 30 000. När en klient ansluter till servern skapas den som en tråd (GameServerThread) i en lista tillsammans med de andra anslutna klienterna för att servern enkelt ska hantera flera klienter samtidigt. Vidare skapas en GameHandler som håller reda på de två stackarna på mitten spelplanen som samtliga spelare ska kunna se. Här skapas även en tråd (SendToAllThread) som observerar förändringar på spelplanens stackar och meddelar samtliga anslutna spelare om uppdateringen. Här ligger även metoden för att blanda korten och starta spelet. GameHandler: Här hanteras spelplanen och de två högarna på bordet skapas och hanteras. Det är här alla metoder för att kontrollera om spel dragen är godkända finns. Kod Kommando 0xx Kontrollerar om det är Stress 1yy Kontrollerar om kortet yy är tillåtet på stack 1 2yy Kontrollerar om kortet yy är tillåtet på stack 2 3xx Stänger ner anslutningen mot klienten Tabell 2 visar koder och kommandon som servern hanterar.
GameServerThread extends Thread: Här etableras unika anslutningar för att läsa och skriva mellan servern och varje klient. Här tas kommandon emot och svar skickas till klienten. TimeServerThread: Är en tråd som kollar tiden sedan ett giltigt kort las på någon av stackarna. Vid ett givet värde (ca 10 sek) så läggs två nya kort på stacken. Som också skickas ut till samtliga spelare. Användarhandledning När en spelare ansluter sig till spelet och spelet startar tilldelas alla spelare lika många kort. Man väljer en stack genom att klicka på den och den kan bytas hela tiden under spelets gång. För att bli av med korten väljer man ett av sina fyra kort som ligger på bordet som är ett lägre eller ett högre i värde än det kortet som ligger på den valda stacken. Om korten överst på stacken har samma värde kan man trycka på stress. Vinner gör man när alla ens kort är slut. Se Appendix A för användarmanual. Utvärdering Om vi hade gjort om detta projekt skulle vi gör om gör rätt med vilket vi menar att vi skulle strukturerat upp projektet betydligt bättre och bestämt alla klasser och metoder vi behövde innan vi började koda. Helt enkelt använda oss mer utav den kunskap av projektprocesser vi använt i tidigare kurser. Vi skulle vilja representera spelplanen på ett mer användarvänligt sätt med riktiga grafiska kort samt i färg. Dessutom möjligheten att se alla spelares kort och hur spelplanen ständigt uppdateras. Nätverksprogrammeringen har varit givande, men svår för oss studenter som kommer från Kinainriktningen och inte programmerat mycket på en längre tid. Detta är vad vi förstått inte ett problem för nästkommande årskurser för C programmet som har en annorlunda och ny kursplan. Det är en roligt och givande projekt och skapar intresse för programmering och spelutveckling samt nätverkskommunikation. Mer engagemang från handledare där ett enkelt mail i varannan vecka med information om inlämning och fråga hur det går skulle varit givande och vi skulle haft mer kunskap om hur vi låg till och när allting och hur allting ska redovisas.
Programlistor Attached as a zip file. Hemsida: http://users.student.lth.se/adi10jkl/ To do: Fixa lite buggar. Göra bättre grafik. Appendix A Användarmanual Stress Nätverksprogrammering projekt EDA095 LTH 1. Anslut till spelet genom att skriva in serverns IP Adress och portnummret är: 30000 2. Personen som agerar Server trycker på knappen Create Game när alla spelare som ska spela är anslutna klicka på starta spel. 3. Börja Spela a. För att välja en aktiv hög som man vill lägga kort på klickar man på önskad stack b. Korten man har på bordet representeras 4 knappar. c. För att välja Stress klickar man på stress knappen d. För att avsluta spelet stänger man programmet. 4. Regler a. Välj en av högarna på bordet b. Välj ett av dina fyra kort du har på bordet som har differensen 1 med kortet på högen. Exempel: Vald hög visar en 4:a, godkända kort är en 3:a och en 5:a. c. Specialfallet är Ess som både är det högsta och lägsta kortet. Det går alltså att lägga både en 2:a samt en kung: 13 d. När båda högarna visar samma värde tryck på Enter för Stress. Exempel: två 7:or e. Vinner gör man genom att bli av med alla sina kort först.