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 finns ett projekt som bygger på en tutorial och där du efter genomförd tutorial bygger på med egna lösningar för olika betyg samtidigt som det finns möjlighet att göra slutprojekt som inte bygger på någon tutorial i grunden.

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 två mer 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 Spel

Utgå ifrån speltutorial Space Invaders nedan. När tutorial är färdigbyggd så finns det fem egna tillägg som du behöver lägga atill för att nå betyget E. Vill du sedan fortsätta att sträva efter högre betyg så finns det instruktioner för detta också.

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.Fem fiender skall få slumpade positioner när spelet startar. 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.
Space invaders

Så här ser mitt spel ut när jag har byggt det efter de fem uppgifterna som skall genomföras.

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. Fem fiender skall få slumpade positioner när spelet startar. 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.
    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.1.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.1.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.1.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.2 Banken med GUI

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.

I samband med att P01: Banken gjordes så fanns det kriterier för betyg högre än E, nu skall du bygga vidare på den bank du tidigare har gjort och lägga till ett GUI så att banken blir en grafisk applikation.

Grunduppgiften blir att bygga ett GUI på en enkel bank där en användare har ett konto, detta motsvarar ett E/D i betyg. Lägger du till fler funktioner så ökar naturligtvis svårighetsgraden och då även möjligheten till ett högre betyg.

Att i din GUI-bank bygga in hantering av flera konton motsvarar betyget C, och att dessutom bygga in möjlighet att hantera flera användare och flera konton motsvarar betyget A i svårighetsgrad.

Å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.3 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 all 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

När du är klar med ditt projekt skall det redovisas. 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.

Info om bokning av redovisningstid och deadlines hittar du i planeringen och/eller i moment10 som uppdateras när det är dags att boka tid.

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/D räcker det att pseudokod/aktivitetsdiagram är godkänt sedan tidigare i kursen. 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 1 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.