P02 Slutprojekt

Det har blivit dags att avrunda kursen med det examinerande projektet. Eftersom vi har testat en mängd olika paket under vårterminen så kommer det finnas möjlighet att göra ditt slutprojekt med olika inriktningar. Det kommer finnas projekt som görs i form av en tutorial för de lägre betygen men det kommer också finnas påbyggnadsmöjligheter för projekt som baseras på tutorials för att kunna nå högre nivåer på slutprojektet.

Betyget på kursen bygger på allt du har gjort där vi bedömer svårighetsgrad och kvalitet för att sätta det betyg du har uppnått.

P02.1 Alternativa slutprojekt

Här listas tre styrda projekt du kan välja mellan och ett valfritt projekt. Om du väljer ett helt eget projekt så behöver du vara noggrann med planering för att säkerställa att du arbetar mot det betyg som du vill nå.

P02.1.1 Game of 40

Uppgiften är att skapa en applikation inom valfritt textbaserat programmeringsspråk där en eller flera spelare kan spela ett tärningsspel som heter Game of 40.

P02.1.1.1 Spelregler

Spelet spelas med en tärning och minst två spelare. För att vinna spelomgången skall det sammanlagda värdet av alla tärningsslag du slagit bli minst 40. Slår du en sexa på tärningen så förlorar du alla dina poäng i den omgången, tidigare sparade poäng kan inte förloras. Du kan när du vill stanna, spara dina poäng, och sedan överlåta tärningen till nästa spelare.

Innan du börjar hacka kod, gör en grovplanering av hur du skall lägga upp arbetet. Det är oftast mer effektivt att sedan lösa en deluppgift i taget. Om du vill så finns det en tutorial att följa för att lösa grunduppgiften som leder till betyget E.

P02.1.1.2 Grundkrav

Följande grundkrav finns för att ha löst uppgiften.

  • Applikationen skall vara buggfri.
  • Tärningarnas värde behöver lagras på ett sådant sätt att du kan visa värde på varje tärning och inte bara en slutsumma.
  • Innan du börjar koda applikationen bör du skapa en planering där du skissar på ett gränssnitt, grafiskt eller textbaserat, så att du vet hur spelet skall presenteras och spelas. Använd också aktivitetsdiagram/pseudokod där du anser att det behövs för att lösa och/eller förtydliga svårigheter i spelets logik eller kod.
  • I grundvarianten så skall det vara en spelare som spelar mot datorn. Hur datorn spelar spelet skall kodas och dokumenteras. Enklaste varianten är att datorn alltid slår tre slag och sedan sparar sina tärningar.
  • Spelet skall följa de grundläggande reglerna, väljer du att skapa specialregler så skall detta dokumenteras.

P02.1.1.3 Tilläggsfunktionalitet mot betyget C

Grundkraven skall först vara uppnådda sedan skall följande tilläggsfunktionalitet läggas till;

  • Datorn skall ha två svårighetsgrader. Den ena svårighetsgraden är den som implementerades i grunduppgiften och den andra är en lite smartare logik som du skapar själv. Den du skapar själv skall dokumenteras med text och med aktivitetsdiagram och pseudokod.
  • Fråga spelaren vilken av datorns svårighetsgrad du vill möta när omgången börjar.
  • Möjlighet att spela flera omgångar utan att spelet avbryts med en resultaträknare i slutet av varje omgång.

P02.1.1.4 Tilläggsfunktionalitet mot betyget A

Tilläggskraven mot betyget C skall vara uppnådda först sedan skall följande tilläggsfunktionalitet läggas till;

  • Tkinter, eller annat GUI, läggs till.
  • Välja att kunna spela två spelare eller spelare mot dator.

Gemensamt för all tilläggsfunktionalitet är att det är bättre att göra vissa delar av bra kvalitet än att göra flera delar av tveksam kvalitet. Betyget på kursen sätts som en samlad bedömning av allt du har gjort under kursen.

P02.1.2 Spel

Utgå ifrån speltutorial Space Invaders nedan. När tutorial är färdigbyggd så vill jag att du lägger till/förändrar följande funktionalitet.

Tutorial: Space invaders [klicka för att visa]

Space invaders

En tutorial där det klassiska spelet Space Invaders återskapas. Här byggs spelet upp med grafik, ljud, olika typer av kollisioner, poängberäkning mm.

Spelet är kodat i Python 2.7 men jag har kört igenom hela tutorialen och det enda som behöver ändras är sista raden där du skall byta ut delay = raw_input("Press Enter to finish.") mot turtle.done().

Ljud och bilder som används i slutet av tutorial hittar du här.

