Computerspil til læring RTG. Kl. 3.4 IT - B. Fra 16-11-2015-09-12-2015. Joachim Skou Goodman Nielsen, Markus Duus Kristensen og Mikkel Jensen



Relaterede dokumenter
Dokumentation af programmering i Python 2.75

Automatisering Af Hverdagen

Michael Jokil

Computerspil dokumentation. Dokumentation af spillet Rescue Me

Børn, unge og sundhed

Brøk Laboratorium. Varenummer

HTX. Afsluttende projekt. E-learning Komunikation/It C Helena, Katrine og Rikke

Computerens Anatomi. Kom/IT C - Computer Anatomi - Daniel og Fie - 3/ Planlægning af kommunikationsvalg og medieprodukt.

Cecilie Maria Nielsen, Mathias Fornitz Eriksen og Martin Arnetoft klasse

Tastevejledning Windows XP

Spil Rapport. Spil lavet i GameMaker. Kevin, Mads og Thor

1. Indledning. 2. Laswell s fem spørgsmål. Hvem (afsender) Siger hvad (budskab)

Klasse 1.4 Michael Jokil

Informations Teknologi Indholdsfortegnelse

Ugur Kitir HTX - Roskilde 01/

Afsluttende - Projekt

Vejledning til at lave almindelige bordkort i Draw Side 1

Andreas Lauge V. Hansen klasse 3.3t Roskilde HTX

Undervisningsmateriale - Rapport

Børn, unge og sundhed Automatisering

Computerspil - Kappa

Undervisningsbeskrivelse

Det skrå kast, en simulation

Projekt - Valgfrit Tema

IT opgave. Informationsteknologi B. Vejleder: Karl. Navn: Devran Kücükyildiz. Klasse: 2,4

Brug Photo Story 3 en let introduktion

Kom godt i gang med Fable-robotten

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4

Programmering C Eksamensprojekt. Lavet af Suayb Köse & Nikolaj Egholk Jakobsen

Kom/IT rapport Grafisk design Anders H og Mikael

ZBC Vordingborg Marcus Rasmussen, Oliver Meldola, Mikkel Nielsen 17/ The Board Game

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

Arduino kursus lektion 3:

DANSK LYS: Lys i byens rum Lyspunkter Light Spots

Fable Kom godt i gang

designmanual konsultation.nu Designmanual Konsultation.nu Gyldig fra 20 marts 2014

Velkommen til IT for let øvede

Visualiseringsprogram

Søren Christiansen

AFSLUTTENDE OPGAVE. udemiljø

Billedbehandling med GIMP

Indholdsfortegnelse. Indledning...2. Tidsplan...2. Målgruppe...3. Spørgeskema...3. Kode eksempler...5. Procesbeskrivelse...7. Evaluering...

Dokumentation til Computerspil

JavaScript. nedarvning.

På opdagelse i Mandelbrot-fraktalen En introduktion til programmet Mandelbrot

DDD Runde 2, 2015 Facitliste

METODESAMLING TIL ELEVER

Installér din Officepakke 2013

Projekt om Københavns Musikteater

for matematik på C-niveau i stx og hf

Fable Kom godt i gang

IT Support Guide. Installation af netværksprinter (direkte IP print)

Interview med drengene

Klasse Situation Observation 3. klasse Før spillet. Der bliver spurgt ind til hvad børnene

Bilag 6: Transskription af interview med Laura

Vejledning til Photofiltre nr. 117 Side 1

Diagrammer visualiser dine tal

Manual til overføring af fotografier fra kamera til harddisk.

Kvadrant - instrumentbeskrivelse og virkemåde

Denne artikel tager dig igennem de grundliggende teorier bag ABC Analyzer og introducerer dig til 80/20 Analytics.

Kom godt i gang med OneDrive

Grafisk design. Kommunikation/it Roskilde Tekniske Gymnasium 12/ Klasse 1.2 Tamana og Sesilje

Undersøgelse af undervisningsmiljøet på Flemming Efterskole 2013

Installation af Office Windows 7

Undervisningsbeskrivelse

At lave dit eget spørgeskema

Computerspil rapport. Kommunikation og IT. HTX Roskilde klasse 1.4. Casper, Mathias Nakayama, Anders, Lasse og Mads BC. Lærer - Karl Bjarnason

OPGAVEN PROGRAMVALG. Jeg har brugt Illustrator til at lave logo og ikoner.

Kom nemt i gang med ViTre pakken fra ScanDis A/S

Computerens anatomi. Flashklip for børn

Installation af Office Windows 8/10

DM536. Rapport og debug

Kom i gang-opgaver til differentialregning


Lær Python dag 1 - modul 1

Bevægelses analyse med SkillSpector. Version 1.0 Sidste opdatering: 14/

Jeg har i forbindelse med it og programmering designet og udviklet et it-produkt, som kan beregne rødder i en anden gradsligning.

Analyse af PISA data fra 2006.

Regneark II Calc Open Office

Velkommen til ABC Analyzer! Grundkursusmanual 2 vil introducere dig til ABC Analyzers mere avancerede funktioner, bl.a.:

Portfolie Redesign. Forord. Det tekniske. Tema ide. Css. opløsning.

Nicholas: Jeg bor på Ørholmgade, lige herovre ved siden af parken. I nummer fire.

Workflow 8.0 stort spring med store forbedringer

5/11/2015. Programmering. Hussein Al-Saidi ROSKILDE TEKNINSK GYMNASIE VEJLEDER: CHRISTOFFER S.

Evaluering af KidSmart

DKK Rally-lydighed, Øvede-klassen. 40. Fristende 8-tal

Side 1 af 10. Lydbreve. Indhold. Indhold...1 Forord...2 Lydoptager...2 Ændring af indtalt lyd...4 Sende dit lydbrev...8 Lyde i Worddokumenter...

Vurdering af digitalt læringsmiddel:

Forslag til stationstræning med fokus på at tilpasse øvelsen efter hvilken gruppe, der skal træne på stationen

Undervisningsbeskrivelse

KOM/IT DESIGN MANUAL AF SAF

Transkript:

Computerspil til læring RTG Kl. 3.4 IT - B Fra 16-11-2015-09-12-2015 Joachim Skou Goodman Nielsen, Markus Duus Kristensen og Mikkel Jensen

Contents 1.0 Indledning... 3 2.0 Krav... 3 2.1 Krav for program... 3 2.2 Faglige mål... 3 2.2.1 Informationsteknologi... 3 2.2.2 Programmering... 4 2.2.3 Studieområdet... 4 3.0 Målgruppe... 4 4.0 Design... 4 4.1Vejledning til spillet... 4 4.2 Visuelt design... 5 4.2.1 Farver... 5 4.2.2 Gestalt... 5 4.2.3 Typografi... 5 4.3 Informationsdesign... 6 4.4 Interaktionsdesign... 6 4.4.1 Input: filer, musetast, sensorer... 6 4.4.2 Output: lyd, print... 6 4.5 Brugergrænseflade... 7 5.0 Prototyper... 7 5.1 Prototype 1... 7 5.2 Prototype 2... 8 6.0 Implementering... 9 6.1 Kode for Snake... 9 6.2 Kode for Matematik delen... 11 7.0 Test... 13 8.0 Licens... 13 8.1 Kreditering-IkkeKommerciel DelPåSammeVilkår CC BY-NC-SA Licens... 13 8.1.1 Fordele... 13 8.1.2 Ulemper... 13 8.2 Kreditering CC BY... 13 8.2.1 Fordele... 14 8.2.2 Ulemper... 14 8.3 Vores Licens... 14 1

9.0 Konklusion... 14 10.0 Bilag... 15 10.1 Kilder... 15 10.2 Brainstorm... 15 10.2.1 Ideer til målgruppe... 15 10.2.2 Ideer til spil... 15 10.3 Tidsplan... 16 10.4 Koden... 17 2

1.0 Indledning I dette projekt Computerspil som vindue til læring, skal der udvikles et computerspil, ved hjælp af Python modulet Pygame. Opgaven er et samspil mellem IT, programmering og Studieområdet, hvor der i IT skal laves en rapport for computerspillet og dets udvikling, hvor der i programmering skal afleveres en journal. I projektet er der fokus på faglighed indenfor planlægning, systemudviklingsmetoder, moduler, formidlingsformer, interaktion mellem menneske og maskine, brugerflader, grafiske brugerflade, brugbarhed, brugervenlighed, moduler for brugbarhed, afprøvning, dokumentation af systemudviklingforløbet, samt ophavsret og licenser. I spillet skal der være positivt pædagogisk indhold. Det kan for eksempel være for normale folkeskoleelever eller nogen der har særlige behov. Det kan være nedsat syn, ordblindhed eller lignende. 2.0 Krav 2.1 Krav for program Vi vil gerne have fokus på følgende krav: Skal være simpelt design Skal indeholde matematik (tilsvarende folkeskoleniveau) Skal være lavet i Pygame Skal kunne videreudvikles (nye matematiske regnemetoder) Selve spil skal være af arkade -tema (pac-man, snake) Der skal være interaktion mellem brugeren og programmet Programmet skal have et pædagogisk indhold 2.2 Faglige mål 2.2.1 Informationsteknologi Der skal kunne - redegøres for grundlæggende funktioner af IT-komponenter (hardware og software) og samspillet mellem dem. - redegøres for samspillet mellem IT-komponenter og bruger - anvendes IT som interaktivt medie til dokumentation og kommunikation - realiseres protoyper på IT-systemer, herunder kunne installere, konfigurere og tilpasse relevante it-komponenter 3

