Objektorienterad modellering och design

Relevanta dokument
Övningsuppgifter i Objektorienterad modellering och design (OMD) Helsingborg EDAF25

OOP Objekt-orienterad programmering

Att skriva till och läsa från terminalfönstret

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 2. Länkad lista och iterator

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

OOP Objekt-orienterad programmering

Den som bara har en hammare tror att alla problem är spikar

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Föreläsning 8: Exempel och problemlösning

Föreläsning 2. Länkad lista och iterator

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

LÖSNINGSFÖRSLAG

Lösningsförslag till tentamen

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Objektorienterad programmering i Java

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Laboration A Objektsamlingar

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

DAT043 Objektorienterad Programmering

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Tentamen i Objektorienterad programmering

Algoritmer. Två gränssnitt

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

Tentamen , Introduktion till Java, dtaa98, dtea53

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Språkkonventioner och redigering av tal.

Föreläsning 3. Stack

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Föreläsning 3-4 Innehåll

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Föreläsning 12: Exempel och problemlösning

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Påminnelse: en datatyp för bilder. Programmering. En datatyp för bilder. Spegelbild. hh.se/db2004

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

OOP Tentamen

Lösningsförslag tentamen FYTA11 Java

Programmering för språkteknologer II, HT2014. Rum

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

SMD 134 Objektorienterad programmering

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Repetition av OOP- och Javabegrepp

Saker du ska kunna Föreläsning 13 & 14

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Händelsestyrd simulering. Inledning. Exempel

TENTAMEN OOP

Tentamensskrivning Nätverksprogrammering (EDA095 - FED) , kl 8-13

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Föreläsning 10. ADT:er och datastrukturer

Repetition av OOP- och Javabegrepp

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Chapter 4: Writing Classes/ Att skriva egna klasser.

Tentamen, EDAA20/EDA501 Programmering

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

TENTAMEN OOP

Lösningsförslag till tentamen

Tentamen Programmering fortsättningskurs DIT950

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

List.java. List.java. Printed by Tom Smedsaas

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Tentamen, EDA501 Programmering M L TM W K V

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Lösningsförslag till tentamen i EDA011 Programmeringsteknik för F, E, I, π och N

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Mer om metoder och abstraktioner

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Länkade strukturer. (del 2)

Transkript:

Lunds universitet Datavetenskap Lennart Andersson EDA061/EDAF10 Kursbokskomplement 2009-09-08 Mastermind Objektorienterad modellering och design Som ett exempel på objektorienterad programutformning skall vi implementera det sällskapsspel som kallas Mastermind. Tillverkarens regler följer. MASTERMIND is a game which gives each player a chance to outsmart his opponent. The Codemaker secretly sets up a line of Code Pegs behind his shield and the Codebreaker has up to ten opportunities to try and duplicate the colour and each exact position of the hidden Code Pegs without ever seeing them. The Codemaker secretly puts 4 Code Pegs in 4 holes behind the shield. Use any combination of the six colours. You may use 2 or more Code Pegs of the same colour if you wish. The Codebreaker will try to duplicate the exact colours and positions of the code hidden behind the shield. Each time the Codebreaker places a row of Code Pegs (they are then left in position troughout the game), the Codemaker must give him the following information by placing the black and white Key Pegs in the Key Peg holes alongside the Code Pegs placed by the Codebreaker, or leaving holes vacant. Black Key Pegs are placed by the Codemaker in any of the Key Peg holes for every Code Peg placed by the Codebreaker which is in the same colour and in exactly the same position as one of the Code Pegs behind the shield. White Key Pegs are placed by the Codemaker in any one of the Key Peg holes when any hidden Code Peg behind the shield matches the Codebreaker s Code Pegs in colour only, but not in position. Example: If one red Code Peg is behind the shield and the Codebreaker places 2 red Code Pegs in the wrong position ONE white Key Peg is used. If the Codebreaker duplicates the hidden code behind the Codemaker s shield, the Codemaker places 4 black Key Pegs and reveals the hidden code. The games is over. Invicta Plastic Ltd, Leicester, England. Även om problemet är litet och går att lösa med ett par sidor programkod skall vi göra en objektorienterad modell med ett tiotal klasser. Fördelarna med detta blir tydligare om problemet är större, men principerna blir tydligare i det lilla formatet. Ett större problem skulle ta mycket mer plats och tid utan att ge mycket mer. Objektorientering innebär att vi skall identifiera de objekt som finns i den verklighet vi skall simulera och bland dem välja ut dem som skall beskrivas med klasser i programmet. Presumptiva klasser finner man ofta som substantiv i beskrivningen av verkligheten. I reglerna finner vi följande substantiv: Mastermind, game, player, codemaker, opponent, line, code peg, opportunity, colour, position, hole, shield, combination, codebreaker, time, row, information och key peg. Några av dessa substantiv är objekt som ej skall modelleras av detta program. Detta gäller den player som är opponent och codebreaker, som skall finnas utanför programmet. Några substantiv representeras lämpligen med språkets primitiva typer. I vårt exempel är colour och position sådana substantiv. Substantiven line och row, som i texten används som synonymer och skulle 1