Viktigt att veta angående tutorial är att de första 10 avsnitten är inspelade 2015 och det är dessa som är grunden till själva uppgiften. I april 2020 så kom helt plötsligt tre nya avsnitt. I dessa avsnitt så gör han i tur och ordning; förändringar för att koden skall fungera bättre i Python3, radar upp fienderna på ett annat sätt och slutligen lägger till bakgrundsljud på spelet.
Uppgiften du skall arbeta vidare med bygger på de 10 första filmerna men visst är det trevligt att bygga en mer effektiv kod för Python3 samt lägga till bakgrundsljud till ditt spel.

Problem med bakgrundsljudet

I avsnitt 13 av tutorial ovan så fixar han ordning på bakgrundsljudet. Tyvärr så fortsätter ljudet att spela trots att spelet avslutas. Så kan vi naturligtvis inte ha det.

Ett enkelt sätt att lösa detta är att ta hjälp av PyGame som har bättre stöd för ljud. Då behöver du importera PyGame både i koden och i projektet (alltså lägga till paketet via inställningar för projektet) och sedan använda, eller ta inspiration av koden nedan.

Använda PyGame.mixer för bakgrundsljudet

I detta kodexempel så lägger jag endast in bakgrundsljudet i pyame.mixer, de andra ljuden för laserskott och träff fungerar som vanligt.

Tänk på att koden som visas nedan är tredelad, en import som görs ihop med andra importer sedan tre rader kod som sätter upp mixern och påbörjar spelning av ljudet. Den tredje delen avslutar uppspelandet avljudet. Om du skulle provköra koden skulle inget hända eftersom det går för snabbt att stänga av ljudet.

Kodexempel: bakgrundsljud med pygame.mixer

# import, glöm inte att lägga till i projektet via inställningar
# endast "import pygame" fungerar också
import pygame.mixer

#
# Denna delen lägger du där du vill starta bakgrundsljudet
# Denna koden bör/skall göras utanför "spelloopen"
#
# Initierar mixer från pygame
pygame.mixer.init()
# Vilket ljud som skall spelas, måste vara wav
pygame.mixer.music.load("bgsound.wav")
# -1 för att repetera ljudet oändligt många gånger....
pygame.mixer.music.play(-1)

#
# Denna delen lägger du strax innan spelet avslutas.
#
# Stänger av pygame.mixer och stänger av bakgrundsljudet
pygame.mixer.quit()

Använda PyGame.mixer för allt ljud

Om vi nu väljer att använda pygames mixer för att spela upp ljudet för bakgrunden så kan vi ju använda detta även för att spela upp allt annat ljud också. Jag har upplevt att ibland när jag blandar Pygames mixer och det andra sättet som vi spelar upp ljud på så kan det upplevas som att det blir ett hack i bakgrundsljudet första gången jag skjuter. Det försvinner om vi använder Pygames mixer hela vägen.

Eftersom vi nu behöver spela ett ljud hela tiden och sedan andra ljud vid olika tillfällen så kommer vi behöva skapa olika kanaler i mixern. Sedan låter vi varje ljud ligga i var sin kanal, vi låter explosion och laserskottets ljud finnas i samma kanal då de aldrig spelas samtidigt. Det finns 8 kanaler från start, de indexeras från 1-7.

Här finns mer information om Channel och de funktioner som finns att använda.

Kodexempel: bakgrundsljud med pygame.mixer

# import, glöm inte att lägga till i projektet via inställningar
# endast "import pygame" fungerar också
import pygame.mixer

#
# Denna delen lägger du där du vill starta bakgrundsljudet
# Denna koden bör/skall göras utanför "spelloopen"
#
# Initierar mixer från pygame
pygame.mixer.init()
# Channel(0) sätter jag till bakgrundskanalen.
# -1 anges för att repetera ljudet. Anges inget värde spelas ljudet en gång.
# Sätt värdet till 2 -> X om du vill spela så många gånger
pygame.mixer.Channel(0).play(pygame.mixer.Sound('bgm.wav'), -1)

#
# Spela annat ljud
# I tutorial så bygger han upp en funktion för att spela olika ljud,
# den återanvänder jag.
# Alla ljud spelas i kanal 1 så att de inte krockar med bakgrundsljudet.
# Har du många ljud som kan kollidera så går det att använda ett ljud / kanal
# och skicka in detta som en inparameter till funktionen
def play_sound(sound_file):
    pygame.mixer.Channel(1).play(pygame.mixer.Sound(f"{sound_file}"))
# Anropet till funktionen: play_sound("laser.wav")

#
# Denna delen lägger du strax innan spelet avslutas.
#
# Stänger av pygame.mixer och stänger av bakgrundsljudet
pygame.mixer.quit()

Funktionalitet att bygga till

Här finns fem utbyggnader av spelet som jag vill att du gör för betyget E.

