Hexaflip Analysis and Design Document Version 2.0 α Last modified: 2009 04 18 Martin Larsson marla316@student.liu.se Carl Lindwall carli914@student.liu.se Detta dokument beskriver hur programmeringsprojektet HexaFlip skall konstrueras. Dokumentet är menat att finnas till hands som en hjälp för de människor som sedan skall omsätta idéerna till programkod. Dokumentet innehåller en klassbeskrivning, en beskrivning av hur programmet är tänkt att fungera i olika användarsammanhang samt en plan på hur spelet skall testas.
Innehåll Dokumentkonventioner...3 Klassdiagram...4 Klassbeskrivning...5 Game...5 Board...5 BoardTile...5 Tile...5 Player...5 GUIDrawer...5 NewUserDrawer...5 MyTilesDrawer...5 HighscoreDrawer...5 HexaStoreDrawer...5 MySQLSpeak...6 Connector...6 HostDrawer...6 JoinDrawer...6 TilePickDrawer...6 WaitingDrawer...6 SingleHexagonComponent...6 GameDrawer...6 WaitForInput...6 TurnWaiter...6 BoardComponent...6 Use case diagram...7 Interaktivitetsdiagram...7 Aktivitetsdiagram...8 Tillståndsdiagram...9 Spelbrädet...9 Spelarens spelomgång...9 Testplanering...9 Testutförande...10 MySQLSpeak...10 BoardComponent...10 Board...11 Connector...11 HexaStoreDrawer...12 GameDrawer...12 Game...12 Övriga...12
Dokumentkonventioner Varje textdokument i projektet ges ett namn och ett dokumentnummer som är datumet för den dag dokumentet först skapas (ÅÅÅÅ MM DD) samt ett versionsnummer som ursprungligen är 0.0 och sedan ökar på höger sida om punkten med ett steg i taget enligt 0.1, 0.2... 0.11, 0.12 etc. Varje gång ett dokument skickas in till ledningen för kursen TDDC32 nollställs höger sida om punkten och den vänstra sidan ökar med ett t.ex. 1.0, 2.0 etc. Efter granskning kommer dokumentnumret sedan fortsätta att öka på höger sida enligt tidigare. De diagram som presenteras nedan följer i någon mening UML standarden. All kommunikation i projektet kommer att vara på svenska. Ytterligare dokumentkonventioner kommer att tilläggas till detta dokument om och när behov uppstår.
Klassdiagram Nedan visas ett klassdiagram över de klasser som ingår i programmet HexaFlip.
Klassbeskrivning Game Denna klass innehåller main() metoden. Klassen innehåller variablerna för att styra nätverkskommunikation samt den grundläggande linjära koden för spelet. Förrutom detta innehåller den även funktioner för att rensa upp efter avslutat spel eller vid oväntat avbrott under en spelomgång. Game läser efter att användaren loggat in in de brickor som denne förfogar över med hjälp av MySQLSpeak. Board Klassen som beskriver ett spelbräde. Innehåller 25 BoardTile på vilka man kan läcka en Tile vardera. Innehåller metoder för att svara på om brädet är fullt och vem som är vinnaren. BoardTile Symboliserar en plats på spelbrädet där en Tile kan läggas. Innehåller pekare på angränsande BoardTiles. Tile En bricka. Ägs av en spelare och har olika styrkor på sina sex sidor beroende på vilken TileType den är. Player Klassen som innehåller spelarinformation. Sparar spelarnamn, brickor som spelaren äger, poäng spelaren har, etc. GUIDrawer Ritar upp både loginskärmen och huvudmenyn. Loginskärmen skapar en instans av NewUserDrawer om spelaren vill skapa en ny användare. Dessutom kommunicerar den med databasen vid inloggning genom användning av MySQLSpeak. Huvudmenyn innehåller alternativen; se egna brickor, highscore, hosta, joina, köpa brickor och avsluta. Samtliga alternativ skapar en instans av en annan Drawer klass som sedan hanterar respektive funktion. NewUserDrawer Ritar upp en skärm för att skapa en ny användare. Kommunicerar med MySQLSpeak vid skapandet denne. MyTilesDrawer Ritar upp en lista över de brickor spelaren äger samt ritar ut den bricka som spelaren har vald i listan. HighscoreDrawer Ritar upp en lista över de tio spelarna med högst poäng. Ber databasen om dessa med hjälp av MySQLSpeak. HexaStoreDrawer Ritar upp en butik där spelaren kan handla nya brickor för sina intjänade poäng. En lista över olika typer av brickor med tillhörande priser samt en förklarande utritning av den för tillfället valda brickan ritas ut samt tillhörande knappar med funktioner. Vid ett eventuellt köp används MySQLSpeak för att tillgodoräkna spelaren den nya brickan.
MySQLSpeak En klass utan konstruktor som innehåller funktioner för att kommunicera med databasen. Innehåller inloggningsuppgifter samt färdigformulerade SQL frågor. Connector Klassen som ansluter till motståndaren. Anropas från klasserna HostDrawer och JoinDrawer och anropar när en anslutning är upprättad klassen TilePickDrawer. HostDrawer Ritar en ruta där det står att man väntar på motståndaren som ansluter med Join Game. Fortsätter sedan med att skapa en Connector som väntar på en anslutning. JoinDrawer Ritar en ruta där man kan mata in motspelarens IP address och sedan skapar en den Connector som ansluter till denna address. TilePickDrawer Tillåter användaren att välja ut 13 brickor ur sina brickor för att använda under en spelomgång. Två listor en med spelarens samtliga brickor och en med de valda brickorna ritas ut samt tillhörande knappar för funktionsanrop. När valet är färdigt skapas en WaitingDrawer som ser till att motspelaren också valt klart sina brickor. WaitingDrawer Visar en ruta som talar om att spelaren väntar på sin motståndares val av brickor. Startar en WaitForInput som hanterar väntandet. SingleHexagonComponent Ritar ut en TileType med tillhörande hexagonform samt styrkor etc. Extendar JComponent. GameDrawer Hanterar en spelomgång genom att rita ut ett interface med en spelplan och spelarens brickor. Då spelaren väljer att lägga ut en bricka eller när den TurnWaiter som väntar på motståndaren inte väntar längre utförs den spellogik som krävs varefter det hela börjar om igen. När brädet är fullt delas poäng ut genom MySQLSpeak och sedan ritas en ny huvudmeny ut. WaitForInput Väntar på att motspelaren väljer klart sina brickor innan en spelomgång. När detta kriteria är uppfyllt startas en GameDrawer. TurnWaiter En tråd som väntar på att motståndaren skall skicka den bricktyp och plats han valt. BoardComponent Ritar ut ett helt spelbräde med olika färger för de olika spelarna. Extendar JComponent.
Use case diagram Användaren kan efter att denne loggat in välja bland alternativen: köpa brickor; se på highscoren; se egna brickor; hosta; joina och; avsluta spel. När spelaren väljer att starta ett nytt spel kan denne välja att hosta eller joina ett spel som någon annan hostat. Spelarna måste välja olika alternativ en skall hosta och den andra joinar den första. Efter att en anslutning upprättats kommer spelarna att få välja vilka brickor de skall använda och dessa placeras sedan ut under spelets gång. Den spelare som till slut vinner får poäng för sin vinst. Interaktivitetsdiagram Vi anser inte att dessa behövs I vårt projekt som är av ringa storlek.
Aktivitetsdiagram Aktivitetsdiagrammet beskriver en spelomgång för en av spelarna vilken refereras till som mänsklig spelare ett. Spelaren får först logga in i spelet och eventuellt skapa en ny användare. När detta är gjorts visas huvudmenyn där spelaren har ett antal val. Om spelaren väljer HexaStore visas butiken där spelaren kan spendera sina intjänade poäng för att köpa nya brickor. Han eller hon återvänder sedan till huvudmenyn. På samma sätt kan spelaren välja att få sina egna brickor visade i tabellform under valet se egna brickor. När ett nytt spel skall startas väljer spelaren om han eller hon vill serva eller ansluta till ett spel. Motståndaren gör motsatsen och den som ansluter till servern får skriva in serverns IP address. Sedan får spelarna välja 13 av sina brickor att spela med och efter det drar spelet igång. Spelarna turas om att lägga brickorna på brädet och när brädet är fullt koras en vinnare som får poäng varefter båda spelare återvänder till huvudmenyn.
Tillståndsdiagram Spelbrädet Brädet kan stå i tre olika lägen; tomt, delvis fullt eller fullt. GameDrawer anropar brädets isfull() funktion för att kolla när brädet har nått läget att det är fullt och då exekveras den kod som skall följa. Brädet återvinns ej utan ett nytt bräde skapas varje gång en ny spelomgång skapas. Spelarens spelomgång Spelaren kan antingen vara i läget min tur eller i läget väntar på motståndaren. När spelbrädet har blivit fullt avgörs vem som vunnit och spelaren kan då hamna i lägena förlorare eller vinnare. Testplanering Tester utfördes kontinuerligt under utveckligsprocessen för att snabbt kunna rätta till eventuella fel. Modulerna testades tillsammans med varandra av diverse små testprogram som skrevs för endast detta syfte. Informationen i databasen kollades också regelbundet så att den stämde med det som
förväntades. Dessutom genomfördes en rad betatester av olika vänner till de medverkande i projektet. Resultatet av testerna finns att läsa i testprotokollet. Testutförande MySQLSpeak Det skall vara möjligt att hämta och äntra värden i databasen Registrering av ny användare funkar problemfritt. 13 slumpvis utvalda brickor ges till spelaren. Köpt bricka i HexaStore läggs till utan problem Vunnen spelomgång belönas med två poäng, som förväntat. Vid ny spelomgång hämtas egna brickor från databasen, utan problem. Det skall ej gå att registrera ett befintligt konto Befintligt konto går ej att registrera. Input av rätt användarnamn men fel lösenord skall generera felruta Som förväntat. Dock loggas användaren in om han skriver rätt användarnamn, men lägger till ett godtyckligt antal mellanslagstecken efter korrekt lösenord i lösenordsfältet. BoardComponent Linjerna ritas ut på ett grafiskt acceptabelt sätt. De blir inte sneda Efter mindre tweaking arbete blir det visuella som förväntat Att färger representeras på rätt sätt dvs. blå färg för egen bricka och röd färg för motståndarens bricka. Att färgen ändras då någon spelare vinner över motspelarens bricka
Fungerar felfritt. Board När spelare lägger ut en bricka som på given sida är starkare än närliggande motståndarbricka, skall närliggande motståndarbricka flipper över och tillfalla spelaren. Vid lika värde skall ingenting ske. Funger som sig bör. Att spelet avslutas när spelare 1 lagt sin trettonde bricka, och att spelet anger vem som är vinnare. Som förväntat. Skall ej gå att lägga bricka på icke ledig position Spelare som försöker sig på detta får felmeddelande Spelet skall ge felmeddelande då en spelare matar in konstigt värde, dvs en inputsträng annan än [1,25] Såväl för blanka, som icketillåtna värden (bokstäver, symboler och siffror) kommer ett felmeddelande upp. Connector Personen som skriver in ett ip till en hostande motpart skall kunna connecta Fungerar felfritt. Såväl inom LAN med lokala adresser som WAN. Personen som hostar och väntar på en anslutande motspelare, tas till brickväljarrutan när då skett
Oklanderligt. HexaStoreDrawer Det skall ej gå att köpa en bricka som man ej har råd med Mycket riktigt kommer ett felmeddelande upp När man köpt en bricka skall relevant andel poäng dras från användarens konto. Dock skall highscorevärdet förbli detsamma Fungerar väl. GameDrawer Turhanteringsalgoritmen (varannan gång) fungerar korrekt och intuitivt Ja. Vinnaren får två poäng, vilka läggs in i databasen medelst MySQLDrawer Nemas problemas. Game Att variablerna töms efter en spelomgång (ej gammal information ligger kvar) Gav till en början konstiga värden då vi glömt skriva kod för nollställande av vissa variabelvärden. Vid senare iteration fungerar allt fläckfritt. Övriga Resten av modulerna testades kontinuerligt i utvecklingsprocessen