• kth.se
  • Studentwebben
  • Intranät
  • kth.se
  • Studentwebben
  • Intranät
Logga in
DD1385 HT22 (prutt22)
Labb2
Hoppa över till innehåll
Översikt
  • Logga in
  • Översikt
  • Kalender
  • Inkorg
  • Historik
  • Hjälp
Stäng
  • Min översikt
  • DD1385 HT22 (prutt22)
  • Uppgifter
  • Labb2
  • Startsida
  • Kursöversikt
  • Moduler
  • Course Evaluation

Labb2

  • Inlämningsdatum 9 nov 2022 av 23.59
  • Poäng 0
  • Lämnar in en filuppladdning
  • Filtyper java
  • Tillgänglig 8 nov 2022 kl 0:00–9 nov 2022 kl 23.59
Den här uppgiften låstes 9 nov 2022 kl 23.59.

Laboration 2

Mål

  • Att förstå hur man med hjälp av interface kan specificera gränssnittet (beroendet) mellan två programdelar och hålla det litet.
  • Att förstå mönstret Model-View-Control och att tillämpa mönstret i en uppgift med Model för sig och View+Control tillsammans i en klass.
  • Att kunna hantera många knappar med lyssnare på ett smidigt sätt samt att bygga upp ett litet grafiskt gränssnitt.
  • Att programmera logiken i ett enkelt spel på ett snyggt och tydligt sätt.
  • Att förstå begreppet Mock object och göra ett sådant.

Uppgifter

