P1. Projekt01 - Slutprojekt

Vi avslutar kursen med ett slutprojekt. Eftersom kursen haft mest fokus på spelutveckling så kommer de flesta att göra en spel som sluprojekt men det finns också möjlighet att göra andra applikationer. Detta projekt är tyngdpunkten i betyget på kursen.

Coronaviruset

Eftersom vi just nu lever mitt i coronavirusets tid så kan saker och ting förändras. Denna planering är gjord utifrån att vi kan bedriva så ordinarie undervisning som det bara är möjligt.
Alla förändringar som sker får vi helt enkelt leva med och göra det bästa av.

P1.1 Uppgift

När du har gjort alla obligatoriska moment under kursen så är du förhoppningsvis redo att fundera på vilket betyg som du strävar efter och väljer sedan ett projekt som hjälper dig att nå detta betyg.

P1.1.1 Obligatoriska uppgifter

Följande uppgifter visar på grundläggande färdigheter och dessa är saker vi skall bocka av vid redovisningen, eller innan, att det är genomfört.

Obligatoriska uppgifter för samtliga betyg

Uppgift
2.2.1 OOP Grund
2.2.2 OOP Samling
3.2.1 OOP Arv
3.2.2 OOP Generisk klass
SpaceShooter, spelet enligt tutorial
4.2 HighScore
5.1.1 Tutorial CarGUI
5.2.1 Tutorial API biluppgifter.se
5.4.2 Tutorial med databas

P1.2 Arbetssätt

I Google Classrom så finns det en uppgift kopplat till Projekt01 - Slutprojekt som innehåller ett dokument som du skall använda när du genomför ditt slutprojekt. I detta dokument så planerar och dokumenterar du ditt arbete.
Denna planering är grunden till redovisningen som sedan skall genomföras. Dokumentation och loggbok visar hur ditt arbete fortgår.

P1.3 Betyget E

Förutom de obligatoriska delarna så skall du för betyget E utföra uppgifter för att samla in fem utvecklingspoäng från tabellen nedan. Du kan själv välja hur du skall samla dessa fem utvecklingspoäng men du måste nå de krav som presenteras för betyget E.

P1.3.1 Krav för betyget E

Följande saker behöver du visa för att nå betyget E.

  • Bygg en egen klass som implementeras i spelet.
  • Bygg ett UML-diagram, utifrån bokens exempel på sid 99, där du ritar in din nya klass. Alla klasser skall ritas in i UML-diagrammet men medlemmar behövs bara skapas för din klass, föräldern till din klass (Enemy är förälder till Mine) samt eventuella syskon till din klass, (Tripod är syskon till Mine).
  • Välj sedan fem poäng från listan av utvecklingspoäng. Dokumentera vilka poäng du valt att jobba med i ditt planeringsdokument.

Utvecklingspoäng [klicka för att visa]

Här listas exempel på uppgifter att göra för att samla ihop de utvecklingspoäng som krävs för att nå ett visst betyg.

UppgiftPoängNotering
Skapa en ny fiende med egen klass.1Lämpligt för betyget E
Skapa ett UML-diagram för spelets samtliga klasser, samtliga medlemmar för egenskapade klasser, dessa klassers föräldrar och syskon.1Lämpligt för betyget E
Ta bort en bullet när den träffar en fiende1Lämpligt för betyget E
Spawna nya fiender under spelets gång.1Lämpligt för betyget E
Se till att spelet nollställs på bra sätt innan nästa omgång.1Lämpligt för betyget E

Det är fullt möjligt att välja andra uppgifter också, dessa är presenterade under betyget C.

Hjälp till betyget E [klicka för att visa]

