Föreläsning 20 Textspelsprojekt Grunderna i programmering (Java) Jan Lönnberg Institutionen för datateknik -universitetets tekniska högskola 10.11.2010
Repetition HashMap public class CustomerDatabase { private HashMap<String, Customer> customers; public CustomerDatabase() { this.customers = new HashMap<String, Customer>(); public void addcustomer(customer newcustomer) { this.customers.put(newcustomer.getsocialsecuritycode(), newcustomer); public Customer getcustomer(string socialsecuritycode) { return this.customers.get(socialsecuritycode); public String getlist() { String list = ""; for (Customer current : this.customers.values()) { list += current.getname() + "\n"; return list; Föreläsning 20 Textspelsprojekt 2/17
AdventureBad-projektet AdventureBad Prova att spela spelet! Undersök spelet i debuggern. Föreläsning 20 Textspelsprojekt 3/17
AdventureBad-projektet Kritik Spelet fungerar men är ganska trist. Uppgift 8.2 handlar om att rätta till den bristen. Koden är svårt att utvidga. Att sätta till ett nytt område går ännu bra. Att sätta till nya rörelseriktningar är mer arbetsamt. Föreläsning 20 Textspelsprojekt 4/17
AdventureBad-projektet Nytt område Area northpole = new Area("North Pole", "You nd yourself at the North Pole. BRRR!"); northforest.setnorthexit(northpole); northpole.setsouthexit(northforest); Föreläsning 20 Textspelsprojekt 5/17
AdventureBad-projektet Ny rörelseriktning Vi vill t.ex. ha ett träd att klättra upp i. Vi behöver alltså riktningarna up och down. Det finns flera ställen som behöver ändras för att få en ny riktning att röra sig i. Adventure-klassen behöver förstås ett nytt område och information om hur man kommer till och från det. Area behöver nya instansvariabler upneighbor och downneighbour (och get- och set-metoder för dessa). Player.go-metoden behöver några if-satser till. Adventure.printAreaInfo behöver några if-satser till. Föreläsning 20 Textspelsprojekt 6/17
Refaktorering Kritik Det vore bättre om vi kunde komma undan med ändringar på några få ställen. Koden blir dessutom bara mer repetitiv ju mer riktningar vi sätter in. Vi försöker minimera upprepningarna och flytta så mycket som möjligt in i Area. Första steget är att bli av med alla metoder för olika riktningar. Föreläsning 20 Textspelsprojekt 7/17
Refaktorering public void addexit(string direction, Area neighbor) { if (direction.equals("north")) this.northneighbor = neighbor; else if (direction.equals("east")) this.eastneighbor = neighbor; else if (direction.equals("south")) this.southneighbor = neighbor; else if (direction.equals("west")) this.westneighbor = neighbor; Föreläsning 20 Textspelsprojekt 8/17
Refaktorering public Area getneighbor(string direction) { if (direction.equals("north")) return this.northneighbor; else if (direction.equals("east")) return this.eastneighbor; else if (direction.equals("south")) return this.southneighbor; else if (direction.equals("west")) return this.westneighbor; else return null; Föreläsning 20 Textspelsprojekt 9/17
Refaktorering Vad vann vi? Nya riktningar kräver inte mera nya metoder. Player.go-metoden blir enklare. public String go(string direction) { Area destination = this.location.getneighbor(direction); if (destination!= null) { this.location = destination; return "You go " + direction + "."; else return "You can't go " + direction + "."; Föreläsning 20 Textspelsprojekt 10/17
Refaktorering Bättre, men inte bra addexit och getneighbor har fortfarande en if för varje riktning och mera behövs för en ny riktning. Area behöver en instansvariabel för varje ny riktning. Adventure.printAreaInfo-metoden blev inte ett dugg bättre och måste fortfarande ändras för varje ny riktning. Nästa steg Vi ändrar Area så att varje områdes grannar finns i en HashMap istället för en skild variabel. Föreläsning 20 Textspelsprojekt 11/17
Refaktorering Vad ändras? Area får en ny HashMap<String, Area> neighbors istället för alla grannvariabler. Area.addExit reduceras till en put i denna avbildning. Area.getNeighbor reduceras till en get från denna avbildning. Vi flyttar sedan printareainfo till Area. De möjliga riktningarna kan sedan läsas från neighbors nyckelmängd. Vi kan nu lägga till nya riktningar bara med att skapa en ny utgång! Föreläsning 20 Textspelsprojekt 12/17
Modell mot användargränssnitt Mera kritik av AdventureBad Användargränssnittet och modellen av spelets värld är inte åtskilda. Modellen av världen skriver också text på skärmen! Adventure-objektet är en modell av äventyret och läser tangentbordet. Vad gör vi om vi vill ha en GUI för spelet eller två olika gränssnitt? Ändringarna är överallt! Mer generellt: hur kan vi använda en given modell med ett annat gränssnitt? Föreläsning 20 Textspelsprojekt 13/17
Modell mot användargränssnitt Skilj åt dem! I ett välskrivet program är modellen maximalt åtskild från gränssnittet. Modellen kommunicerar inte med användaren; den skriver inte ut saker, öppnar fönster eller reagerar på tangentslag eller klickningar. Gränssnittet kan ändras på eller bytas ut utan att röra vid modellen. Gränssnittet måste dock veta vad som kan göras med modellen. Gränssnittet beskriver modellen för användaren. Användarens input ges till modellen genom metodanrop. Föreläsning 20 Textspelsprojekt 14/17
Modell mot användargränssnitt Adventure Projektet Adventure är en bättre grund för fortsatt utveckling än AdventureBad. Ovannämnda förbättringar har gjorts (jämför!). AdventureTextUI sköter tangentbord och utskrift. Andra klasser bara tar emot och returnerar strängar; gränssnittets sak är att bestämma hur det här visas för användaren. Spelet är dock fortfarande bundet till text. Det finns också ett grafiskt gränssnitt. Föreläsning 20 Textspelsprojekt 15/17
Roll: Flagga Flagga Variabeln Player.hasQuit är en flagga. Flaggor visar att ett visst tillstånd gäller (om flaggan är hissad). Flaggor har bara två värden och är oftast av boolean-typ. Enkelriktad flagga En enkelriktad flagga kan bara byta värde en gång. T.ex. hasquit är false, men blir true om spelaren vill sluta och blir aldrig false igen. Se t.ex. rond 6 för mer exempel. Föreläsning 20 Textspelsprojekt 16/17
Slut Nästa föreläsning Rekursion 17.11.2010 16:15 18:00 i T1 Kom ihåg Deadline för åttonde ronden är tisdag 23.11 kl. 12! Föreläsning 20 Textspelsprojekt 17/17