Model

 Interfacet har metoder som används för att spela ett enkelt spel på en nxn-spelplan. Detta framgår av UML-diagrammet nedan. I labben ska minst ett av spelen Femtonspelet och TicTacToe implementeras enligt interfacet. (3x3-luffarschack med två faser https://www.youtube.com/watch?v=IDchqc56aQY Links to an external site. )

 

Boardgame.png

Varje drag i spelet utförs genom att man väljer en ruta genom att välja koordinaterna för varje ruta av rutnätet. Metoden move anropas och draget utförs, vid ett genomfört drag så returneras true och vid ett drag som inte går att genomföra returnerar metoden false. Spelets ställning uppdateras då inuti klassen och kan avläsas position för position genom metoden getStatus.  Anrop av getMessage ger ett aktuellt meddelande som säger om draget gick bra eller ej. Vid felaktigt drag ska hjälpsam information ges.

Spelklassen ska vara helt fri från grafik och utgör modelldelen i Model-ViewControl. Spelklassen kan användas tillsammans med en textbaserad ViewControl-del eller en grafisk.

Spelmodellens uppgift är att tillhandahålla metoder som behövs för att man ska kunna spela spelet. Spelet spelas genom många anrop av metoderna.

I grunduppgiften ska ett av spelen Femtonspelet och TicTacToe implementeras, du får välja själv.
 
TicTacToe ska implementeras med en utplaceringsfas och en "flyttfas". Spelet ska alltså inte ta slut när 3 + 3 pjäser är utplacerade utan fortsätta genom att en användare i taget flyttar en pjäs. Programmet kan detektera vinnare, men det är inget krav.
I TicTacToe så måste modellen hålla reda på vems tur det är och meddela detta genom getMessage(). Vartannat lyckat drag tolkas som spelare1 och vartannat är spelare2. Men turen byts inte för misslyckade drag.

 

Uppgift 1 – Implementera ett Femtonspel

Läs åtminstone t.o.m. uppgift 2 noga (testen av modellen) innan ni börjar!

Känner du inte till Femtonspelet? Läs då på wikipedia: http://sv.wikipedia.org/wiki/Femtonspel Links to an external site..

Skapa en klass, FifteenModel,som implementerar interfacet Boardgame. Lägg till metoder och variabler som du tycker att det ska deklareras i klassen.

Vilka metoder måste vara public och vilka variabler och metoder ska deklareras private. 
Spelaren väljer en ruta som ligger intill den tomma. Då flyttas den valda rutan till den tomma platsen.
  • När Femtonspelet startar ska sifforna vara i slumpmässiga positioner.
  • Det krävs inte att ditt program indikerar att spelet är löst.

Uppgift 2 – Testa FifteenModel

Provkör ert spel med följande testprogram som inte ska ändras alls. Testprogrammet finns också att hämta här:Text15.java.
import java.util.*;
class Text15 {
    public static void main(String[] u) {
        Scanner scan = new Scanner(System.in);
        Boardgame thegame = new FifteenModel();                 // Model object is created
        System.out.println("\nWelcome to fifteen puzzle\n");
        while (true) {
            // Print the current board
            for (int i=0; i<4; i++) {
                for (int j=0; j<4; j++)
                    System.out.print("  " + thegame.getStatus(i,j)); // getStatus
                System.out.println();
            }
            System.out.println();
            System.out.print("Your move: ");
            int i = scan.nextInt();  // get an int number from terminal window
            int j = scan.nextInt();
            thegame.move(i,j);	                             // move
            System.out.println(thegame.getMessage());	     // getMessage
        }
    }
}
Studera testprogrammet noga och lägg märke till att kommunikationen med modellklassen sker endast genom metoderna i interfacet. Klicka här för att få se en körning av Test15: Text15-demo. 

Det är rätt jobbigt att spela Femtonspelet i ett terminalfönster. Det blir mycket trevligare i den grafiska varianten.

 

Uppgift 3 – View-Control

Skriv en grafisk klass, ViewControl, som visar och spelar ett nxn-"rutspel" av typen Boardgame. n ska vara parameter när objekt av klassen skapas. Klassen ska ha nxn knappar som representerar rutorna. Ett meddelandefält ska också finnas där resultatet av anrop av getMessage() visas. Spelet spelas enligt interfacet Boardgame, endast metoderna i Boardgame får användas i kommunikationen mellan ViewControl och Boardgame. När spelet startas (ett objekt av ViewControl skapas) ska starttillståndet visas direkt genom att det läses av från Boardgame.

Själva spelet går till så att användaren klickar på en ruta och i och j avläses. Därefter anropas metoderna i modellen: Först move(i,j) och sedan getMessage() och sen eventuellt getStatus(i,j) för uppdatering av alla knapparna. ViewControl får inte innehålla något som är specifikt för Femtonspelet.  Här är ett förslag på start av ViewControl

// lämpliga import-satser här
class ViewControl extends JFrame implements ActionListener {

    private Boardgame game;
    private int size;
    private Square[][] board;        // Square är subklass till JButton
    private JTextField mess = new JTextField();  // JLabel funkar också

    ViewControl (Boardgame gm, int n){  // OK med fler parametrar om ni vill!
         ...
    }

 Tips

  • En subklass till JButton som lagrar indexen i och  j rekommenderas.
  • Testa klassen innan den är helt klar genom att låta knapptryckningarna skriva ut texter av typen 

       "Tryck på knapp 3 1"    i terminalfönstret. 

    Man kan vänta med att införa Boardgame tills den testen är klar, eller så sätter man Boardgame-objektet till null till att börja med.

 

Uppgift 4 – Sätt ihop

Sätt ihop en FifteenModel och en View-Control till ett spelbart spel.

 

Uppgift 5 – Ett Mock Object för ytterligare ett spel

Implementera Boardgame för ytterligare ett spel men utan spelets funktionalitet, som ett Mock Object. Ingen logik alls behövs och metoderna kan göra nästan ingenting. De kan returnera samma svar hela tiden, bara svaren är av rätt typ. Spelet ska ha en annan storlek än det spel ni redan gjort. Sätt ihop med ViewControl!

 

Att redovisa för grunduppgift

  1. En spelmodellsklass för Femtonspelet som kommunicerar enligt gränssnittet Boardgame. Ingen grafik får finnas i den klassen.
  2. Test av modellen för Femtonspelet genom att köra programmet Text15 ovan.
  3. En generell ViewControl-klass med en rutindelad kvadratisk (nxn) spelplan som spelar ett spel enligt interfacet Boardgame. n är parameter när spelplanen skapas.
  4. Ett program som sätter ihop Model enligt 1 och ViewControl till ett spelbart grafiskt spel. När spelet startar ska det finnas text på alla rutor utom den tomma. Man ska inte behöva trycka på någon knapp för att få se startbilden.
  5. En mini-implementation i form av ett "Mock Object" av en annan spelmodell än den ni valt i 1 och en demo med ViewControl av detta spel.
  6. UML-klassdiagram för allt. Tag med de publika metoderna för varje klass men inga variabler. Metodernas parametrar behöver inte vara med. Eventuella klasser som enbart innehåller en main-metod behöver inte heller vara med i diagrammet. Superklasser till biblioteksklasser ska inte tas med i UML-diagrammet. Gäller t.ex. superklasser till JFrame och JButton.

 

Extrauppgift för högre betyg

Välj ett annat rutspel än det i grunduppgiften, dvs välj i första hand TicTacToe om ni har gjort Femtonspelet i grunduppgiften och tvärtom. Det är tillåtet att välja andra spel här, men de flesta är svårare att implementera och det behövs inte här. Svårare spel  kan sparas till projektuppgiften. Implementera det nya spelets  spelmodell som ett fullständigt Boardgame och gör ett spelbart spel med hjälp av ViewControl-klassen. Textbaserad test rekommenderas men behöver inte redovisas. Det är alltid en bra teknik att testa programdelar var för sig innan de sätts ihop.

Samma ViewControl som i grunduppgiften används alltså även till detta spel.

TicTacToe ska implementeras med en utplaceringsfas och en "flyttfas". Spelet ska inte ta slut när 3 + 3 pjäser är utplacerade utan fortsätta genom att en användare i taget flyttar en pjäs. Ni behöver inte detektera att någon vunnit.

 

1668034799 11/09/2022 11:59pm
Inkludera en beskrivning
Ytterligare kommentarer:
Maxresultat för gradering till > poäng
Inkludera en bedömningstitel

Matris

Hitta matris
Inkludera en titel
Hitta en matris
Titel
Du har redan bedömt studenter med den här matrisen. Större ändringar kan påverka resultaten för deras uppgifter.
 
 
 
 
 
 
 
     
Det går inte att ändra en matris efter att du börjat använda den.  
Titel
Kriterier Bedömningar Poäng
Det här kriteriet är länkat till ett lärandemål Beskrivning av kriterium
tröskel: 5 poäng
Redigera beskrivning av kriterium Ta bort kriterium rad
5 till >0 poäng Full poäng blank
0 till >0 poäng Inga poäng blank_2
Det här området kommer användas av utvärderaren för kommentarer relaterade till det här kriteriet.
poäng
  / 5 poäng
--
Ytterligare kommentarer
Det här kriteriet är länkat till ett lärandemål Beskrivning av kriterium
tröskel: 5 poäng
Redigera beskrivning av kriterium Ta bort kriterium rad
5 till >0 poäng Full poäng blank
0 till >0 poäng Inga poäng blank_2
Det här området kommer användas av utvärderaren för kommentarer relaterade till det här kriteriet.
poäng
  / 5 poäng
--
Ytterligare kommentarer
Poängsumma: 5 av 5