NrUppgift
1.Fienderna skall falla rakt nedåt i lagom fart. När fienden dödas så skall den återskapas någonstans i övre delen av skärmen, max 20 % från toppen.
2.Slumpa fram en bild för varje fiende, jag har lagt tre bilder i en zippad fil, skapa gärna fler på egen hand eller byt ut bilderna till andra fiender.
3.Varje gång du passerar ett nytt hundratal i poäng så skall det skapas ytterligare en fiende.
4.När spelaren dör så skriv ut Game Over stort mitt på skärmen. Spelaren försvinner redan men finderna kan fortsätta att falla.
5.När du har missat en fiende och den försvinner ur bild i underkant så förlorar du. Game Over visas.

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

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

  1. Fienderna skall falla rakt nedåt i lagom fart.
    Här behöver du tänka på att fienden skall röra sig i y-led istället för i x-led. Sedan behöver du ta bort den koden som flyttade ner fienderna när de träffade väggen.
  2. Slumpa fram en bild för varje fiende
    Två nya fiender hittar du i den zippade filen. Du behöver först tänka på att registrera alla bilder som du vill använda i projektet, och naturligtvis ha lagt in dessa i projektmappen. Sedan skall du få en kodsnutt av mig som slumpar fram ett värde ur en lista.
    lista = ["värde1", "värde2"]
    print(random.choice(lista))
  3. Varje gång du passerar ett nytt hundratal i poäng så skall det skapas ytterligare en fiende.
    Här behöver du hålla koll på när vårt resultat är jämt delbart med 100. Det får du fram genom att skriva if score % 100 == 0: för att använda dig av modulusoperatorn och kolla om score är jämnt delbart med 100. Det du vill göra om detta händer är att först skapa en ny turtle, sedan ge den sina värden och slutligen lägga till denna i listan för alla fiender.
    new_enemy = turtle.Turtle()   # Skapa en ny fiende
    new_enemy.color("red")        # Ge new_enemy sina värden
    # Flera rader med samma ...
    # ... värden som du tidigare ...
    # ... har satt till enemies
    enemies.append(new_enemy)     # Lägg den nya fienden i listan med alla fiender
  4. Skriv ut Game Over stort mitt på skärmen
    Du har tidigare skrivit ut score på skärmen. All den funktionalitet skall du nu kopiera och skriva ut Game Over när du har krockat med en fiende.
  5. När du har missat en fiende och den försvinner ur bild i underkant så förlorar du
    Det finns redan logik kring hur du förlorar när du krockar med en fiende. Nu skall du skapa logik så att du förlorar om en fiende når den nedre ramen i spelet. Om detta inträffar så skall spelaren försvinna, Game Over visas och spelet avslutas, eller så får alla fiender långsamt försvinna i bakgrunden.

För att uppnå betyget E på slutprojektet så krävs endast att ovanstående delar, eller likvärdig svårighet, är implementerat i spelet.

P02.1.2.1 Tilläggsfunktionalitet mot betyget D

För att i slutprojeket visa på kunskaper motsvarande D så krävs det att du ytterligare bygger in funktionalitet för spelet. Detta behöver inte vara allt för avancerat men här kommer några förslag på saker som går att bygga in;

  • Fiender faller snabbare ju mer poäng som spelaren får.
  • Olika fiender faller olika fort.
  • Olika fiender ger olika poäng vid träff, antingen beroende på var fienden befann sig på spelplanen eller beroende på vilken färg en fiende har.

Tänk på att 1-2 egeninbyggd funktionalitet räcker för betyget D. Det är helt ok att komma på egen funktionalietet.

Varje funktionalitet du lägger till i spelet vill jag att du dokumentera på lämpligt sätt. Jag vill ha en kort skriftlig beskrivning av vad du har gjort, hur du har gjort det och om du hade olika funderingar på hur du kunde ha gjort detta. Kanske har du i efterhand kommit på att du kunde ha gjort på ett bättre sätt. Kommentera då detta.

P02.1.2.2 Tilläggsfunktionalitet mot betyget C

För att nå ännu lite högre så kommer det krävas mer inbyggd funktionalitet. Ta gärna inspiration av punkterna under D, lägger du till flera av dessa så klättrar du högre på betygstrappan.

Varje funktionalitet du lägger till i spelet vill jag att du dokumentera på lämpligt sätt. Jag vill ha en kort skriftlig beskrivning av vad du har gjort, hur du har gjort det och om du hade olika funderingar på hur du kunde ha gjort detta. Kanske har du i efterhand kommit på att du kunde ha gjort på ett bättre sätt. Kommentera då detta.

För att nå högre betyg på spel så vill jag att du själv presenterar vilka förändringar du vill göra och vilket betyg du strävar efter. Vill du jobba vidare med samma spel så kan man bygga in att olika fiender genererar olika poäng, att olika fiender rör sig olika, och att spelet blir ännu svårare på olika sätt när du få mer poäng.