Här finns lite hjälp för att klara av de fem utvecklingspoäng som behöver göras för att uppnå betyget E på slutprojektet och kursen.

  1. Vi börjar med den nya fiendeklassen. Du har redan skapat två fiender så att det finns bra exempel med kod som går att återanvända. I filen Enemy, om du inte skapat egna filer för Mine och Tripod, så skall du nu skapa din nya klass. Hitta på ett bra namn, skapa eller leta upp en sprite som du har rätt att använda och bestäm hur din nya fiende skall röra sig. Skapa klassen i Enemy, eller egen fil, och sedan ser du till att i klassen GameElements skapar den nya fienden på samma sätt som du skapar Mine och Tripod samt lägger de nya fienderna i listan enemies.
  2. På sidan 99 i boken så finns det ett UML-diagram för applikationens alla klasser. Du skall nu göra om denna till din egen, förslagsvis i draw.io. Klasserna Enemy, Tripod, Mine och DinEnemy skall ha alla medlemmar utskrivna. För de andra klasserna räcker det med klassnamn. Var nogrann med att det finns en struktur på ditt UML-diagram, det skall vara tydliga pilar som pekar mot basklassen. Strukturen som visas i boken på sid 99 skall följas.
    Egna lösningar som avviker från denna kommer inte godkännas utan ger rest och kräver komplettering.
  3. Låt en kula (bullet) försvinna efter träff mot fiende. Koden nedan hittar du i klassen Player och den tar bort de kulor som i medlemsvariabeln IsAlive har värdet false. Det finns alltså redan en logik för att rensa bort dessa kulor, nu blir ditt uppdrag att leta upp kollisionen mellan bullet och enemy och sätta värdet på IsAlive till false på den specifika bullet som har träffat en fiende.
    // Flytta på alla skott
    foreach(Bullet b in bullets.ToList())
    {
      // Flytta på skottet
      b.Update();
      // Kontrollera ifall skottet är dött
      if (!b.IsAlive)
        // Ta bort skottet ur listan
        bullets.Remove (b);
    }
  4. I spelet så skapas det slumpmässigt nya guldmynt som ger spelaren möjlighet att samla poäng. Hittills i spelet så skapas det bara fiender när spelet startar men nu vill vi skapa fiender även under spelets gång. I klassen GameElements finns logiken för att slumpa fram ett värde och skapa ett guldmynt om det slumpade värdet är 1. Här kan vi bygga en ny logik som innebär att vi slumpar fram ett värde mellan 1 och någonting (ju högre värde vi sätter, desto mer sällan kommer det inträffa, sätter vi 60 kommer det statistiskt att skapas en ny fiende varje sekund) och sedan så ser vi till att om det slumpade värdet är 1 så skapas en Mine, om det är 2 så skapas en Tripod och om det är 3 så skapas vår nya fiende. OBS! Gör inte denna logiken samtidigt som guldmynten skapas, utan gör det innan eller efter, återanvänd gärna variabeln random för att slumpa fram ett nytt tal.
  5. Fundera på hur spelet ser ut när det startar.
    • Spelaren har 0 poäng.
    • Spelaren har en specifik position.
    • Det finns ett visst antal fiendeobjekt i listan.
    • Listan med guldmynt är tom.
    På samma sätt skall spelet återstartas när spelaren har dött. Att göra detta i en metod underlättar då kan denna metod även anropas när spelet startar.

P1.4 Betyget C

Förutom att uppgifterna för P1.1.1 Obligatoriska uppgifter är genomförda så skall grundkrav och krav på slutprojekt för betyget C vara uppfyllda för att nå betyget C.

P1.4.1 Grundkrav för betyget C

För betyget C finns två grundkrav från tidigare moment.

  1. Bygg in applikationen HighScore i SpaceShooter (eller något annat projekt). Resultatet behöver inte överföras men HighScore (applikation & klassen) skall implementeras med projektet.
  2. Bygg ihop minst två av tutorials i M05 (GUI, API, DB), M02/M03 (OOP Grund, OOP Samling, OOP Arv, OOP Generisk klass) så att de fungerar i en applikation. Denna applikation skall ej krascha vid felaktig inmatning. Kombinationen GUI & DB är inte tillåten då dessa redan bygger på varanda.

P1.4.2 Krav på slutprojektet (SpaceShooter)

Följande saker behöver du utöver grundkraven visa för att nå betyget C.

  • Bygg minst en egen klass som implementeras i spelet, denna klass skall vara ett nytt barn till en annan klass men får inte vara en syskonklass. Det räcker alltså inte att skapa en tredje eller fjärde Enemy. Att skapa en ny PowerUp och bygga en basklass för dina bägge PowerUp's är däremot tillåtet.
  • Välj sedan femton poäng från listan av utvecklingspoäng. Dokumentera vilka poäng du valt att jobba med i ditt planeringsdokument. Tänk på att poängen som står angiven till varje uppgift är en maxpoäng. Att göra några extra poäng för att ha en marginal är ingen nackdel.

Utvecklingspoäng [klicka för att visa]

Här listas exempel på uppgifter att göra för att samla ihop de utvecklingspoäng som krävs för att nå ett visst betyg.