kunna reprersenteras med vektorer (array). Hole svarar mot ett index i en vektor. Code peg och Key peg svarar mot element i dessa vektorer vars värden är av typen colour. Substantivet shield har inget inre tillstånd och används i beskrivningen bara för att avskilja kodkonstruerarens pegs från kodknäckarens. Substantiven combination, time och information kräver inte några egen representation. Programmet är styrt av kommandon. Det går utmärkt att exekvera ett kommando direkt sedan man tolkat det. Vi kommer i stället att använda Command mönstret av pedagogiska skäl; vi vill visa hur det fungerar i ett litet problem även om det design mässigt är omotiverat. Vi kommer att implementera kommandon för att starta ett nytt parti, göra en gissning, inspektera alla tidigare gissningar och resultat, att inspektera den hemliga koden och att avsluta hela spelsessionen. Mastermind är ett lämpligt namn på den klass som representerar hela spelet. Spelets tillstånd utöres av den hemliga koden och en lista av gissningar. Den klass Code som skall representera koden och en gissning är central och kommer att innehålla metoder för att undersöka om två koder är lika och eller hur olika de är. Game får vare en klass som modellerar ett parti. Kodkonstrueraren, codemaker, kommer vi att simulera med en slumptalsgenerator, som vi hämtar ur java.util.random. Användarkommunikationen är primitiv och beskriv i en egen klass som också hinnehåller det minimala huvudprogrammet. 1 public class UI { 2 private MasterMind mastermind = new MasterMind(); 3 private BufferedReader input = new BufferedReader(new InputStreamReader( 4 System.in)); 5 private CommandParser parser = new CommandParser(); 6 public void play() throws IOException { 7 while (true) { 8 System.out.print("> "); 9 Command command = parser.build(input.readline()); 10 command.execute(mastermind); 11 } 12 } 13 public static void main(string[] argv) throws IOException { 14 new UI().play(); 15 } 16 } Den metod som analyserar ett kommando finns i CommandParser och tittar bara på det första tecknet. 1 public class CommandParser { 2 public Command build(string string) { 3 switch (string.charat(0)) { 4 case q : 5 return new Quit(); 6 case h : 7 return new History(); 8 case n : 9 return new NewGame(); 10 case s : 2

11 return new Solution(); 12 default: 13 return new Guess(string); 14 } 15 } 16 } Metoden bygger kommondoobjekt som implementerar gränssnittet Command. Några kommandon är utelämnade. 1 public interface Command { 2 public void execute(mastermind mastermind); 3 } 4 5 class Guess implements Command { 6 private Code guess; 7 Guess(String s) { 8 guess = new Code(s); 10 public void execute(mastermind mastermind) { 11 mastermind.add(guess); 12 System.out.println(masterMind.response(guess)); 13 } 14 } 15 16 class Solution implements Command { 17 public void execute(mastermind mastermind) { 18 System.out.println(masterMind.solution()); 20 } 21 22 class History implements Command { 23 public void execute(mastermind mastermind) { 24 System.out.println(masterMind.guessList()); 25 } 26 } 27 28 class NewGame implements Command { 29 public void execute(mastermind mastermind) { 30 mastermind.reset(); 31 } 32 } 33 34 class Quit implements Command { 35 public void execute(mastermind mastermind) { 36 mastermind.quit(); 37 } 38 } Klassen Code tillhandahåller två konstruerare, Code() som ger en slumpmässigt vald kod och Code(String s) som konstruerar koden från en given sträng. Vi väljer att representera koden med en vektor med fyra heltal. Det kan vara lämpligt att låta tale 1 till 6 svara mot de sex färgerna. Implementeringen av de metoder som avlsutas med semikolon är utelämnade. 3

1 public class Code { 2 public static final int SIZE = 4; 3 public static final int COLORS = 6; 4 private static Random random = new Random(); 5 private int[] code = new int[size]; 6 public Code() { 7 for (int i = 0; i < SIZE; i++) 8 code[i] = random.nextint(colors); 10 public Code(String s) { 11 for (int i = 0; i < s.length(); i++) { 12 code[i] = s.charat(i) - 1 ; 13 } 14 } 15 public String tostring() { 16 StringBuffer buffer = new StringBuffer(); 17 for (int i = 0; i < code.length; i++) { 18 buffer.append(code[i] + 1); 20 return buffer.tostring(); 21 } 22 public int getcolor(int index) { 23 return code[index]; 24 } 25 public boolean equals(object object) { 26 Code other = (Code) object; 27 for (int i = 0; i < SIZE; i++) 28 if (code[i]!= other.code[i]) 29 return false; 30 return true; 31 } 32 private int matches(code other) { 33 int m = 0; 34 for (int i = 0; i < SIZE; i++) 35 if (code[i] == other.code[i]) 36 m++; 37 return m; 38 } 39 private int occs(code other) { 40 int[] tmp = new int[size]; 41 for (int i = 0; i < SIZE; i++) 42 tmp[i] = other.code[i]; 43 int m = 0; 44 for (int i = 0; i < SIZE; i++) 45 for (int j = 0; j < SIZE; j++) 46 if (code[i] == tmp[j]) { 47 m++; 48 tmp[j] = -1; 49 break; 50 } 51 return m; 4

52 } 53 public Response response(code other) { 54 int m = matches(other); 55 int o = occs(other); 56 return new Response(m, o - m); 57 } 58 } Listan av gissningar representeras med klassen CodeList. 1 public class CodeList { 2 private List<Code> list = new ArrayList<Code>(); 3 public String tostring(code solution) { 4 StringBuffer buffer = new StringBuffer(); 5 for (Iterator<Code> iter = list.iterator(); iter.hasnext();) { 6 Code guess = iter.next(); 7 buffer.append(guess).append( ).append(guess.response(solution)) 8.append( \n ); 10 return buffer.tostring(); 11 } 12 public void add(code pattern) { 13 list.add(pattern); 14 setchanged(); 15 notifyobservers(pattern); 16 } 17 public int size() { 18 return list.size(); 20 public void clear() { 21 list.clear(); 22 } 23 public Code get(int index) { 24 return list.get(index); 25 } 26 } När man jämför en gissning med den hemliga koden får man veta hur många vita resp. svarta pegs som skall visas. För att kunna returnera detta talpar behövs en primitiv klass. 1 public class Response { 2 private int white, black; 3 public Response(int white, int black) { 4 this.white = white; 5 this.black = black; 6 } 7 public String tostring() { 8 StringBuffer buffer = new StringBuffer(); 9 for (int i = 0; i < white; i++) 10 buffer.append( + ); 11 for (int i = 0; i < black; i++) 12 buffer.append( - ); 13 return buffer.tostring(); 5

14 } 15 public int white() { 16 return white; 17 } 18 public int black() { 19 return black; 20 } 21 } Den klass som representerar hela spelet har inte mycket intelligens. 1 public class MasterMind { 2 private CodeList guesslist = new CodeList(); 3 private Code solution = new Code(); 4 public void add(code guess) { 5 guesslist.add(guess); 6 } 7 public int guesscount() { 8 return guesslist.size(); 10 public String guesslist() { 11 return guesslist.tostring(solution); 12 } 13 public void quit() { 14 System.exit(0); 15 } 16 public void reset() { 17 guesslist.clear(); 18 solution = new Code(); 20 public Response response(code guess) { 21 return guess.response(solution); 22 } 23 public Code solution() { 24 return solution; 25 } 26 } 6