Gör en egen planering för vad du vill göra för spel, vilket betyg du strävar efter och vilken funktionalitet du vill jobba med. Lämna in detta till mig för bedömning innan du börjar bygga ditt spel så att vi är överens om svårighetesgrad kopplad till din betygsambition.

För att uppnå betyget C så behöver du visa en vald algoritm med pseudokod och aktivitetsdiagram.

P02.1.2.3 Betyget A

Naturligtvis är det möjligt att nå betyget A och redovisa dessa kunskaper genom att skapa ett spel. Du kommer behöva bygga ett eget spel för att kunna nå betyget A om du nu inte skulle kunna presentera en väldigt omarbetad version av spelet ovan med större och tydliga utbyggnader, tex fler världar, olika levels osv.

För att nå högre betyg på spel så vill jag att du själv presenterar vilka förändringar du vill göra och vilket betyg du strävar efter. Vill du jobba vidare med samma spel så kan man bygga in att olika fiender genererar olika poäng, att olika fiender rör sig olika, och att spelet blir ännu svårare på olika sätt när du få mer poäng.

Gör en egen planering för vad du vill göra för spel, vilket betyg du strävar efter och vilken funktionalitet du vill jobba med. Lämna in detta till mig för bedömning innan du börjar bygga ditt spel så att vi är överens om svårighetesgrad kopplad till din betygsambition.

För att uppnå betyget C-A så behöver du visa en vald algoritm med pseudokod och aktivitetsdiagram.

P02.1.3 Banken

Vi har tidigare jobbat med en bankapplikation och om du har följt tutorial så motsvarar detta betygsnivå E, det räcker dock inte att ha gjort endast denna för att nå betyget E på kursen. Om du vill vidareutveckla bankapplikationen så är det möjligt för att nå ett högre betyg.

Följande tilläggsfunktionalitet är lämplig att lägga till för att nå ett högre betyg;

  • Flera konton till en enskild användare.
  • Flera användare kopplade till banken med någon form av inloggning.
  • Bygga banken i en grafisk miljö med Tkinter eller annat paket för GUI.

Att lösa en av punkterna ovan har en svårighetsgrad motsvarande betyget C, att lösa två av punkterna, gärna med GUI, motsvarar svårighetsgraden A.

Återigen, uppgiften sätter svårighetsgraden och utförandet sätter kvaliteten på ditt arbete. Kombinationen av svårighetsgrad och kvalitet kommer avgöra ditt betyg.

P02.1.4 Annat projekt

Du har möjlighet att göra ett valfritt projekt men då ställs det lite större krav på dig själv. Sätt ett tydligt betygsmål med kursen och gör en presentation av det projekt du vill göra så att läraren kan göra en bedömning om det projektet är genomförbart och att det uppnår den svårighetsgrad som krävs för din betygsambition.

Det är ok att delvis använda sig av tutorials på nätet/litteratur men det är ett absolut krav att alla denna hjälp finns med i dokumentationen när ditt projekt redovisas. Vi behöver se vilken hjälp du fått för att kunna avgöra vad du själv har gjort.

P02.2 Redovisning

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 20 minuter och kollar på vad du har gjort under kursen och vilken kvalitet det håller. Under vecka 18/19 kommer en bokningslista att läggas ut där du själv bokar lämpligt tillfälle att redovisa dina kunskaper. Sista dag för redovisning är preliminärt tisdagen 9 juni för elever i åk 1 och fredag 29 maj för elever i åk 3. 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.

Redovisningarna startar vecka 20.

P02.2.1 Checklista inför redovisning

Vid redovisningen kommer vi kika på banken (om det inte är gjort tidigare), vi kommer kika på teoriuppgiften från Moment07 (om det inte är gjort tidigare) och vi kommer kika på slutprojektet.

  • Banken skall fungera enligt den checklista som finns i tutorial (plus eventuell egen funktionalitet som du har lagt till).
  • Ditt slutprojekt skall ha en kortare skriftlig utvärdering om hur arbetet har gått, vad du har lärt dig och vad du under arbetets gång hade gjort annorlunda. Gör utvärderingen i dokumentet Planeringsdokument Projekt02.
  • Pseudokod & aktivitetsdiagram över vald algoritm. För E räcker det med den pseudokod/aktivitetsdiagram som du redan gjort till banken. Vill du nå betyg C eller högre vill jag att du gör en ny/egen pseudokod/aktivitetsdiagram. (Välj inte den enklaste algoritmen du kan hitta, men se till att den är avgränsad, gör den absolut inte på hela programmet!!!!)
    Lägg lämpligtvis dessa bilder i utvärderingsdokumentet.

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 torsdag 3 juni. 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.

En länk för bokning av redovisning kommer publiceras vecka 18/19.