Göm menyn

2. Grafik

2.1 Inledning

Syftet med denna laborationen är att ni ska lära er använda grafikpaketet som medföljer kursboken. Grafikpaketet består av en vanlig Python-fil som finns att ladda ner på kursbokens hemsida (lokal direktlänk ). Med grafikpaketet kan man sedan skapa fönster att måla enkla figurer i.

I kapitlet Grafik i studiematerialet förklaras hur grafikpaketet används. Självklart gör även kursboken detta, vilket återfinns i kapitel 4. I slutet av kapitlet (under rubriken 4.8 Graphics Module Reference) finns en sammanfattning av allt grafikpaketet innehåller. Denna sammanfattning finns även på kursbokens hemsida (direktlänk).

2.2 Sten, sax, påse

I filen sten_sax_pase.py finns en enkel implementation av spelet Sten, sax, påse. Figur 1 nedan visar en skärmdump på spelet. Genom att klicka på ett av alternativen Sten, sax eller påse väljer man det, och direkt efter gör datorn sitt val. Klickar man igen börjar spelet om från början. Testkör gärna filen för att få en bättre uppfattning om hur spelet fungerar.


Figur 1: Skärmdump av spelet Sten, sax, påse.

Allt det grafiska i spelet är uppyggt med hjälp av grafikpaketet som medföljer kursboken.

Spelet fungerar i nuläget precis som det är avsett, men spelet ska lanseras över hela världen, och då kan inte de svenska orden "Sten", "Sax" och "Påse" finnas med. En enkel lösning är att översätta dem till engelska, men det är inte optimalt. Analfabeter och småbarn får då problem med att spela spelet. Den bästa lösningen är nog att helt enkelt måla dit en sax, sten och påse istället för orden. Då borde alla kunna spela spelet, oavsett språkkunskaper och läskunnighet.

Övning 201 Uppgiften är att ändra i den nuvarande koden så att orden "Sten", "Sax" och "Påse" försvinner och ersätts av bilder på respektive föremål. Detta ska åstadkommas med hjälp av den funktionalitet grafikpaketet som medföljer kursboken tillhandahåller genom att måla streck, fyrkanter, cirklar och dylikt (dock inte funktionaliteten att ladda in bildfiler direkt). Exakt hur bilderna ser ut spelar ingen större roll. Så länge man ser vad de föreställer så duger de, men är du villig att riskera att dina klasskamrater målar finare än dig?

2.3 Game of Life

Uppgift 2

Grafik är ett mycket användningsbart verktyg för att visualisera och tolka data, speciellt data som ändras med tiden, vilket kan visas som en sekvens av bilder (animering). Kombinerat med simulering kan man få en väldigt klar bild över hur ett system kommer utvecklas och fortskrida.

Ett av de mest enkla systemen är Game of Life, påhittat av John Conway år 1970. Game of Life består av ett oändligt stort tvådimensionellt rutnät, som utgör själva världen i spelet. I varje ruta finns det en cell, som antingen är död eller levande. I takt med att tiden flyter på generation för generation kommer cellerna dö eller återuppstå enligt följande tre enkla regler (där grannar avser de åtta omkringliggande cellerna, i figur 2 och 3 nedan har till exempel H grannarna B, C, D, G, I, L, M och N):

  • En död cell återuppstår om den har exakt tre levande grannar.
  • En levande cell dör om den har färre än två eller fler än tre levande grannar.
  • I övrigt förblir cellen som den är.

När man implementerar Game of Life i en dator kan man för enkelhetens skull begränsa rutnätets storlek till något ändligt. Då kan ett helt rutnät byggas upp av listor i en lista, där varje element i innerlistorna representerar en ruta i rutnätet. Figur 2 nedan visar ett exempel på hur ett rutnät på 5*5 rutor representeras av listor i en lista där varje ruta innehåller en bokstav. Figur 3 nedan visar samma rutnät grafiskt. För att referera till en viss plats i rutnätet kan man skriva rutnätet[y][x], där x och y är platsens koordinater. Till exempel refererar rutnätet[1][2] till platsen där H står i figurerna nedan.

rutnät = [['A', 'B', 'C', 'D', 'E'], ['F', 'G', 'H', 'I', 'J'], ['K', 'L', 'M', 'N', 'O'], ['P', 'Q', 'R', 'S', 'T'], ['U', 'V', 'W', 'X', 'Y']]

Figur 2: Rutnät representerad av listor i en lista.

Figur 3: Rutnätet i figur 2 visad grafiskt.

I Game of Life finns det dock inte en bokstav i varje ruta, utan en cell, som antingen är död eller levande. En cell representeras lämpligen av ett sanningsvärde, där värdet True betyder att cellen lever, och värdet False betyder att cellen är död.

En nackdel med att begränsa rutnätets storlek är att simuleringen vid kanterna blir felaktig i och med att de inte får åtta grannar, men så länge cellerna vid kanterna inte lever kommer inte felet märkas av.

I filen game_of_life.py finns en implementation av Game of Life som bygger på listor i en lista, men den är inte riktig klar. Er uppgift är att färdigställa spelet genom att implementera det grafiska. Det gör ni genom att färdigställa funktionen paint. Implementationen använder sig av skärmkoordinatsystemet, det vill säga samma koordinatsystem som visas i figur 3 ovan. Tänk dock på att i funktionen måla finns det inget sätt att ta reda på fönstrets dimensioner, så ni måste använda fönstrets setCoords-metod på lämpligt sätt. Fönstrets dimensioner är dock proportionerliga mot rutnätets dimensioner.

Feedback För att ständigt förbättra undervisningen uppskattar vi om ni fyller i följande formulär. Notera att det är friviligt och inte påverkar betygen på något sätt.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2016-10-04