UppgiftPoängNotering
Skapa en ny fiende med egen klass.1Lämpligt för betyget E
Skapa ett UML-diagram för spelets samtliga klasser, samtliga medlemmar för egenskapade klasser, dessa klassers föräldrar och syskon.1Lämpligt för betyget E
Ta bort en bullet när den träffar en fiende1Lämpligt för betyget E
Spawna nya fiender under spelets gång.1Lämpligt för betyget E
Se till att spelet nollställs på bra sätt innan nästa omgång.1Lämpligt för betyget E
Lägga till fler PowerUps.1-2Lämpligt sätt att lägga till en ny klass som påverkar arvsstrukturen.
Ändra poängsättningen, fler poäng för vissa Enemies/PowerUps.1
Alla objekt dör inte vid en träff, det kan krävas flera skott för att döda en Enemy. Detta ger mer poäng när det lyckas.1
Andra fiender, kanske en som åker i en viss riktning en viss tid och sedan slumpar om, kanske ändras farten också?2
Animera objekt som dör!1
Skapa hinder i banan, tex labyrint eller planeter. Antingen studsar allt på objektet, eller så hindras det bara eller så kan player inte åka igenom men det kan enemy. Risk att bli fångad.2-3
En utväg? För att komma vidare till nästa bana skall x antal poäng uppnås sedan skall en dörr öppna sig och det är möjligt att åka ur banan2
Olika vapen, skott och raketer? Olika kommandon för att skjuta. Skjuta i olika riktning?1-2
En boss som kräver flera skott för att döda. Kanske rör den sig mot mig?1-3
Skjuta ett studsande skott som dör när första träff görs, men som också kan döda mig.2
Lägga tidsinställda bomber?2

Detta är ett antal förslag på uppgifter som kan lösas. Kom gärna med egna förslag. Flera av uppgifternas poängantal varierar lite beroende på vilken lösning som presenteras. Ta fram de uppgifter som du vill använda för att bygga ut spelet och så diskuterar vi betygsnivån på den planerade uppgiften.

För betyget D skall ett av grundkraven, P1.4.1, vara uppnådda samt minst 10 utvecklingspoäng.

P1.4.3 Krav på slutprojektet (eget projekt)

Bygg ett eget spel, eller annan applikation där OOP har en avgörande påverkan på lösningen. Presentera planering och betygsambition innan du startar för godkännande av lärare.

P1.5 Betyget A

Förutom att uppgifterna för P1.1.1 Obligatoriska uppgifter är genomförda så skall grundkrav och krav på slutprojekt för betyget A vara uppfyllda för att nå betyget A.

P1.5.1 Grundkrav för betyget A

För betyget A finns två grundkrav från tidigare moment.

  1. Bygg in applikationen HighScore på lämpligt sätt i ditt slutprojekt (eller SpaceShooter). Resultatet skall överföras till HighScore och lagras.
  2. Bygg ihop minst två av tutorials i M05 (GUI, API, DB), M02/M03 (OOP Grund, OOP Samling, OOP Arv, OOP Generisk klass) så att de fungerar i en applikation. Denna applikation skall ej krascha vid felaktig inmatning. Kombinationen GUI & DB är inte tillåten då dessa redan bygger på varanda.

P1.5.2 Krav på slutprojektet (eget projekt)

Om du vill sträva efter betyg högre än C så gäller det att skapa ett eget spel från grunden, göra stora utbyggnader av SpaceShooter, eller skapa en annan applikation. Givetvis skall du använda dig av de kunskaper du har fått under arbetet med tutorial men det är nu du skall visa dig flygfärdig som programmerare och skapa en applikation som bygger på objektorienteringens grundprinciper, inkapsling, arv och polymorfism (precis som tutorialen gjorde).

Gör en projektplan, skissa lite på spelidén och skapa ett UML-diagram över de klasser och arv du kommer jobba med. Gör också en schematisk bild över hur applikationen skall se ut, allt för att vi skall kunna se att applikationen är avgränsat så att du hinner klart med projektet innan kursens slut.

Kika sedan i kolumnen längst till höger i skolverkets kunskapskrav och kolla så att det du håller på med uppnår dessa krav. Sedan är det dags att visa upp din planering för läraren.

Komplexiteten i uppgiften och kvalitet på lösningen kommer vara grunden till att nå betyget A. Fokus i denna kursen är objektorienteringens grundprinciper, inkapsling, arv och polymorfism så detta är en stor del av det som bedöms.

Jag hittade en prezipresentation som gav bra information och stöd till utvecklingsprocessen av applikationer. Prezi: Att planera sina program av Elisabeth Lindgren Röjler.

P1.6 Deadline

Redovisning sker genom att du bokar en tid för individuell redovisning under vecka 19-22. Fredag 29 maj sätts betygen för elever i åk3 vilket blir sista dagen då det är möjligt att redovisa, elever i åk2 kommer ha terminen ut på sig att redovisa. Tänk på att om du vill få chans att komplettera din redovisning så är det lämpligt att inte vänta med redovisning till sista dagen.

P1.6.1 Bokning av redovisning

Redovisning avslutar kursen

Denna kurs redovisas genom att du bokar en individuell tid där du visar upp dina projekt. Denna redovisning sker individuellt där vi sitter ner i 15-20 minuter och kollar på vad du har gjort under kursen och vilken kvalitet det håller. Sista dag för redovisning är fredag 29 maj. Om du vill ha chans att göra en komplettering ifall du inte nått det önskade betyget så rekommenderar jag att du bokar en tid för redovisning lite tidigare.

Boka en tid nedan eller följ länken, https://calendly.com/johan-hallgren/slutredovisning.