2.2.2 Programmering Der skal kunne - redegøres for programmering som planlægning af en computers aktiviteter, herunder interaktion med omgivelserne - anvendes eksisterende programdele og biblioteksmoduler i arbejdet med at programmere et fungerende system - demonstreres kreativitet og sysstematik i programmeringsprocessen - løses en enkel problemstilling gennem udviklingen af et program 2.2.3 Studieområdet Der skal kunne - dokumenteres viden om forskellige arbejds- og samarbejdsformer og planlægge og anvende disse hensigtsmæssigt i praktiske forløb - dokumenteres viden om og anvende forskellige formidlings- og præsentationsformer - kombineres fagenes metoder og skabe sammenhæng i faglig viden inden for det enkelte fag og fagene imellem. - udvikles kommunikative færdigheder, skriftligt og mundtligt, især ved formidling af videnskab og teknik 3.0 Målgruppe Vores målgruppe er fokuseret på folkeskoleelever. Dvs. folk som lige er gået i gang med addition, subtraktion, gange og dividering (ca. 1. klasse). Dog har vi kun addition og subtraktion i spillet, men man kan altid videreudvikle på det, således at gange og dividering også har en plads i spillet. Potentialet er der, og dette betyder selvfølgelig også at målgruppen kan ændres alt efter hvilken matematik man beslutter sig for at spillet skal indeholde (f.eks. noget funktioner og ligninger, hvor målgruppen måske vil ligge på omkring gymnasieniveau). Dog har vi besluttet at vi vil holde det simpelt og kun anvende addition og subtraktions regnestykker i vores udgave af spillet. 4.0 Design 4.1Vejledning til spillet Spillet er meget nemt at komme i gang med, og der behøves ikke rigtig en vejledning på hvordan det bliver spillet. Det er derfor der ikke er nogen vejledning til brugeren når de starter spillet. Spillet er meget simpelt, og minder meget om det originale Snake. Det går ud på, at brugeren skal styre slangen, ved hjælp af piletasterne, ind i bidderne som er placeret rundt omkring på banen. Når slangen rammer en bid så vil der komme et nyt vindue op, hvor der kommer et regnestykke. Regnestykket kan være 2+2 for brugere som er i starten af 4

folkeskolen, men man kan senere tilføje gange og dividere, så der er mulighed for udvidelse af spillet. Hvis du svarer rigtigt på spørgsmålet får du 1 point, og der bliver tilføjet et stykke på halen af slangen. Så det gælder om at blive så lang som mulig. Hvis brugeren derimod svarer forkert, vil spillet slutte, og der vil stå slutresultatet på skærmen. 4.2 Visuelt design Visuelt kan man se hhv. se en grøn og en grå brik, en snake og en bid. Dette er hovedsageligt hvad man interagere med, da man som spiller styrer den grønne snake, og prøver at indsamle de grå bidder. Når dette sker, vil man blive stillet et regnestykke, som man skal udregne, før man kan fortsætte. Løses det, vil ens pointtavle få et ekstra point oppe i venstre hjørne af skærmen. På billedet til højre ses dette ( 0 ). 4.2.1 Farver Af hensyn til farvevalget i vores spil, så valgte vi at anvende farven grøn, da det for det første er en positiv farve og for det andet, bliver forbundet med noget godt hos vores målgruppe (de grønne er de gode og de røde er de onde ). Slangen er også grøn, fordi de fleste mennesker ser de fleste slanger som grønne. Bider man skal indsamle har, farven grå, da de blot er objekter vi skal indsamle. Til sidst har vi vores baggrund, som har farven hvid. 4.2.2 Gestalt Når man starter spillet, så er man ikke i tvivl om hvad der er spilleren og hvad der er point. Spilleren er som sagt denne grønne snake, der jagter grå bider. Alt dette foregår på en hvid baggrund, hvilket betyder at kontrasten mellem grøn, grå og hvid er meget tydelig, således at man ikke forbinder dem med hinanden. Dette er med til at skabe overskuelighed i spillet. Men udover spil-figurerne, så har vi også vores pointtavle, som er farvet sort (hvilket har samme effekt som de andre genstande i spillet). 4.2.3 Typografi Til visning af vores tal/tekst, har vi valgt at bruge typografien arial. Denne bliver brugt til visning af score. Derudover bidrager denne skrifttype også til vores krav om at spillet skal være simpelt, da typografien ikke har en masse snoede former og visualisere en meget ideel form af alfabetet. 5

4.3 Informationsdesign Der indgår ikke så meget informationsdesign i spillet da der ikke er så meget information at give brugeren. Der er dog pointene som er blevet vist øverst i højre hjørne. Det er simpelt for at vise hvor langt brugeren er kommet, og se om brugeren kan slå sin tidligere record. Derudover bliver der også vist scoren i slutningen af spillet når man er død. Der bliver skrevet Du fik x point, også er brugeren ikke i tvivl om hvor meget brugeren, har fået også selvom brugeren er i de mindre klasser, og ikke så god til at læse. Derudover har vi også matematikdelen, som bliver vist meget pænt, og nemt at forstå. Der bliver først skrevet et regnestykke, Hvad er 5-2. Det er meget simpelt, og nemt at forstå, og brugeren er ikke i tvivl om hvad de skal. Derefter skal brugeren skrive sit svar på spørgsmålet, ved hjælp af tal. Så regner maskinen på det, og skriver om det er rigtigt eller forkert, med en smiley bag i. Smileyen er der for at hjælpe brugeren, som er en, som lige er starte i folkeskolen. Så hvis brugeren ikke forstår ordet Rigtigt eller Forkert, har vi lavet en smiley, for at beskrive om det er rigtigt eller forkert. En sur smiley :-( betyder det er forkert, og en glad smiley :-) betyder det er rigtigt. Dette hjælper meget pædagogisk, til mindre børn. 4.4 Interaktionsdesign 4.4.1 Input: filer, musetast, sensorer Vores styresystem er simpelt, da vi primært kun anvender piletaster, til at styre Snake rundt på banen, og indsamle grå bider. Derudover er det eneste andet sted man bruger input (computerens tastatur), når man skal skrive et svar til et regnestykke. F.eks. Hvad er 1+3? hvor vi således skriver 4. Så primært benytter man kun tallene og piletasterne på tastaturet/keyboardet. 4.4.2 Output: lyd, print Vi har to forskellige output (print), den ene er vores pointtavle, der fortsætter med at stige alt efter hvor mange bider man indsamler. Det andet er vores matematik-del, hvilket kun bliver vist når man indsamler en bid. Her kan man se på eksemplet til højre at der bliver spurgt om: Hvad er 2+1? her skriver man så bare 3, således at systemet informere dig om det er rigtigt eller forkert. I eksemplet har vi svaret rigtigt (hvilket også kan ses på eksemplet), hvor vi nu har fået ét point. Hvis man svarer forkert, får man printet: Forkert! :- (. 6

4.5 Brugergrænseflade Til vores spil har vi ikke nogen brugergrænseflade udover selve spillet, men hvis vi havde haft tid til ville vi have lavet en startknap, en slukknap og en vejledning til hvad spillet går ud på og hvordan man styrer 5.0 Prototyper Gennem processen med at lave programmet har vi stoppet, og kigget på hvad vi har lavet. I denne del vil vi beskrive vores proces, og hvilke tanker vi havde igennem forløbet. 5.1 Prototype 1 I vores første prototype har vi fået et program, som ikke fungerer så godt. Som vist på billedet til højre kan vi se der er noget galt. Når vi kører rundt med tasterne følger resten af kroppen ikke med. Derudover mangler vi stadig at lave siderne på programmet for nu kan slangen bare køre ud gennem siderne og fortsætte ud i alt uendelighed. Vi har også lavet et objekt som slangen skal spise, men den kan den ikke spise, fordi vi mangler noget. Vi kan fixe siderne, og objektet ved at lave en collide. Det vil sige vi lave et fast objekt som slangen ikke kan komme igennem, og vi har allerede defineret hvordan den dør, så vi skal bare sige hvis den rammer en af siderne vil den dø, og døds skærmen vil blive vist. Objektet skal vi også lave en collide open, så når den rammer objektet bliver den spist, og brugeren vil få nogle points. Koden er vist herunder med nogle meget korte forklaringer. Hvis du vil se de fulde forklaringer, så gå til 6. Implementering. Importer pygame kommandoer import pygame, random, sys from pygame.locals import * Definere død, farver til snake, objekt bliver placeret, navn på spillet, skrifttype, def die(screen, score): f=pygame.font.sysfont('arial', 40);t=f.render('Du fik '+str(score)+' point', True, (0, 0, 0));screen.blit(t, (10, 50));pygame.display.update();sys.exit(0) xs = [300, 300, 300, 300, 300];ys = [290, 270, 250, 230, 210];key = 0;score = 0;applepos = (random.randint(10, 590), random.randint(10, 590));pygame.init();s=pygame.display.set_mode((600, 600));pygame.display.set_caption('PlusSnake');appleimage = pygame.surface((20, 20));appleimage.fill((150, 150, 150));img 7

= pygame.surface((20, 20));img.fill((102, 156, 31));f = pygame.font.sysfont('arial', 20);clock = pygame.time.clock() while True: Hastighed på snake clock.tick(5) for e in pygame.event.get(): if e.type == QUIT: sys.exit(0) Tastaturkommandoer elif e.type == KEYDOWN: if e.key == K_UP and key!= 0:key = 2 elif e.key == K_DOWN and key!= 2:key = 0 elif e.key == K_LEFT and key!= 1:key = 3 elif e.key == K_RIGHT and key!= 3:key = 1 q = len(xs)-1 while q >= 1: xs[q] = xs[q-1];ys[q] = ys[q-1];q -= 1 if key==0:ys[0] += 20 elif key==1:xs[0] += 20 elif key==2:ys[0] -= 20 elif key==3:xs[0] -= 20 Farve på objekt s.fill((255, 255, 255)) Score for q in range(0, len(xs)): s.blit(img, (xs[q], ys[q])) s.blit(appleimage, applepos);t=f.render(str(score), True, (0, 0, 0));s.blit(t, (10, 10));pygame.display.update() 5.2 Prototype 2 I anden prototype tilføjer vi en collide, som vi snakkede om i tidligere pototype, og vi gør det ved først at definere det, def collide(x1, x2, y1, y2, w1, w2, h1, h2): if x1+w1>x2 and x1<x2+w2 and y1+h1>y2 and y1<y2+h2:return True else:return False og collide med siderne, if xs[0] < 0 or xs[0] > 600 or ys[0] < 0 or ys[0] > 600: die(s, score) og collide med slangen egen krop. if collide(xs[0], xs[q], ys[0], ys[q], 20, 20, 20, 20):die(s, score) Herfra kan vi se at vi er ved at have et helt produkt. Der mangler dog stadig noget med tilpasning af farver, hastighed på slangen og mindre ting som nemt kan laves om. 8

Vi har ikke lavet nogle prototyper til matematikdelen, fordi det er så småt og der var ikke rigtig nogle forhindrer i at lave det. Derfor har vi bare lavet det fuldt og forklaret det i implementerings delen. Færdige produkt kan ses i 6. Implementering 6.0 Implementering Vi har haft nogle problemer med koden, få den til at gøre som vi gerne ville have den til at gøre. Planen var at når Slangen rammer en af bidderne så vil der poppe et nyt vindue op, hvor regnestykkerne vil være. Når du så svarede rigtigt på spørgsmålet vil brugeren få 1 point, og brugeren kan så fortsætte med at spille. Problemet opstod da vi skulle have et nyt vindue til at poppe op, når slangen rammer en bid. Vi har prøvet en masse forskellige ting, og har også spurgt om hjælpe på forskellige forummer. Vi har fået nogle forskellige mulighed til hvordan det kan lade sig gøre, men vi har ikke kunne få det til at fungere. Vi prøvede bla. Tkinter, til det, men det fungerede ikke. Vi har derfor valgt at opdele Snake og Matematik delen op i to. Begge spil får man points i, og det vil være nemt at integrere matematik delen ind i Snake spillet, da der også er points indblandet i det. 6.1 Kode for Snake Når man starter med python, starten man med at skulle importere nogle forskellige kommandoer ind i python, så programmet ved hvad den har at arbejde med. I dette tilfælde henter vi pygame, fordi det er det vi skal beskæftige os med, også importere vi også Tkinter, hvilket vi ikke fik til at fungere. Tkinter, skulle hjælpe os med at åbne et nyt vindue som vi kunne bruge til at lave et regnestykke i. Når regnetstykket var korrekt ville det lukke ned igen, og så kunne man spille videre. Vi fik det aldrig til at fungere, og tiden vi brugte på det begyndte at blive alt for lang. import pygame, random, sys from pygame.locals import * from Tkinter import * Her prøver vi at definere et nyt vindue som kan bruges senere i koden, som vi ville have brugt senere i koden hvis vi kunne have fået det til at fungere. Vi havde problemer med at få det til at fungere, fordi vi skulle have den til at åbne et nyt vindue, som vi kunne skrive regnestykkerne i. Vi prøvede masse forskellige ting, men fik det aldrig til at fungere, og vi valgte derfor at give op på det, fordi vi har brugt for langttid på det, og vi valgte derfor bare at dele det op i 2 forskellige programmer. def Tkinter(): toplevel = Toplevel() toplevel.title('window2') toplevel.focus_set() Her definere vi collide som vi brugere til at stoppe slangen for at komme ud fra banen, og til at reagere på maden/objektet. 9

def collide(x1, x2, y1, y2, w1, w2, h1, h2): Dette gør så slangen dør hvis den rammer siderne if x1+w1>x2 and x1<x2+w2 and y1+h1>y2 and y1<y2+h2:return True else:return False Nu prøver vi at definere hvordan skal reagere når slangen dør. Vi angiver først hvilken skrifttype vi skal bruge til døds skærmen. Så bliver der angivet hvad der skal stå når man dør, og der kommer så til at så du fik +scoren + point, også har vi angivet det skal være i sort (0,0,0). Nu bruger vi så blit til at angive at skriften skal så oven på baggrunden i et bestemt position (10,50). Det næste dem gør er at spawne maden, og der angivet vi det skal være forskelligt hvor den skal dukke op, og den skal være 20x20 pixels. Vi angiver så også hvad programmet skal hedde, og der har vi valgt det skal hedde PlusSnake. def die(screen, score): f=pygame.font.sysfont('arial', 40);t=f.render('Du fik '+str(score)+' point', True, (0, 0, 0));screen.blit(t, (10, 50));pygame.display.update();sys.exit(0) xs = [300, 300, 300, 300, 300];ys = [290, 270, 250, 230, 210];key = 0;score = 0;applepos = (random.randint(10, 590), random.randint(10, 590));pygame.init();s=pygame.display.set_mode((600, 600));pygame.display.set_caption('PlusSnake');appleimage = pygame.surface((20, 20));appleimage.fill((150, 150, 150));img = pygame.surface((20, 20));img.fill((102, 156, 31));f = pygame.font.sysfont('arial', 20);clock = pygame.time.clock() while True: Hastigheden på slangen bliver bestemt ved clock.tick(12). Hvis vi vil have den skal gå hurtigere sætter vi tallet til en højere værdi. clock.tick(12) Her lavet vi et event, i pygame. for e in pygame.event.get(): if e.type == QUIT: sys.exit(0) Her siger vi at hvis e.type ikke er quit, gå den videre til hvis en tast er trykket vil den reagere. Vi giver den nu 4 taster som den skal reagere på, K_UP, K_DOWN, K_LEFT, K_RIGHT. Vi giver tasterne nogle retninger som er angivet ved 0,1,2,3, hvor 0 er op, 1 er venstre, 2 er ned, og 3 er højre. Vi angiver også nogle keys som vi brugere senere til at bestemme hvor mange pixels den skal gå til hver retning. elif e.type == KEYDOWN: if e.key == K_UP and key!= 0:key = 2 elif e.key == K_DOWN and key!= 2:key = 0 elif e.key == K_LEFT and key!= 1:key = 3 elif e.key == K_RIGHT and key!= 3:key = 1 q = len(xs)-2 while q >= 2: Dette gør så hvis slangen rammer sig selv, så vil den dø, og derefter vise døds skærmen if collide(xs[0], xs[q], ys[0], ys[q], 20, 20, 20, 20):die(s, score) 10

q-= 1 Her siger vi at hvis den rammer et objekt/maden så skal den spise det og derefter lave et nyt objekt/mad, inde for grænserne (10,590) x (10,590). Derudover giver vi også et point til scoren. Det er så også her vi skulle få den til at åbne et nyt vindue, hvis vi kunne have fået det til at fungere. if collide(xs[0], applepos[0], ys[0], applepos[1], 20, 20, 20,20):score+=1;xs.append(600);ys.append(600);applepos=(random.randint(10,590),random.randint(10,590)) Dette gør så slangen dør hvis den rammer en af siderne. Vi angiver siderne til at være 600 x 600 pixels store. Hvis slangen position bliver større end dette vil den dø, og derefter vise døds skærmen. if xs[0] < 0 or xs[0] > 600 or ys[0] < 0 or ys[0] > 600: die(s, score) q = len(xs)-1 Dette gør så slangen bevæger sig. Som tidligere beskrevet, så har vi angivet slangen til at gå i nogle forskellige retninger hvis vi trykker på en knap. Den knap har vi givet et nummer fra 1-4, som giver så en kommando til slangen om at bevæge sig i den retning. Den bevæger sig 20 pixels af gangen. while q >= 1: xs[i] = xs[i-1];ys[i] = ys[i-1];i -= 1 if key==0:ys[0] += 20 elif key==1:xs[0] += 20 elif key==2:ys[0] -= 20 elif key==3:xs[0] -= 20 Her er baggrundsfarven som er angivet i RBG. s.fill((255, 255, 255)) Her gør vi så objekterne kan være oven på hinanden. Så vi kan have et baggrund med nogle objekter på som er slangen, maden og scoren. for q in range(0, len(xs)): s.blit(img, (xs[q], ys[q])) s.blit(appleimage, applepos);t=f.render(str(score), True, (0, 0, 0));s.blit(t, (10, 10));pygame.display.update() 6.2 Kode for Matematik delen Vi starter med at importere nogle forskellige moduler som vi skal bruge til senere. import random import operator Her definere vi mat() som vi skal bruge senere. def mat(): Vi starter med en score på 0 11

score = 0 Vi siger at max score er 15, hvilket kan ændres vi det skal integreres ind i Snake. Hvis det er i snake må det så være max længden af slangen vi skal indsætte her. for i in range(15): Vi definere at rigtig på spørgsmål får man 1 point, og derefter printer vi det, hvis det er rigtigt. rigtig = sporgsmal() if rigtig: score += 1 print('rigtigt! :-)') print "Score",(score),"\n" Hvis det derimod ikke er rigtigt skriver den fejl og viser scoren. else: print('fejl! :-(') print "Score",(score), "\n" print 'Score {}/15'.format(score) Nu definferer vi spørgsmålet som der bliver stillet. def sporgsmal(): Svaret er forskellige fra spørgsmål til spørgsmål svar = randoma() guess = float(input()) return guess == svar Her definere vi hvad RandomA er, så vi kan få et regnestykke som skal besvares. def randoma(): Her siger vi at det kan være plus eller minus ops = {'+':operator.add, '-':operator.sub,} Her definere vi at det første tal skal være mellem 1 og 20, og det samme med andet tal. num1 = random.randint(1,3) num2 = random.randint(1,3) op = random.choice(list(ops.keys())) Nu henter den først om den har brugt plus eller minus, og derefter henter den tallene så den kan regne ud hvad svaret er. svar = ops.get(op)(num1,num2) Til sidst printer den svaret. print('hvad er {} {} {}?'.format(num1, op, num2)) return svar mat() 12

7.0 Test I vores test fungerede spillet egentligt fint nok, men vi havde bare et problem med at få koblet matematik-delen og snake-delen sammen. Vi besluttede at vi gerne ville have at når man fik indsamlet en bid, så ville der åbne et nyt vindue op, der indeholdte vores regnestykke-spørgsmål (addition, subtraktion), som man så skulle løse for at kunne fortsætte, men dette kunne vi ikke helt få til at virke. Derudover fungerede spillet som det skulle, og der var ingen problemer med at styre snake rundt i spillet, og matematikken var også overskuelig. Point-tavlen blev vist oppe i venstre hjørne af skærmen, hvilket også er det vi gerne ville have. Dog endte vi med at have 2 forskellige pointtavler, en for selve spillet, og en i matematik-vinduet. 8.0 Licens Til vores spil skal vi også have valgt en licens, hvor vi her vil kigge på to forskellige licenser, og hvad de hver især har af fordele og ulemper. 8.1 Kreditering-IkkeKommerciel DelPåSammeVilkår CC BY-NC-SA Licens Denne licens lader andre ændre og bygge videre på ens værk, så længe det er nonkommercielt og de husker at kreditere en, samt at de licensere afledte værker under samme vilkår. 8.1.1 Fordele En fordel ved denne licens er at det er muligt for andre at arbejde på værket, så det er muligt at spillet vil blive en vores færdige version af det. 8.1.2 Ulemper En ulempe for denne licens kommer ved at andre ikke må bygge videre på værket for at bruge det kommercielt. Det er en ulempe da det er et spil til læring og hvis folk ikke kan tjene på det, er der en mindre chance for at der er nogen der vil bygge videre på det, og gøre spillet et endnu bedre læringsspil. 8.2 Kreditering CC BY Denne licens lader andre distribuere, remix, tweake, og bygge videre på dit arbejde, også kommercielt, så længe de krediterer dig for det oprindelige værk. Dette er den mest imødekommende af de udbudte licenser. Anbefales til maksimal udbredelse og brug af licenseret materiale. 13

8.2.1 Fordele Fordelen ved denne licens er at man kan give andre udviklere muligheden for videreudvikle på spillet/produktet. Derudover bliver vi (som spilskabere) krediteret for det oprindelige værk. 8.2.2 Ulemper Ulempen ved denne licens er, at man næsten kan gøre hvad man vil, bare så længe at man husker at kreditere de oprindelige skabere. Hvis vi forestiller os at produktet skal kunne sælges, ville det betyde at de oprindelige skabere ikke vil kunne tjene penge på det videreudviklede produktet, selvom det er dem der har skabt grundlaget for det. 8.3 Vores Licens På baggrund af de 2 forskellige licenser foroven, og deres fordele og ulemper, har vi besluttet at anvende licensen der hedder: Kreditering-IkkeKommerciel DelPåSammeVilkår CC BY-NC-SA. Valget er primært baseret på at vi, som et evt. spilfirma, forestiller os at vi meget gerne skulle kunne tjene penge på spillet, og andres justeringer på spillet. Vi vil gerne have at andre skulle kunne forbedre spillet, samtidig med at vi tjener penge på det, da man plejer at lave produkter for at tjene penge. Intet er gratis, udover at trække vejret 9.0 Konklusion I opgaven Computerspil som vindue til læring skulle vi lave et positivt pædagogisk spil, vha. modulet Pygame. Vi valgte at vores målgruppe skulle være folkeskoleelever, der går i de deres første af skolen, altså elever fra 1. klasse til ca. 3 klasse. Som vores spil, valgte vi at lave det klassiske Snake spil, dog hvor man for at få point skal klare nogle simple regnestykker. Til Snake som man styrer valgte vi at bruge farven grøn, grå til det man skal samle ind og en hvid baggrund. I spillet er der også en sort pointtavle så man kan se ens score. Af informationsdesign i vores spil, har vi kun pointtavlen der viser ens scorer, og så det regnestykke man skal udregne for at få point, og da det var til forholdsvis nye folkeskoleelever er den tekst der er også simpel at læse. For at styre spillet bruger man piletasterne for at bevæge Snake rundt, og bruger tallene på tastaturet når man skal indskrive svaret for et regnestykke. Da det var Pygame modulet man skulle bruge til at skrive spillet i, har vi selvfølgelig benyttet os af det til at lave spillet. Vi startede også med at lave to prototyper af spillet, før vi blev færdige med den endelige version. 14

Prototype 1 fungerede ikke godt, da det var muligt at køre igennem siderne, og det bagerste af Snake ikke fulgte med. I den 2. prototype have lavet det så Snake ville kollidere med væggene og en selv, samt at Snakes bagende nu fulgte med. Vores Snake spil består af to dele. En del hvor vi har lavet kode for selve spillet, om hvordan man bevæger sig, styrer, hvordan man dør og lignende. Den andel var en matematik-del, hvor vi havde for hver gang man fik et point, kom der en skærm frem med regnestykke som man så skulle besvare, og hvis det var forkert ville man skulle starte forfra med spillet. Til vores test af spillet havde vi kun et enkelt problem, hvilket var at få vores Snake-del koblet sammen med matematik-delen, som vi havde svært ved at få til at fungere, men udover det fungerede spillet som det skulle, hvor det eneste fejl i spillet var, at der var både en pointtavle i spillet og i matematikvinduet. Vi skulle også vælge en licens til vores spil. Her valgte vi en licens der tillader andre at bygge videre på værket, så længde det er nonkommercielt, vi bliver krediteret og det nye værk bliver licenseret under samme vilkår. 10.0 Bilag 10.1 Kilder CREATIVE COMMONS, 2015. Om Licenserne. http://creativecommons.org/licenses/ [Besøgt 07-12-2015] 10.2 Brainstorm Folkeskoleelever Børnehave Gymnasieelever 10.2.1 Ideer til målgruppe 10.2.2 Ideer til spil Snake med matematik indblandet. Eventuelt kunne der stå i regnestykke i toppen af skærmen, også skulle man ramme det tal regnestykket giver. Halen er ens liv, bliver længere ved forkert svar, og kortere ved rigtigt. Regnestykkernes sværhedsgrad kunne stige efter hvor mange rigtige man har fået i træk, eller bare fået af rigtige overordnet. 15

10.3 Tidsplan 1. Indledning Markus 2. Krav Alle 2.1 Krav for program Alle 2.2 Faglige mål Alle 2.2.1 Informationsteknologi Ansvarsperso n Uge 47 Uge 48 Uge 49 Uge 50 Mikkel 2.2.2 Programmering Mikkel 2.2.3 Studieområdet Alle 3. Målgruppe Alle 4. Design Markus 4.1 Visuelt design Markus 4.2 Informationsdesign Markus 4.3 Interaktionsdesign Markus 4.3.1 Input Mikkel 4.3.2 Output Mikkel 4.4 Brugergrænseflade Joachim 5. Prototyper Joachim 5.1 Prototype 1 Joachim 5.2 Prototype 2 Joachim 6. Implementering Joachim 6.1 Kode for snake Joachim 6.2 Kode for matematik Joachim 7. Test Alle 8. Licens Mikkel 9. Konklusion Alle 9.1 Perspektivering Alle Korrekturlæsning Alle Vi arbejder på dele i den uge 16

10.4 Koden Snake import pygame, random, sys from pygame.locals import * from Tkinter import * def Tkinter(): toplevel = Toplevel() toplevel.title('window2') toplevel.focus_set() def collide(x1, x2, y1, y2, w1, w2, h1, h2): if x1+w1>x2 and x1<x2+w2 and y1+h1>y2 and y1<y2+h2:return True else:return False def die(screen, score): f=pygame.font.sysfont('arial', 40);t=f.render('Du fik '+str(score)+' point', True, (0, 0, 0));screen.blit(t, (10, 50));pygame.display.update();sys.exit(0) xs = [300, 300, 300, 300, 300];ys = [290, 270, 250, 230, 210];key = 0;score = 0;applepos = (random.randint(10, 590), random.randint(10, 590));pygame.init();s=pygame.display.set_mode((600, 600));pygame.display.set_caption('PlusSnake');appleimage = pygame.surface((20, 20));appleimage.fill((150, 150, 150));img = pygame.surface((20, 20));img.fill((102, 156, 31));f = pygame.font.sysfont('arial', 20);clock = pygame.time.clock() while True: clock.tick(12) for e in pygame.event.get(): if e.type == QUIT: sys.exit(0) elif e.type == KEYDOWN: if e.key == K_UP and key!= 0:key = 2 elif e.key == K_DOWN and key!= 2:key = 0 elif e.key == K_LEFT and key!= 1:key = 3 elif e.key == K_RIGHT and key!= 3:key = 1 q = len(xs)-2 while q >= 2: if collide(xs[0], xs[q], ys[0], ys[q], 20, 20, 20, 20):die(s, score) q-= 1 if collide(xs[0], applepos[0], ys[0], applepos[1], 20, 20, 20, 20):score+=1;xs.append(600);ys.append(600);applepos=(random.ra ndint(10,590),random.randint(10,590)) if xs[0] < 0 or xs[0] > 600 or ys[0] < 0 or ys[0] > 600: die(s, score) q = len(xs)-1 while q >= 1: xs[q] = xs[q-1];ys[q] = ys[q-1];q -= 1 if key==0:ys[0] += 20 17

elif key==1:xs[0] += 20 elif key==2:ys[0] -= 20 elif key==3:xs[0] -= 20 s.fill((255, 255, 255)) for q in range(0, len(xs)): s.blit(img, (xs[q], ys[q])) s.blit(appleimage, applepos);t=f.render(str(score), True, (0, 0, 0));s.blit(t, (10, 10));pygame.display.update() Matematik import random import operator def mat(): score = 0 for i in range(15): rigtig = sporgsmal() if rigtig: score += 1 print('rigtigt!') print "Score",(score),"\n" else: print('fejl!') print "Score",(score), "\n" print 'Score {}/15'.format(score) def sporgsmal(): svar = randoma() guess = float(input()) return guess == svar def randoma(): ops = {'+':operator.add, '-':operator.sub,} num1 = random.randint(1,3) num2 = random.randint(1,3) op = random.choice(list(ops.keys())) svar = ops.get(op)(num1,num2) print('hvad er {} {} {}?'.format(num1, op, num2)) return svar mat() 18